Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 即使变量被转义,SQL注入也是如此_Php_Mysql_Sql_Mysqli_Sql Injection - Fatal编程技术网

Php 即使变量被转义,SQL注入也是如此

Php 即使变量被转义,SQL注入也是如此,php,mysql,sql,mysqli,sql-injection,Php,Mysql,Sql,Mysqli,Sql Injection,只有当我的查询看起来像下面的示例时,sql注入才会起作用 SELECT * FROM login WHERE id = $my_id_va; 假设我的查询是 SELECT * FROM login WHERE id = $my_id_va ORDER BY id DESC 然后我将得到以下错误 1064-您的SQL语法有错误;检查手册 对应于您的MySQL服务器版本,以便使用正确的语法 第1行“按id说明订购”附近 所以,这个1或1=1;“显示表格”不起作用,对吗 我的网站先后被黑客多次入侵

只有当我的查询看起来像下面的示例时,sql注入才会起作用

SELECT * FROM login WHERE id = $my_id_va;
假设我的查询是

SELECT * FROM login WHERE id = $my_id_va ORDER BY id DESC
然后我将得到以下错误

1064-您的SQL语法有错误;检查手册 对应于您的MySQL服务器版本,以便使用正确的语法 第1行“按id说明订购”附近

所以,这个1或1=1;“显示表格”不起作用,对吗

我的网站先后被黑客多次入侵

我想要一个快速的答案:当我的查询看起来像下面的一个,他们可以用什么方式或什么类型的查询来攻击我的网站

在下面的查询中,执行show表的方法是什么

SELECT * FROM login WHERE id = $my_id_va ORDER BY id DESC
我还使用转义函数来处理查询字符串值,比如mysql\u real\u escape\u string$my\u id\u va。是的,显然这是针对单个相关的黑客,但不确定

再加一些

SELECT EventActuallyCharged, EventDate FROM tblevent WHERE EventDate between '2011-07-21 or 1=1; SHOW TABLES --' and '2011-07-31' ORDER BY EventDate DESC

但“显示未工作的表”

如果您使用的是PHP5,请使用参数化查询,使用PDO。

1或1=1是正确的;SHOW TABLES将给出语法错误,但这将起作用:

1 or 1=1 --
注释结束查询的其余部分

在您的情况下,该值是一个整数,因此您可以使用mysql\u real\u escape\u字符串来代替它。

如果您将$my\u id\u va设置为:

1或1=1;展示桌子-

-将注释掉命令的其余部分,从而有效地终止它

我不确定mysql\u real\u escape\u字符串对查询有什么影响。您应该做的是。

Int cast

如果id是一个数字,那么也可以对变量进行int转换。整数可以安全使用:

$x = (int)$yourInputVar;
$s = "select * from Table where id = $x";
mysql\u real\u escape\u字符串

如果您想传递字符串,您可以而且应该使用mysql\u real\u escape\u string,但此函数仅转义字符串中的字符。您仍然需要在字符串周围添加引号,因此:

 $x = mysql_real_escape_string('hello');
 $s = "select * from Table where id = $x";
。。将导致查询:从id=hello的表中选择*。这显然不是一个有效的查询,因为hello应该在引号中

将查询更改为:

 $x = mysql_real_escape_string('hello');
 $s = "select * from Table where id = '$x'";
。。一切正常。添加引号,mysql\u real\u escape\u字符串将处理字符串中的特殊字符(如果有)

参数

另一种解决方案是使用参数化查询。这可以通过使用MySQLi或PDO来完成。优点是您只告诉数据库变量应该插入的位置,而数据库自己负责转义

它还可能增加性能优势,因为这些查询可以在没有参数的情况下进行缓存,从而更有效地使用查询缓存。不过,在MySQL的当前版本中,这还不能真正起作用。

1。第一个查询以某种方式安全 2.第二个查询以某种方式安全 如果您不理解,请阅读文档


然而,正如其他人所说,如果将参数化查询与类(如或)一起使用,这将是非常安全的。

检查我的更新,显示表不工作,但常规查询工作正常usual@bharanikumarBs:你们不能在那个里用展示台。只需使用1或1=1-。这将从表中获取所有行。因此,如果使用mysql\u real\u escape\u字符串,则大于1或1=1-此恶意代码将不起作用know@bharanikumar是的,会的,因为你没有引用它。使用intval,就像我在回答中说的。你想让我们教你如何黑客,或者如何保护?您已经在使用mysql\u real\u escape\u string$my\u id\u va,它将转义所有特殊字符,以保护您免受大多数攻击。危害几乎为零。如果您想确保100%,那么使用PDO或MySQLi。然而,这种问题对我来说很难闻。@Shef:抱歉的是,我面临着控制问题,即使我使用了这些mysql\u real\u escape\u字符串,你的问题让我很生气,我不,我应该继续我的问题,否则我应该停止发布问题,你的评论真的很伤人,我从GolezTrol,domanokz,Mark Byers,Zach R,但是你只是说了些不好的话,对不起,我看到你到处都在评论为什么展示台不工作?你对它感兴趣吗?不工作,还是工作?你想要什么?我想知道,有哪些neg方法可以执行这个show table,这样我就可以理解,其他人也会尝试这种方式进行黑客攻击。好吧,干杯,
 $x = mysql_real_escape_string('hello');
 $s = "select * from Table where id = '$x'";
$sql = sprintf('SELECT * FROM login WHERE id = %d ORDER BY id DESC', mysql_real_escape_string($my_id_va));
$sql = sprintf("SELECT EventActuallyCharged, EventDate FROM tblevent WHERE EventDate BETWEEN '%s' AND '%s' ORDER BY EventDate DESC", 
             mysql_real_escape_string($start_date),
             mysql_real_escape_string($end_date));