我正在尝试将通用功能放在一起,以清理对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()
,还有其他任何可以添加以增加清理效果的内容。
由于
答案 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。如果可以,请关闭它们。)。
第二部分addslashes
和mysql_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这样的坏数据;)