我目前正在使用PHP(具体来说是LAMP)构建电子邮件模板网站,该网站允许用户粘贴HTML电子邮件代码,然后将其发送给客户。
显然,在处理此类数据时,我需要实现某种XSS安全性。数周以来,我一直在努力寻找解决方案,发现很少有好的方法,但是它们不能真正用于完整的HTML文档(这就是我要处理的内容)。
这些是我找到的解决方案,以及为什么它们对我不起作用:
HTMLPurifier :
我认为对于大多数人来说,这是显而易见的选择,因为它具有最佳的安全性,并且符合行业标准。尽管它的主要用途应该是用于HTML片段/小片段,但我想我还是会尝试一下。
我遇到的第一个问题是头部标签(以及其中的任何东西)被剥夺并被移除。头在HTML电子邮件中非常重要,因此我必须找到解决方法...不幸的是,我唯一能找到的解决方法是将头与电子邮件的其余部分分开,并通过HTMLPurifier分别运行每个部分。
我还没有尝试过,因为它看起来很hacky,但这似乎是实现我所追求的唯一方法。我也不确定HTMLPurifier在CSS中找到XSS的能力。最重要的是,它这么大的库在性能方面表现不佳。
HTMLawed
:HTMLawed似乎是另一个不错的选择,但是有一些事情使我无法使用它。
A)与HTMLPurifier相比,这似乎不太安全。 HTMLawed目前有一些已记录在案的安全性问题。它也没有被广泛使用,而这更令人担忧(仅大约10家注册公司使用了。)
B)它是根据GPL / GPU许可发布的,这实际上意味着除非愿意让人们免费使用我的服务,否则我无法在我的网站上使用它。
C)从我所看到的人们谈论它的角度来看,除非对其进行大量配置,否则似乎会剥离很多标签。我在这里没有太多发言权,因为我还没有尝试过,但这也给我带来了安全隐患-如果我错过了什么该怎么办?如果我无法对其进行配置以保留所需元素怎么办?等
这些是我要问的问题:
答案 0 :(得分:-2)
似乎您正在发送HTML内容。因此,您将无法过滤它们。您必须将HTML存储在数据库中。如果使用XSS证明过滤它们,则HTML将无法正常工作。默认情况下,所有Webmail服务默认都会禁用Javascript,例如GMail,Yahoo,Roundcube等。
如果您使用像CKEditor这样的WYSIWYG,它将自动删除所有<script>
标签以及某些未知属性。但是您仍然可以通过CKEditor.config()
将其设置为接受和删除的内容。
如果PHP由于某些特殊字符而无法插入数据库,则可以使用SQL prepare语句或使用base64_encode()
将HTML输入编码为base64,然后在mail()
中使用时对其进行解码,或者PHPMailer::Body
。