Php 即使变量被转义,SQL注入也是如此
只有当我的查询看起来像下面的示例时,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;“显示表格”不起作用,对吗 我的网站先后被黑客多次入侵
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));