我通常使用此函数来清理表单输入,然后将它们存储到我的数据库中:
//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数据库中的数据的最佳方法是什么?这些数据是否仍需要清理?
答案 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);