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

4 回答 4

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);

于 2010-08-09T05:09:14.943 回答
1

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

男性不会患宫颈癌。

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

于 2010-08-09T05:10:45.117 回答
-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) 所有其他数据都需要另一种清理方式

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

于 2010-08-09T05:16:53.517 回答
-1

(我是stackoverflow的新手,所以我会以错误的方式解决这个问题/我的答案样式做得不好,请随时让我知道。)

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

示例:“Bcc:” (添加空格以便stackoverflow正确显示)

这不会从字符串中删除,稍后将替换为“密件抄送:”。

这是我的解决方案,但可能有更好的方法。如果有人知道我很想听听。

    $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);
于 2013-03-27T20:08:18.963 回答