用于清理Mysql数据库输入的函数

时间:2012-02-04 20:52:15

标签: php mysql sql-injection sanitization

我正在尝试将通用功能放在一起,以清理对Mysql数据库的输入。到目前为止,这就是我所拥有的:

function sanitize($input){
    if(get_magic_quotes_qpc($input)){

        $input = trim($input); // get rid of white space left and right
        $input = htmlentities($input); // convert symbols to html entities
        return $input;
    } else {

        $input = htmlentities($input); // convert symbols to html entities
        $input = addslashes($input); // server doesn't add slashes, so we will add them to escape ',",\,NULL
        $input = mysql_real_escape_string($input); // escapes \x00, \n, \r, \, ', " and \x1a
        return $input;
    }
}

如果我理解get_magic_quotes_qpc()的定义。这是由php服务器设置的,用于自动转义字符而不需要使用addslashes()

我是否正确使用了addslashes()mysql_real_escape_string(),还有其他任何可以添加以增加清理效果的内容。

由于

5 个答案:

答案 0 :(得分:28)

htmlentities()不需要为SQL提供安全数据。它在将数据值回显到HTML输出时使用,以避免XSS漏洞。这也是一个需要注意的重要安全问题,但它与SQL无关。

addslashes()与mysql_real_escape_string是多余的。您最终会在数据库中的字符串中使用文字反斜杠。

不要使用魔法引号。此功能已被弃用多年。不要将PHP代码部署到启用了魔术引号的环境中。如果已启用,请将其关闭。如果它是托管环境,并且他们不会关闭魔术引号,请获得新的托管服务提供商。

请勿使用ext/mysql。它不支持查询参数,事务或OO使用。

使用PDO,并使用prepared queries确保您的查询更安全。

有关编写安全SQL的更多详细信息,请阅读我的演示文稿SQL Injection Myths and Fallacies

答案 1 :(得分:5)

魔术引号为deprecated。如果可以,请关闭它们。)。

第二部分addslashesmysql_real_escape_String几乎完全相同(相似)。试试吧

addslashes( '\\')
// and
mysql_real_escape_string( '\\')

结果应该是\\,所以如果你使用

 mysql_real_escape_string( addslashes( '\\'))

您应该获得\\(或'\\\\'作为字符串)。仅使用mysql_real_escape_string(更好)或addslashes,而不是两者都使用。

我建议使用PDO代替原始函数和手动转义。

答案 2 :(得分:3)

为什么要在将数据保存到数据库之前应用htmlentities?如果您想将数据用于其他内容而不仅仅是将其写入浏览器,该怎么办?例如,搜索,分区数据,使用其他编程语言中的数据等...

你真正想要应用的唯一东西是mysql_real_escape_string(或使用PDO),没有别的。

我通常更喜欢完全取消魔术引号的效果。魔术引用只是繁琐的工作,应该永远不会被发明。这是PHP manual的一个片段来反转魔术引号:

if (get_magic_quotes_gpc()) {
    $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
    while (list($key, $val) = each($process)) {
        foreach ($val as $k => $v) {
            unset($process[$key][$k]);
            if (is_array($v)) {
                $process[$key][stripslashes($k)] = $v;
                $process[] = &$process[$key][stripslashes($k)];
            } else {
                $process[$key][stripslashes($k)] = stripslashes($v);
            }
        }
    }
    unset($process);
}

答案 3 :(得分:0)

无论使用什么功能,添加斜杠都不会清理任何东西最糟糕的部分。
它根本不应该用于任何“消毒”的手段。

斜杠不会“清理”数据。斜杠只会转义字符串分隔符。因此,您可以谈论的唯一消毒是逃避和引用

否则,如果您不在“已消毒”字符串旁边加引号,则根本不会受到任何保护。

答案 4 :(得分:-4)

使用:

mysql_real_escape_string()

这样可以防止像DROP TABLE这样的坏数据;)