Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 清理没有mysql\u real\u escape\u字符串的联系人表单_Php_Security_Forms_Sanitize_Contact Form - Fatal编程技术网

Php 清理没有mysql\u real\u escape\u字符串的联系人表单

Php 清理没有mysql\u real\u escape\u字符串的联系人表单,php,security,forms,sanitize,contact-form,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

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

//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\u real\u escape\u string
需要一个数据库连接,因为我只是在将数据存储到数据库之前清理数据时才使用它

我尝试在联系人表单上使用该功能,但出现了“无法建立到服务器的链接”错误。我可以连接到数据库,但没有必要,因为我只是试图在数据通过联系人表单发送到电子邮件之前对其进行清理

清理未存储在mysql数据库中的数据的最佳方法是什么?这些数据是否仍需要清理

使用
filter\u var()

例如,如果您要清理电子邮件:

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

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

是enogth

使用
mysql\u real\u escape\u string
清理数据的目的是避免SQL注入。如果您没有使用SQL,那么您已经免疫了

男人不会得宫颈癌


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

整个概念是错误的。 此功能不适用于电子邮件,甚至不适用于数据库

mysql\u real\u escape\u字符串不“清理”任何内容。它仅仅是转义分隔符,而不是别的。如果数据中有分隔符,为了防止语法错误:

SELECT * FROM table WHERE name = 'it's me' # error!
转义数据后,您的数据将成为
“是我”
,并且没有错误。
因此,此函数仅适用于SQL查询和数据,仅括在引号中

因此,在没有引号的情况下只使用mysql\u real\u escape\u字符串是没有意义的。应使用mysql\u real\u escape\u字符串
a) 独自一人。修剪或条纹斜线之类的东西在这里没有任何关系
b) 就在查询字符串组合之前,而不是其他位置
c) 仅包含将用引号括起来的数据。
d) 所有其他数据都需要另一种消毒方法

至于电子邮件,你不需要任何消毒,只要以明文形式发送即可。 您必须采取的唯一预防措施是防止邮件注入 不过没什么大不了的。只需将用户输入放入消息体即可。不进入主题、进入或来自或任何其他标题。仅邮件正文。你是安全的(我是stackoverflow的新手,所以我走错了方向/我的答案的样式做得不好请随时告诉我。)

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

示例:B;c;c;:;“(添加空格以正确显示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);

mysql\u real\u escape\u string独自一人没有任何帮助什么?始终使用卫生设备。永远不要相信用户的输入。此类建议假设a)无法将不同的头插入脚本(如果您没有清理输入,如何确定?)和b)即使使用文本/纯文本头,所有邮件客户端也会做正确的事情。我很怀疑。@Cfreak这里唯一合理的一点是关于一些奇怪的邮件客户端。有一个例子吗?但你“从不相信用户输入”的无意识祈祷确实很有趣。为什么不在评判别人之前先获得一些经验呢?请问你的意思是什么?他们太多了