PHP消毒输入

时间:2012-10-25 14:55:42

标签: php mongodb sanitize

我知道这个话题已经进行了相当广泛的讨论,因为我已经阅读了超过15篇关于这个主题的帖子,但仍无法找到我的问题的答案。

我正在寻找一种从表单中清理数据的功能。因为绝对没有HTML是可以接受的,我如何去逃避所有html实体,以便用户绝对不能注入任何东西?我不需要白名单,因为不允许输入HTML。

此外,没有必要运行mysql_real_escape_string,因为我没有使用MySQL数据库。我使用MongoDB。我只是存储名字,姓氏,电话号码,基本内容。没有HTML。但是我仍然不希望用户能够输入<script>whatever</script>作为他们的名字,当它显示回来时,它会解析它。

我想到了HTML PurifierhtmLAWED,但它们似乎对我想做的事情太过分了。我只是构建一个花哨的preg_replace函数吗?

7 个答案:

答案 0 :(得分:2)

没有通用的“安全”过滤器。字符串只有放入特定的上下文时才会有危险。

例如,如果上下文是纯文本文档,您实际上并不担心。

如果上下文是文本节点(不在尖括号内),

htmlspecialchars就足够了。指定正确的字符集/编码,即服务器发送的http标头中的字符集/编码。

确定

   <p><?= htmlspecialchars($input, ENT_QUOTES, 'UTF-8'); ?></p>

但是,如果你需要在尖括号内输出,使上下文类似于html属性,如:

<p <?= htmlspecialchars($input, ENT_QUOTES, 'UTF-8'); ?>   ></p>
or
<p title="<?= htmlspecialchars($input, ENT_QUOTES, 'UTF-8'); ?>"   ></p>

在许多情况下,“使其安全”任务变得非常困难(传统浏览器有一些绝对令人困惑的错误,无视软件开发人员的共同期望)。如果不站在巨人的肩膀上并使用像htmlpurifier这样的东西,那将是愚蠢的。

答案 1 :(得分:0)

我不是这方面的专家,但你不能只是str_replace尖括号吗?

答案 2 :(得分:0)

我想说使用preg_replace但你需要注意口音和其他不常见的字符,这些字符可以出现在一个人的名字中。

答案 3 :(得分:0)

定义清理:是否要转义尖括号或者是否要删除HTML标记?

要逃避,请查看

htmlentities() 

要删除,请查看

strip_tags()

答案 4 :(得分:0)

我喜欢使用它只是格式化所有HTML特殊字符,以便从HTML页面流中删除它们:

htmlspecialchars($string);

它永远不会让我失望,解决了必须使用复杂和缓慢的替换功能等,这也意味着用户可以在他们的用户名或评论等使用>而不删除它(即一个非常有效的用户名在互联网是>3)。

答案 5 :(得分:0)

如何研究PHP的数据过滤,http://php.net/manual/en/book.filter.php

Sanatize:http://php.net/manual/en/filter.filters.sanitize.php

如果您真的想要一个可靠且安全的库,请查看OWASP的PHP ESAPI

  

不要编写自己的安全控件!在为每个Web应用程序或Web服务开发安全控件时重新发明轮子会导致浪费时间和大量安全漏洞。 OWASP企业安全API(ESAPI)工具包可帮助软件开发人员防范与安全相关的设计和实现缺陷。

答案 6 :(得分:0)

使用php 5.3的filter_input http://php.net/manual/en/function.filter-input.php

$ string = filter_input(INPUT_POST,'string',FILTER_SANITIZE_SPECIAL_CHARS);

这与$ _POST ['string']非常相似,但内置更清晰。