我打算制作一个允许用户在我的网站上发布整个网页的网络应用。我正在考虑使用HTML Purifier,但我不确定,因为HTML Purifier编辑了HTLM,重要的是保持HTML的发布方式。所以我正在考虑制作一些正则表达式来摆脱所有脚本标签和所有javascript属性,如onload,onclick等。
我前段时间看过一段谷歌视频,它有一个解决方案。他们的解决方案是使用其他网站发布javascript,因此无法访问原始网站。但我不想为此购买新的域名。
答案 0 :(得分:5)
小心自制的正则表达式这种事情
像
这样的正则表达式s/(<.*?)onClick=['"].*?['"](.*?>)/$1 $3/
看起来它可能会摆脱onclick事件,但你可以用
来规避它<a onClick<a onClick="malicious()">="malicious()">
运行正则表达式会得到类似
的东西<a onClick ="malicious()">
你可以通过在该字符串上重复运行正则表达式来修复它,直到它不匹配,但这只是一个简单的正则表达式清理程序是多么容易的例子。
答案 1 :(得分:4)
人们在执行此操作时所犯的最严重错误是验证输入上的内容。
相反,您应该在显示屏上验证 。
在确定什么是XSS以及什么不是XSS时,上下文很重要。因此,您可以愉快地接受任何输入,只要在显示时通过适当的清洁功能即可。
当输入放在'<a href="HERE">
而不是<a>here!</a>
时,考虑构成'XSS'的内容会有所不同。
因此,您需要做的就是确保在您编写用户数据的任何时候,非常仔细地考虑您在哪里显示它,并确保它无法逃避您正在编写它的上下文
答案 2 :(得分:3)
确保用户内容不包含任何可能导致您的网页上运行Javascript的内容。
您可以使用HTML剥离功能来删除所有HTML标记(例如PHP中的strip_tags
),或使用其他类似工具。除了XSS之外,实际上有很多原因可以做到这一点。如果您有用户提交的内容,则需要确保它不会破坏网站布局。
我相信您只需使用当前域的子域来托管Javascript,您就可以获得与AJAX相同的安全性优势。但不是饼干。
在您的具体情况下,过滤掉<script>
代码和Javascript操作可能是您最好的选择。
答案 3 :(得分:3)
如果您可以找到任何其他方式让用户发布内容,而不涉及HTML,请执行此操作。您可以使用大量用户端光标系统来生成HTML。
所以我正在考虑制作一些正则表达式来摆脱所有脚本标签和所有javascript属性,如onload,onclick等。
算了。您无法以任何有用的方式使用正则表达式处理HTML。更不用说在涉及安全问题时,攻击者可能故意向你投掷格式错误的标记。
如果您可以说服您的用户输入XHTML,那么解析起来会容易得多。您仍然无法使用正则表达式执行此操作,但您可以将其放入一个简单的XML解析器中,并遍历生成的节点树以检查每个元素和属性是否已知,并删除任何不是,然后重新-serialise。
HTML Purifier编辑HTLM,重要的是保持HTML的发布方式。
为什么?
如果是这样他们可以用原始形式进行编辑,那么答案只是在浏览器显示的路上进行净化,在提交时的路上 not
如果必须让用户输入他们自己的自由格式HTML - 并且通常我会反对它 - 那么HTML Purifier,采用白名单方法(禁止所有元素/属性不是'已知 - 安全)与它一样好。这非常非常复杂,你可能不得不在发现黑客时保持最新状态,但是在你要用正则表达式攻击自己的任何东西之前它都是街道。
但我不想为此购买新域名。
只要任何身份验证令牌(特别是Cookie)无法在子域之间交叉,您就可以使用子域。 (对于cookie,默认情况下它们不能作为域参数设置为当前主机名。)
您是否信任具有脚本功能的用户?如果不是不让他们拥有它,或者你将获得攻击脚本和iframe到俄罗斯的漏洞/恶意软件网站...
答案 4 :(得分:0)
1)使用干净的基于简单目录的URI来提供用户Feed数据。 确保在动态创建URI以解决用户上传的数据,服务帐户或域外的任何其他内容时,请确保不要将信息作为参数发布到URI。这是一个非常简单的操作点,可用于揭示服务器安全性中的缺陷,甚至可能将代码注入服务器。
2)修补您的服务器。 确保在服务器上运行的所有服务的所有最新安全修补程序上使服务器保持最新。
3)针对SQL注入采取所有可能的服务器端保护。 如果有人可以向您的SQL数据库注入代码,该代码可以从您的盒子上的服务执行,那个人将拥有您的盒子。此时,他们可以将恶意软件安装到您的网络服务器上,以便反馈给您的用户或从服务器发送简单记录数据并将其发送给恶意方。
4)强制所有新上传到受保护的沙盒区域以测试脚本执行。 无论您如何尝试从提交的代码中删除脚本标记,都有办法规避执行脚本的安全措施。浏览器很草率,做各种愚蠢的废话他们不应该这样做。在发布之前,请在安全区域测试您的提交内容以供公众使用。
5)检查提交的代码中的信标。 此步骤需要上一步,并且可能非常复杂,因为它可能出现在需要执行浏览器插件的脚本代码中,例如Action Script,但这也是允许JavaScript从用户提交的代码执行的漏洞。如果用户可以提交可以向第三方发出信号的代码,那么您的用户(可能还有您的服务器)完全会遭受恶意第三方的数据丢失。
答案 5 :(得分:0)
您应该过滤所有HTML并将仅列入安全和语义有用的标记和属性列入白名单。 WordPress很擅长这一点,我假设如果你搜索它们的源代码,你会发现WordPress使用的正则表达式。