背景信息:我试图说服朋友切换到使用参数化查询来防止SQL注入和其他恶意企图,因为这是现在的标准,但他有这种心态& #34; 如果它没有被破坏,请不要修理它。"
这是他目前使用的代码:
function sql_safe($text) {
return str_replace("'", "''", $text);
}
我有没有办法打破这个功能,向他说明这种方法不再适用?我一直在尝试,但我不能自己打破它,所以现在我转向你们寻求帮助。
它被用作保护系统免受SQL注入的一般手段,以便正确转义用户输入。但我觉得他的做法可能会在我尚未想到的某些情况下突破。
答案 0 :(得分:3)
这是您的代码:
<?php
function sql_safe($text) {
return str_replace("'", "''", $text);
}
echo "SELECT * FROM db WHERE field = '" . sql_safe($argv[1]) . "';\n";
这是打破它的最明显方式:
$ php ./x.php "\' OR TRUE; -- MySQL"
SELECT * FROM db WHERE field = '\'' OR TRUE; -- MySQL';
多年来,Stack Overflow广泛涵盖了SQL注入的主题。请参阅示例Can I protect against SQL Injection by escaping single-quote and surrounding user input with single-quotes?。在那里有一个巧妙的技巧,即利用&#34;字符串的最大长度&#34;仅截断替换''
之一。