[英]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
。
处理不安全变量的唯一方法是使用绑定参数。
不,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.