use*_*924 5 php sql sql-injection
$myq = sprintf("select user from table where user='%s'", $_POST["user"]);
Run Code Online (Sandbox Code Playgroud)
我想知道是否可以使用SQL注入利用上述查询.是否有任何高级SQL注入技术可以打破sprintf这个特定的查询?
Jon*_*eet 25
我不认为它需要特别先进...尝试输入
' OR 1 = 1 OR user='
Run Code Online (Sandbox Code Playgroud)
换句话说,你会得到以下SQL:
select user from table where user='' OR 1 = 1 OR user=''
Run Code Online (Sandbox Code Playgroud)
这看起来像你真正想要执行的查询吗?(现在考虑它可能会丢弃表,或类似的东西.)
底线是你应该使用参数化查询.
使用sprintf不会比使用简单的字符串连接更多地提供保护.优点sprintf是它比使用简单的PHP字符串连接时更具可读性.但是sprintf在使用%s格式时,除了简单的字符串连接之外不会做任何事情:
$str = implode('', range("\x00", "\xFF")); // string of characters from 0x00 – 0xFF
var_dump(sprintf("'%s'", $str) === "'".$str."'"); // true
Run Code Online (Sandbox Code Playgroud)
你需要使用逃避你想要插入数据的上下文特殊字符的函数(在这种情况下是MySQL中的字符串声明,假设你正在使用MySQL),如**mysql_real_escape_string**:
$myq = sprintf("select user from table where user='%s'", mysql_real_escape_string($_POST["user"]));
Run Code Online (Sandbox Code Playgroud)
是的,我会说你有潜在的问题:)
你需要逃避:\x00, \n, \r, \, ', "和\x1a.sprintf()不会这样做,sprintf()不对字符串进行修改,它只是根据您指定的格式将您提供的任何可变参数扩展到您提供的缓冲区中.
如果字符串ARE被转换,可能是由于魔术引号(如Rob在评论中所述),而不是sprintf().如果是这种情况,我强烈建议禁用它们.