如果插入用户输入而不修改SQL查询,则应用程序容易受到SQL注入的攻击,如下例所示:
$unsafe_variable = $_POST['user_input'];
mysql_query("INSERT INTO `table` (`column`) VALUES ('$unsafe_variable')");
Run Code Online (Sandbox Code Playgroud)
这是因为用户可以输入类似的内容value'); DROP TABLE table;--,查询变为:
INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')
Run Code Online (Sandbox Code Playgroud)
可以采取哪些措施来防止这种情况发生?
即使使用mysql_real_escape_string()函数,是否存在SQL注入的可能性?
考虑这个示例情况.SQL是用PHP构造的,如下所示:
$login = mysql_real_escape_string(GetFromPost('login'));
$password = mysql_real_escape_string(GetFromPost('password'));
$sql = "SELECT * FROM table WHERE login='$login' AND password='$password'";
Run Code Online (Sandbox Code Playgroud)
我听过很多人对我说,这样的代码仍然很危险,即使使用了mysql_real_escape_string()函数也可以破解.但我想不出任何可能的漏洞?
像这样的经典注射:
aaa' OR 1=1 --
Run Code Online (Sandbox Code Playgroud)
不工作.
你知道任何可能通过上面的PHP代码注入的注入吗?
在我的本地/开发环境中,MySQLi查询执行正常.但是,当我在我的Web主机环境中上传它时,我收到此错误:
致命错误:在...中的非对象上调用成员函数bind_param()
这是代码:
global $mysqli;
$stmt = $mysqli->prepare("SELECT id, description FROM tbl_page_answer_category WHERE cur_own_id = ?");
$stmt->bind_param('i', $cur_id);
$stmt->execute();
$stmt->bind_result($uid, $desc);
Run Code Online (Sandbox Code Playgroud)
为了检查我的查询,我试图通过控制面板phpMyAdmin执行查询,结果是OK.
我在数据库端有什么需要做的,还是只是改变的php?我可以用mysqli函数代替mysql函数吗?还有什么我应该知道的吗?
如果我使用这样的代码:
$update_result = mysqli_query( $link , $sql_update_login ) or die ('Unable to execute query. '. mysqli_error($link));
Run Code Online (Sandbox Code Playgroud)
它是否必须死亡或者您之后可以提出不同的查询?就像将错误日志写入另一个表的预定函数一样?如:
$update_result = mysqli_query( $link , $sql_update_login ) or function('$query, $error);
Run Code Online (Sandbox Code Playgroud)
'或'之后的其他选项有哪些?我没有在文档中找到它,任何线索都表示赞赏.
因此,当MYSQL被弃用并且eveyone不断告诉我更新时,我认为这是我的时间.
但是因为我不习惯mysqli_*,这对我来说似乎很陌生.当我在Mysql中编写整个站点时,这不是一个简单的编辑.
所以我想知道:我如何将下面的代码转换成Mysqli?在处理查询数据库时,只是给我和其他任何人一个很好的起点.
$sql_follows="SELECT * FROM friends WHERE user1_id=".$_SESSION['id']." AND status=2 OR user2_id=".$_SESSION['id']." AND status=2";
$query_follows=mysql_query($sql_follows) or die("Error finding friendships");
if($query_follows>0){
}
Run Code Online (Sandbox Code Playgroud)
编辑:在阅读和编辑我的整个网站时,上面的代码转换为MYSQLI_将会是这样的..
$Your_SQL_query_variable= mysqli_query($connectionvariable,"SELECT * FROM friends WHERE user1_id=".$_SESSION['id']." AND status=2 OR user2_id=".$_SESSION['id']." AND status=2")) {
printf("Error: %s\n", $mysqli->error);
}
Run Code Online (Sandbox Code Playgroud) 我想从MySQL切换到MySQLi,但我有一个非常大的网站.
我读到https://wikis.oracle.com/display/mysql/Converting+to+MySQLi可以帮助我和我阅读如何将这个mysql更改为mysqli?.它说我可以用函数添加'i'替换大部分函数,并且我应该开始bughunting.
但是我的网站非常复杂和庞大,需要很长时间才能检查一切是否正常.那么:对于一个非常大的网站,从MySQL切换到MySQLi的最佳方法是什么?
谢谢!
我已经在这一个超过一个小时了,我可以连接到我的数据库和所有(没有给出任何错误)但是当我尝试使用"mysql_query($ query);"时我收到以下错误
Call to undefined function mysql_query()
Run Code Online (Sandbox Code Playgroud)
我已经尝试过启用:
extension=php_mysql.dll
extension=php_mysqli.dll
Run Code Online (Sandbox Code Playgroud)
而且我补充说:
extension_dir = "ext"
extension=php_mysql.dll
Run Code Online (Sandbox Code Playgroud)
在导入列表的末尾.
在我所做的每一次更改之间,我重新启动了exampp中的所有进程,并且在我单独尝试它的每个解决方案之后仍然会出现这个恼人的错误.
我试过在网上看,但唯一类似于我的错误是:
Call to undefined function mysql_connect()
Run Code Online (Sandbox Code Playgroud)
在任何一点上我都没有任何问题,从未见过它.
我在这里问它是因为我在谷歌搜索结果上发了垃圾邮件,上面的问题; 不是我拥有的那个.
如果有人可以帮助我,我会很高兴,我在网上找到的教程显示了我写的完全相同的代码.
我有一些这样的php代码:
$row = mysql_fetch_array ( mysql_query("SELECT * FROM `tblFacilityHrs` WHERE `uid` = '$uid'"));
Run Code Online (Sandbox Code Playgroud)
我现在正尝试将其转换mysqli_fetch_array为此处所示的http://php.net/manual/en/mysqli-result.fetch-array.php(示例1面向对象样式)
我不确定“ $ result”示例的含义。
到目前为止,这是我将代码转换为的内容:
<?php
include('../config.php');
if (isset($_GET['uid']) ) {
$uid = $_GET['uid'];
$id = $_GET['id'];
if (isset($_POST['submitted'])) {
foreach($_POST AS $key => $value) { $_POST[$key] = mysqli_real_escape_string($value); }
//Query for tblFacilityHrs
$sql = " UPDATE tblFacilityHrs SET `title`='{$_POST['title']}',`description`='{$_POST['description']}' WHERE `uid` = '$uid' ";
$result = $mysqli->query($sql) or die($mysqli->error);
//Query for tblFacilityHrsDateTimes
$sql2 = "UPDATE tblFacilityHrsDateTimes SET `startEventDate`='{$_POST['startEventDate']}',`endEventDate`='{$_POST['endEventDate']}', `startTime`='{$_POST['startTime']}',`endTime`='{$_POST['endTime']}',`days`='{$_POST['days']}',`recurrence`='{$_POST['recurrence']},`finalDate`='{$_POST['finalDate']}' WHERE `id` = …Run Code Online (Sandbox Code Playgroud) 我正在使用以下 php 代码来检查 MySQL 连接数
$connection=mysql_connect("localhost","$mysql_user","$mysql_pwd");
if (mysqli_connect_errno())
{ echo "NO CONNECTION"; }
else
{
unset ($result);
$result = mysql_list_processes($connection);
while ($row = mysql_fetch_assoc($result)){
$mysql_data[]=$row["db"];
}
mysql_free_result($result);
$n_connections=count($mysql_data)-1;
}
echo "$n_connections";
Run Code Online (Sandbox Code Playgroud)
由于 mysql_connect 在 PHP 5.5.0 中已被弃用,因此我将 $connection 更改为
$connection=mysqli_connect("localhost","$mysql_user","$mysql_pwd", "$mysql_db");
Run Code Online (Sandbox Code Playgroud)
进行此更改后,$n_connections 不再返回正确的值,代码中有什么问题?
谢谢
注意:php.net 中的 mysqli_list_processes 函数没有帮助,我尝试了它,但它不起作用。
注2:这篇文章不是“如何将mysql更改为mysqli?”的重复。,我的问题是替换“$result = mysql_list_processes($connection);”