繁体   English   中英

这个查询对 sql 注入安全吗?

[英]Is this query safe from sql injection?

该脚本在 PHP 中,作为数据库,我使用 MySQL。 这是脚本本身。

$unsafe_variable = $_GET["user-input"];
$sql=sprintf("INSERT INTO table (column) VALUES('%s')",$unsafe_variable);
mysql_query($sql);

有人说,如果用户分配;DROP TABLE blah; 字符串到变量 $unsafe_variable 它删除表。

但我试过这个例子,

http://localhost/test.php?user-input=DROP%20TABLE%20my_table 

但它没有删除表,而是在表中插入了一个新行(;DROP TABLE blah;)

有人能解释一下如何用 sql 注入攻击这个脚本吗?

这种特定的注入不起作用,因为 PHP 的mysql_query函数每次调用只允许一个查询。 但是,如果column具有主键或唯一键,则以下操作可能有效:

$unsafe_variable = "admin') ON DUPLICATE KEY UPDATE password=MD5(CONCAT('knownsalt', 'newpassword'))#";

最好使用冗长的mysql_real_escape_string函数:

$sql=sprintf("INSERT INTO table (column) VALUES(%s)",
             mysql_real_escape_string($unsafe_variable));
mysql_query($sql);

mysql_query()不允许在一个函数中执行多个查询。 所以你不能插入然后删除表。 但是你不应该依赖它作为“安全”。 改用参数化查询。 查看 PHP 的PDO库。

但是,他们几乎可以更改任何其他内容,例如可能从另一个表中选择密码字段作为子查询放入该表中,以便他们可以查看散列。

虽然mysql_query只允许执行一个查询,但通常这个查询是不安全的。 利用您的查询的危险输入的示例是:

'); DROP TABLE my_table; --

'); 在开始时将关闭您的查询并插入一个空值,但允许在 INSERT 之后执行其他查询。 然后在删除表后, --最后将标记所有其他内容(即查询的其余部分)作为注释。

为了安全地准备用于查询的输入,请使用mysql_real_escape_string

处理不安全变量的唯一方法是使用绑定参数。

请阅读此页面,了解如何防止来自bobby-tables.com 的SQL 注入

不,sprintf 不会逃避内容使用:

$unsafe_variable = mysql_real_escape_string($_GET["user-input"]);
$sql=sprintf("INSERT INTO table (column) VALUES('%s')",$unsafe_variable);
mysql_query($sql);
mysql_real_escape_string($unsafe_variable)

有人说,如果用户分配 ;DROP TABLE blah; 字符串到变量 $unsafe_variable 它删除表。

显然事实并非如此——但如果你不明白为什么,那么你就无法判断你的代码是否安全。 你要在这里张贴每一行来检查它是否安全吗?

无需详细解释上面的代码在做什么以及如何破坏它(SQL 注入已经在其他地方得到了很好的记录 - 尝试谷歌作为开始)你应该始终确保离开你的 PHP 代码的任何数据都是正确的表示它要去哪里。

对于 MySQL 数据库,这意味着:

1) 使用 mysql_real_escape_string 的输出(并确保您传递了正确的资源句柄)

或者

2)使用参数绑定。

对代码注入攻击的适当讨论很容易填满几百页——在 SO 查询中回答有点多。

C。

我认为您需要尝试的示例是http://localhost/test.php?user-input=';DROP%20TABLE%20my_table'

'); 关闭values('%s段,然后发出一个新命令, drop table...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM