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

Php 用于清理Mysql数据库输入的函数,php,mysql,sql-injection,sanitization,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

我试图将一个通用函数放在一起,它将清理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\u magic\u quotes\u qpc()
的定义。php服务器将其设置为自动转义字符,而无需使用
addslashes()

我是否正确地同时使用了
addslashes()
mysql\u real\u escape\u string()
,还有什么我可以添加的来增加消毒效果的吗


谢谢

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

你唯一真正想应用的是mysql\u real\u escape\u string(或use),而不是别的

我通常更喜欢完全撤销魔法引号的效果,总是这样。魔术语录的使用很麻烦,不应该被发明出来。下面是一段来自的代码片段,用于反转神奇的引号:

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);
}
神奇的引语是。如果可以,请关闭它们:)

第二部分
addslashes
mysql\u real\u escape\u String
做了几乎相同(类似)的事情。试试看

addslashes( '\\')
// and
mysql_real_escape_string( '\\')
结果应该是
\
,所以如果您使用

 mysql_real_escape_string( addslashes( '\\'))
您应该获得
\\
(或
'\\\\'
作为字符串)。仅使用mysql\u real\u escape\u string(更好)或
addslashes
,切勿同时使用

我建议使用,而不是原始函数和手动转义

使用:

mysql_real_escape_string()
这将防止错误数据,如DROP TABLE;)

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

addslashes()与mysql\u real\u escape\u字符串是冗余的。您将在数据库中的字符串中使用文字反斜杠

不要使用神奇的引号。此功能已被弃用多年。不要将PHP代码部署到启用了magic quotes的环境中。如果已启用,请将其关闭。如果这是一个托管环境,并且他们不会关闭magic quotes,那么就找一个新的托管提供商

不要使用
ext/mysql
。它不支持查询参数、事务或OO使用

更新:
ext/mysql
在PHP5.5.0(2013-06-20)中被弃用,在PHP7.0.0(2015-12-03)中被删除。你真的不能用它

使用,并通过使用使查询更安全


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

最糟糕的部分是添加斜杠并不能净化任何东西,无论使用了什么函数。
它不应该被用于任何“消毒”的手段

斜杠不会“清理”数据。斜杠仅转义字符串分隔符。因此,你能说的唯一的消毒方法就是逃避和引用


否则,如果您不在“净化”字符串周围加引号,您将完全没有保护。

组合尽可能多的转义函数不是一个好方法。您将得到三重转义数据,并且只能在html输出中使用它。mysql\u real\u escape\u string()不“防止坏数据”。但无论如何,您不能将此查询注入与mysql扩展一起使用