【问题标题】:Javascript that prevents XSS防止 XSS 的 Javascript
【发布时间】:2026-01-07 07:25:02
【问题描述】:

有没有一种方法可以在用户尝试点击提交按钮之前通过 Javascript 自动格式化输入框以防止 XSS?

例如,在用户对文本框键入脚本攻击后,javascript 会自动将文本框中的值格式化为安全格式。

顺便说一句,我不只是依靠这个程序来防止 XSS,只是我们的客户群有一些短语会触发 ASP.Net 将其视为 XSS。这是确切的例子:

短语:OMY G<W TUBE/OVARY 将触发页面将此视为 XSS,而 OMY G< W TUBE/OVARY 不被视为潜在风险。

【问题讨论】:

  • 你能用 JavaScript 做 something 吗?当然,会有效吗?一点也不。使用这种漏洞利用的人可以轻松绕过您在 JavaScript 中输入的任何内容,以通过一两个控制台命令来阻止它。
  • 我已经预料到了这一点,但如果他们的文本中的单个更改可以让他们输入正确的值,那么我可以接受。我可以禁用页面验证并 htmlencode 进入系统的所有字符串,但我害怕冒这个风险。我宁愿让注入检查打开并帮助用户输入正确的方式。

标签: javascript xss


【解决方案1】:

不难,假设您可以准确找出触发 ASP.Net XSS 过滤器的原因。例如,这将修复您显示的案例:

<form id="form" onsubmit="fix()">
    <input id="textbox" />
    <input type="submit" />
</form>
<script>
    function fix() {
        var t = document.getElementById('textbox');
        t.value = t.value.replace(/<(\w)/, '< $1');
    }
</script>

请理解,此“解决方案”不会以任何方式阻止 XSS 攻击,也不会以任何方式验证输入。 XSS 攻击只能在服务器端被阻止。

【讨论】:

  • 不,不会。如果 JavaScript 被禁用,则将发送无效数据;此外,它仅“修复”通过此表单发送的内容。这不是向服务器提交数据的唯一方法(您可以手动制作请求)。数据必须在显示时验证,而不是在输入时验证。这是正确执行此操作的唯一方法。其他都错了。
  • 这是无效的,攻击者可以直接禁用 JavaScript 并避开过滤器。或者它可以使用 Firebug 或 Groundspeed 之类的工具删除事件处理程序。客户端的输入验证不起作用,攻击者可以删除/绕过/取消过滤器。正如@silky 提到的,必须在服务器端。
  • 有服务器端预防。
  • 注意:我允许这个答案不是因为它是@Silky 完全合理的最佳实践,而是因为它不需要关闭保护 asp.net 页面的页面验证的解决方案。请注意,除此之外,我还有 SERVER SIDE 预防措施。
【解决方案2】:

不,没有。

XSS 只能在服务器时防止,方法是为将要显示的给定上下文格式化不受信任的数据。

【讨论】:

  • 你是绝对正确的。然而,Martin 并没有问如何防止 XSS。他只是在问如何阻止 ASP.Net 的 XSS 预防系统。
  • @Mark:不,他不是,“阻止” ASP.NET 的预防系统的方法是关闭它。这是微不足道的。
  • 你好 Silky & Mark,我很欣赏你的 cmets,你们都是正确的。我清楚地知道关闭预防系统,但我仍然希望在允许他们输入上面示例中的值的同时打开它。我只是在预防和不限制人们做他们想做的事之间取得平衡。我仍在考虑最佳做法,但如果此解决方案可以防止“