这个SQL注入不起作用,为什么?

时间:2014-07-23 05:39:48

标签: mysql sql-injection

我正在尝试一种SQL注入:

http://localhost/test/mysql.php?uid=1;%20DROP%20TABLE%20test

此网址应与语句相同:

SELECT username FROM test WHERE userid=1; DROP TABLE test

但是,当我打开此网址时会弹出一个错误:

Error:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'drop table test' at line 1

似乎'drop table test'被放入一对引号中,但不被视为声明。相应的PHP代码是这样的:

$SQL="select username from login where userid=".$userid;
$result=mysql_query($SQL);

我想知道原因。感谢您提供任何有用的答案。

4 个答案:

答案 0 :(得分:3)

mysql_query不支持一次执行多个语句:

  

mysql_query() 向服务器上当前活动的数据库发送唯一查询(不支持多个查询),该数据库与指定的 {{1}相关联}

这也反映在MySQL错误消息中,它将link_identifier之后的所有内容引用为意外。

答案 1 :(得分:1)

Mysql不支持多个查询执行

如果你愿意,你只需要将标志65536作为mysql_connect的第5个参数传递。该标志在 MySQL Client flags 中定义。

#define CLIENT_MULTI_STATEMENTS 65536 /* Enable/disable multi-stmt support */
#define CLIENT_MULTI_RESULTS 131072 /* Enable/disable multi-results */

mysql_connect()应该为此做好准备:

mysql_connect($host, $username, $password, false, 65536);

警告:

  • 您将获得第一个查询的mysql_query($ query)结果 仅在给定的$查询中。您可以尝试连接131072 65536获得多个结果。
  • 这不适用于PHP< 4.3.0
  • 如果在php.ini
  • 中将sql.safe_mode设置为1,则无效

答案 2 :(得分:0)

尝试回显SQL变量以查看问题所在。

答案 3 :(得分:0)

这很简单,你应该首先解析uid = 1,它应该是整数,或者在任何其他情况下,如果它是字符串,那么你必须根据db中的列名来限制它来检查uid的长度。