我目前正在开发一个内容生成器,我有一些对象允许用户向页面添加自定义脚本。
我很担心我的插件的预览。页面无法保存在预览中,但如果我允许他使用动态添加的javascript,用户是否可以永久地弄乱我的预览页面?
我还想提一下,javascript是通过AJAX发送到php文件,然后附加到正文。
答案 0 :(得分:1)
页面无法保存在预览中,但是如果我允许他使用动态添加的javascript,用户是否可以永久地弄乱我的预览页面?
不永久,不。他只能弄乱自己当前的页面。
如果自定义脚本和页面不会离开客户端的计算机,或者您可以确保它们不会被提供给其他人(这意味着它们不会存储在服务器上)那么你就可以从XSS attacks安全了。
然而,请注意,只要您的插件离开"预览"并且您允许保存向其他访问者显示的页面,将出现该问题。
答案 1 :(得分:0)
是的,这是一个名为Cross Site Scripting(XSS)的大型攻击媒介。除非绝对必须,否则不应在任意页面上运行用户提供的JavaScript。
例如,我可以添加:
document.body.style.display = 'none';
这会隐藏整个页面。
答案 2 :(得分:0)
虽然您的脚本仅向当前用户显示,但您的网页可能容易受到Cross Site Scripting攻击。在这种情况下处理它的方式(因为你允许脚本)是使用类似的机制来Cross Site Request Forgery预防(尽管CSRF和XSS完全不同)。
e.g。如果您的页面https://www.example.com/preview
显示发布到它的所有内容(HTML和脚本)(例如,假设POSt参数被称为content
),攻击者可能会在其页面上包含以下代码,然后诱使受害者在登录您的网站时访问它。
在www.evil.com
上: -
<form method="post" action="https://www.example.com/preview">
<input type="hidden" name="content" value="<script>alert('foo');</script>" />
</form>
此表单可以通过JavaScript(document.forms[0].submit()
)自动提交。
这将导致content
中的脚本在您的站点上下文中执行,可能会将用户会话的cookie值传递给www.evil.com
,而不是我的警告框的良性示例。
但是,当您使用AJAX将content
值发布到您自己的站点时,可以通过检查X-Requested-With
请求标头是否设置为XMLHttpRequest
来阻止此攻击。此标头cannot be POSTed cross domain(您的服务器未使用CORS同意此内容。)
另外,如果您的页面用于预览 - 如果您的预览无法保存,预览会是什么?如果这与您的完整保存功能相关,则可以允许用户通过在sandbox内运行输入的内容来安全地保存脚本。