2012-10-25 116 views
1

我知道这个话题已经被广泛讨论了,因为我已经阅读了超过15篇关于这个主题的文章,但仍然无法找到我的问题的答案。PHP消毒输入

我正在寻找一个函数来清理表单中的数据。绝对没有HTML是可以接受的,我该如何去转义所有的html实体,这样用户绝对不会注入任何东西?我不需要白名单,因为不允许输入HTML。

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

我想过HTML PurifierhtmLAWED但他们似乎太多,我想要做的事情。我只是建立一个花哨的preg_replace函数?

+0

这不就是为什么你应该消毒用户在HTML中显示之前提供的东西吗?也就是说:​​<?php echo htmlentities($ somethingUserGaveme); ?> – thatidiotguy

回答

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之类的东西,那将是愚蠢的。

+0

“传统浏览器有一些绝对令人困惑的bug”,你可以命名一个存在的和它的浏览器版本吗?我测试了我公司的电子商务网站,从ie6到那个时代的浏览器,所以我很有兴趣知道这一点。编辑:关于htmlspecialchars当然:) – Sammaye

+0

@Sammaye在过去有一段时间有ha.ckers.org/xss.html其中包括浏览器版本。现在它重定向到https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet,它不再列出浏览器版本。也许尝试waybackmachine.org找到它。我的下巴第一次下降,我看到了dword编码... – goat

+0

该死的我得尝试其中的一些,谢谢!虽然htmlpurifier是如此缓慢和CPU消耗库:(,这是很难使用它的所有输入。 – Sammaye

0

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

0

我会说使用preg_replace,但你需要小心的口音和其他不常见的人物可以出现在一个人的名字。

0

Define sanitize:你想要转义尖括号还是要删除HTML标记?

为了逃避采取看看

htmlentities() 

要删除看看

strip_tags() 
+0

是否是strip_tags()足以阻止XSS? – mrc0der

+0

如果我没有记错,没有'strip_tags'有unicode编码的一些缺陷,有人会认为真正停止XSS的唯一方法是不要尝试删除,而是编码为'htmlspecialchars'或'htmlentities' – Sammaye

+0

为什么不'结合这两种方法?首先去掉所有的标签,然后运行htmlentities(),只是为了保存方... –

0

一个我喜欢使用,只需格式的所有HTML特殊字符以这样的方式从删除它们HTML页面的流程如下:

htmlspecialchars($string); 

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

0

怎么样寻找到PHP的数据过滤,http://php.net/manual/en/book.filter.php

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

如果你真的想要一个坚实和安全的库,检查了OWASP的ESAPI对于PHP

不要写你自己的安全控制!当涉及到为每个Web应用程序或Web服务开发安全控制时重新创建轮子会导致浪费时间和大量安全漏洞。 OWASP Enterprise Security API(ESAPI)工具包可帮助软件开发人员防范与安全相关的设计和实施缺陷。