SQL-安全方法

SQL-safe method

上下文: 我正试图说服朋友改用参数化查询来防止 SQL 注入和其他恶意尝试,因为这是当今的标准但他的心态是“没坏就别修

这是他目前使用的代码:

function sql_safe($text) {
    return str_replace("'", "''", $text);
}

有没有办法让我打破这个功能,向他说明这种做法不再可取?

附加信息

它被用作保护系统免受 SQL 注入的一般手段,以便正确转义用户输入。但我觉得他的方法在某些我还没有弄清楚的情况下可能会失败。

这是您的代码:

<?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? 。那里有一个巧妙的技巧,利用 "maximum length of string" 只截断一个替换 ''s.