不使用mysql_real_escape_string函数对联系表单进行清理处理

7

在将表单输入存储到数据库之前,我通常使用此功能来清理表单输入:

//Function to sanitize values received from the form. Prevents SQL injection
function clean($str) {
    $str = @trim($str);
    if(get_magic_quotes_gpc()) {
        $str = stripslashes($str);
    }
    return mysql_real_escape_string($str);
}

直到今天我才意识到mysql_real_escape_string需要一个数据库连接,因为我只在将数据存储到数据库之前清理数据时使用它。
我尝试在联系表单上使用该函数,但出现了“无法建立与服务器的链接”的错误。虽然我可以连接到数据库,但没有必要,因为我只是在通过联系表单将数据发送到我的电子邮件之前对其进行清理。
如何最好地清理未存储在mysql数据库中的数据?这些数据是否仍需要进行清理?
4个回答

15

使用filter_var()函数

http://php.net/manual/zh/function.filter-var.php

例如,如果要对电子邮件进行净化:

$_POST['email'] =    filter_var($_POST['email'], FILTER_SANITIZE_EMAIL); 

发送消息

$_POST['message'] = filter_var($_POST['message'], FILTER_SANITIZE_STRING);

足够了


你指的是哪些特定的过滤器,请问?有很多种。 - Your Common Sense

1

使用mysql_real_escape_string对数据进行清理的目的是为了避免SQL注入。如果您不使用SQL,那么您已经免疫了。

男性不会患宫颈癌。

使用适合需要避免的特殊字符的清理函数。理想情况下,不要剥离不会造成伤害的内容。


mysql_real_escape_string 单独并不能起到什么作用。 - Your Common Sense

-1
整个概念是错误的。 这个函数对电子邮件和数据库都没有帮助。
mysql_real_escape_string并不会“清理”任何东西。它只是转义分隔符,仅此而已。只是为了防止数据中有分隔符导致语法错误:
SELECT * FROM table WHERE name = 'it's me' # error!

在数据被转义后,您的数据变成了'it\'s me',并且没有错误。
因此,此函数仅适用于SQL查询和仅包含在引号中的数据

因此,如果没有引号,仅执行mysql_real_escape_string是没有意义的。mysql_real_escape_string应该使用:
a)单独使用。例如trim或stripslashes与此无关
b)在组合查询字符串之前而不是其他地方
c)仅与将要包含在引号中的数据一起使用。
d)所有其他数据需要另外的净化方式

至于电子邮件,如果您将其作为纯文本发送,则不需要进行任何净化。 您唯一需要注意的是防止邮件注入
不过这没什么大不了的。只需将用户输入放入消息正文即可。不要放入主题、收件人、发件人或任何其他标题。仅限于消息正文。这样就安全了


什么?始终要使用卫生措施。永远不要相信用户的输入。这样的建议假定a)没有办法将不同的标题注入到脚本中(如果您没有对输入进行净化,您怎么确定呢?)和b)即使使用text/plain标题,所有邮件客户端都会正确处理。我非常怀疑这一点。 - Cfreak
@Cfreak 这里唯一有意义的观点是关于一些奇怪的邮件客户端。有例子吗?但你“永远不相信用户输入”的毫无头脑的祈祷确实很有趣。为什么不在评判他人之前先积累一些经验呢? - Your Common Sense

-1

我是stackoverflow的新手,如果我的回答样式有错/做得不好,请随时告诉我。

如果我理解有误,欢迎纠正,因为我现在也遇到了同样的问题。但是我认为接受的答案使用filter_var不足以防止攻击者使用Unicode绕过此筛选。

例如:"& #66;& #99;& #99;& #58;"(添加空格以便stackoverflow正确显示)

这不会从字符串中删除,并且稍后将被替换为"Bcc:"。

这是我的解决方案,但可能还有更好的方法。 如果有人知道更好的方式,请告诉我。

    $string = str_replace("&", "(and)", $string);
    $string = str_replace("#", "(num)", $string);
    $string = str_replace(";", "(semi-colon)", $string);
    $string = str_replace(":", "(colon)", $string);
    $string = str_replace("@", "(at)", $string);
    $string = str_replace("\\", "(backslash)", $string);
    $string = filter_var($string, FILTER_SANITIZE_STRING);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接