有没有办法“停止脚本”使用JavaScript运行

Is there a way to "stop script" from running using JavaScript?

本文关键字:停止脚本 使用 JavaScript 运行 脚本 有没有      更新时间:2023-09-26

如何在 JavaScript 中阻止脚本执行?在跨站点脚本 (XSS) 攻击的情况下,基本要求是脚本的注入 + 执行。

想象一下攻击者能够在页面中注入JavaScript的场景,我们的目标是阻止攻击者的脚本执行。例如,注入点可以是任何用户提供的输入区域。

始终始终转义您的输入。对于 XSS,请使用 htmlentities() 转义 HTML 和 JS。这是一篇关于PHP安全性的好文章

http://www.phpfreaks.com/tutorial/php-security

处理XSS时,基本上有两件事需要注意:

  1. 转义您的输出。转义输入只会白白占用更多资源。转义用户提交的内容输出。这也意味着非转义内容在您的数据库中,这是一件好事(如果出现误报,您可以在不丢失内容的情况下修复它,如果是新的 XSS 策略,则无需修改所有数据库等)。
  2. 保护您的JavaScript代码。要非常小心,不要使用 eval() 或类似的东西包含一些缺陷。

正如其他人所说,保护自己免受XSS侵害的最佳和最简单的方法是根据插入点验证输入并正确转义输出(HTML,最有可能,使用实体或JavaScript/CSS块 - 不太可能且更难正确转义)。

但是,如果您的用例是输出应该包含任意 HTML 的原始用户输入,并且您只想防止注入的 JavaScript 弄乱您的网站,您可以:

1) 将

内容框放在不同的唯一域中(因此它不能与您的主文档共享 cookie),例如 xyz123.usercontent.com(任何用户的 xyz123 都不同)2) 等待和/或 CSP 的沙盒指令在您支持的每个浏览器中标准化(当然,拒绝访问无法运行的浏览器)。

唯一的解决方案是防止注入脚本。您可以采取以下几种措施来实现这一目标:

  1. 永远不要相信用户的输入。这意味着表单输入、查询字符串参数、Cookie 内容或从传入请求获得的任何其他数据。
  2. 清理您渲染的所有内容,无论您在何处渲染它。我喜欢在模板中使用两个名称清晰的渲染函数来实现这一点,renderrender_unsafe .自 3.0 以来,Rails 具有类似的界面,它会清理所有模板数据,除非您特别要求未经清理的渲染。拥有一个名称清晰的界面将更容易检查您的模板,并且确保未经净化的渲染是例外,这会迫使您在每次将数据转储到模板中时做出决定。
  3. 如果必须允许用户直接运行函数,请始终通过白名单进行操作。让他们提供函数名称或其他标识符作为字符串,并将其参数作为 JSON 或其他一些可解析结构。看看设计 Shopify的液体模板系统,该系统使用类似的执行安全白名单模式。
  4. 永远不要相信用户的输入。从来没有。