我知道这个话题已经进行了相当广泛的讨论,因为我已经阅读了超过15篇关于这个主题的帖子,但仍无法找到我的问题的答案。
我正在寻找一种从表单中清理数据的功能。因为绝对没有HTML是可以接受的,我如何去逃避所有html实体,以便用户绝对不能注入任何东西?我不需要白名单,因为不允许输入HTML。
此外,没有必要运行mysql_real_escape_string,因为我没有使用MySQL数据库。我使用MongoDB。我只是存储名字,姓氏,电话号码,基本内容。没有HTML。但是我仍然不希望用户能够输入<script>whatever</script>
作为他们的名字,当它显示回来时,它会解析它。
我想到了HTML Purifier和htmLAWED,但它们似乎对我想做的事情太过分了。我只是构建一个花哨的preg_replace函数吗?
答案 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']非常相似,但内置更清晰。