在没有mysql_real_escape_string的情况下清理联系表单

时间:2010-08-09 05:06:50

标签: php security forms sanitize contact-form

我通常使用此函数来清理表单输入,然后将它们存储到我的数据库中:

//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 个答案:

答案 0 :(得分:15)

使用filter_var()

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

就像你想要清理电子邮件一样:

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

发送消息

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

是enogth

答案 1 :(得分:1)

使用mysql_real_escape_string清理数据的目的是避免SQL注入。如果您没有使用SQL,那么您已经免疫了。

男性不会患宫颈癌。

使用适合您需要避免的特殊字符的清理功能。理想情况下,不要剥掉不会造成伤害的东西。

答案 2 :(得分:-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)单独。修剪或条纹等东西在这里无关 b)在查询字符串编写之前,而不是在其他地方 c)仅包含用引号括起来的数据 d)所有其他数据需要另一种消毒方式

对于电子邮件,您不需要进行任何清理,而是将其作为纯文本发送。 您必须采取的唯一预防措施是反对邮件注入
不过没什么大不了的。只需将用户输入放入邮件正文中即可。不进入主题,进出或任何其他标题。仅消息正文。而且你很安全

答案 3 :(得分:-1)

(我是stackoverflow的新手,所以我的方法错了,做错的工作,我的回答的样式随时让我知道。)

如果我错了,请纠正我,因为我现在也处理同样的问题,但我不认为使用filter_var的接受答案是足够的,因为攻击者可以使用unicode绕过它。

示例:“Bcc:” (添加了空格,因此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);
相关问题