$myq = sprintf("select user from table where user='%s'", $_POST["user"]);我想知道是否可以使用SQL注入来利用上面的查询。对于这个特定的查询,有没有什么高级的SQL注入技术可以破坏sprintf?
发布于 2010-03-17 00:25:22
我不认为它需要特别先进...尝试输入
' OR 1 = 1 OR user='换句话说,你将得到SQL:
select user from table where user='' OR 1 = 1 OR user=''这看起来像是你真的想要执行的查询吗?(现在考虑它删除表的可能性,或者类似的东西。)
底线是您应该使用参数化查询。
发布于 2010-03-17 00:27:06
使用 的不会比使用简单的字符串连接提供更多的保护。与使用简单的sprintf字符串连接相比,PHP的优点只是更具可读性。但是在使用%s格式时,sprintf只做简单的字符串连接:
$str = implode('', range("\x00", "\xFF")); // string of characters from 0x00 – 0xFF
var_dump(sprintf("'%s'", $str) === "'".$str."'"); // true您需要使用转义要插入数据的上下文特殊字符的函数(在本例中是一个string declaration in MySQL,假设您使用的是MySQL),就像**mysql_real_escape_string**一样:
$myq = sprintf("select user from table where user='%s'", mysql_real_escape_string($_POST["user"]));发布于 2010-03-17 00:31:37
是的,我会说你有一个潜在的问题:)
You need to escape:\x00, \n, \r, \, ', "和\x1a。sprintf() does not do that,sprintf()不会修改字符串,它只是根据指定的格式,将您提供的变量参数扩展到您提供的缓冲区中。
如果字符串正在转换,很可能是由于magic quotes (正如Rob在注释中指出的),而不是sprintf()。如果是这种情况,我强烈建议禁用它们。
https://stackoverflow.com/questions/2456123
复制相似问题