html() 与 innerHTML jquery/javascript 和 XSS 攻击

2024-05-03

我正在对我自己的代码测试 xss 攻击。下面的示例是一个简单的框,用户可以在其中输入他想要的任何内容。按“测试!”后按钮,JS 会将输入字符串显示为两个 div。这是我为了更好地解释我的问题而制作的示例:

<html>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script type="text/javascript">
    function testIt(){
        var input = document.getElementById('input-test').value;
        var testHtml = document.getElementById('test-html');
        var testInnerHTML = document.getElementById('test-innerHTML');
        $(testHtml).html(input);
        testInnerHTML.innerHTML = input;
    }
</script>
<head>this is a test</head>
<body>  
    <input id="input-test" type="text" name="foo" />
    <input type="button" onClick="testIt();" value="test!"/>
    <div id="test-html">
    </div>
    <div id="test-innerHTML">
    </div>
</body>

如果您尝试将其复制到 .html 文件并运行它,它将正常工作,但如果您尝试输入<script>alert('xss')</script>,只会抛出一个警告框:“test-html”div 内的警告框(带有 html() 函数)。

我真的不明白为什么会发生这种情况,而且,用 firebug 检查代码给了我这个结果(注入脚本后)

<body>
this is a test
<input id="input-test" type="text" name="foo">
<input type="button" value="test!" onclick="testIt();">
<div id="test-html"> </div>
<div id="test-innerHTML">
  <script>
    alert('xss')
  </script>
</div>
</body>

如你看到的test-htmldiv 为空,并且test-innerhtmldiv 包含脚本。有人能告诉我为什么吗?是因为 html() 对于脚本注入或类似的东西更安全吗?

预先感谢,最诚挚的问候。


与已接受的答案中所说的相反,jQuery.html()和许多jQuery 函数接受 HTML 字符串作为参数更容易受到基于 DOM 的 XSS 注入innerHTML,正如OP所注意到的。

jQuery.html()提取出<script>标签,更新 DOM 和评估嵌入在脚本标签中的代码.

因此,即使在使用时加载 DOM 之后,在没有用户交互的情况下,XSS 也可能发生jQuery.html().

这很容易演示。

这将调用alert():

$('.xss').html('<script>alert("XSS");</script\>');

http://jsfiddle.net/2TpHC/ http://jsfiddle.net/2TpHC/

虽然这不会:

var d = document.getElementById('xss');
d.innerHTML = '<script\>alert("XSS");</script\>';

http://jsfiddle.net/Tjspu/ http://jsfiddle.net/Tjspu/

不幸的是,有many导致调用的其他代码路径(接收器)eval()在 jQuery 中。具有安全意识的人可能会尽可能完全避免使用 jQuery。

请注意,我并不声称使用innerHTML 可以有效防御XSS。它不是。正如@daghan 所指出的,将未转义的数据传递给innerHTML 并不安全。一应该always生成 HTML 时正确转义数据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

html() 与 innerHTML jquery/javascript 和 XSS 攻击 的相关文章

随机推荐

  • C++ 中类定义的顺序

    我这里有点问题 我试图定义几个类 其中一些是玩家 一些是属于玩家的 Pawn 来自 Python 我习惯于能够通过 Pawn 方便地访问 Pawn 拥有的 Player 以及通过 Player 访问 Player 的 Pawn 如果我错了请
  • android logcat 记录闲聊模块行过期消息

    我收到很多与我的应用程序相关的此类 logcat 消息 11 19 19 04 23 872 3327 3440 I chatty uid 10085 com xxxx yyy expire 18 lines 这些日志消息是什么 我在这里缺
  • 如何使用索引优化 InnoDB 上的 COUNT(*) 性能

    我有一个较大但狭窄的 InnoDB 表 有大约 9m 条记录 正在做count or count id 桌子上的速度非常慢 6秒以上 DROP TABLE IF EXISTS perf2 CREATE TABLE perf2 id int
  • 如何选择按范围分组的值的计数

    斯塔克万岁 我需要选择按范围分组的值的计数 举例来说 假设我在表列中有以下值 1 2 4 5 6 8 9 11 13 16 然后 我想检索 5 范围内它们的计数 如下所示 From 0 to 4 there is 3 values 1 2
  • 在 Process Explorer 中调试 RtlUserThreadStart

    我有一个基于 3 5 构建的多线程 wpf 应用程序 当我通过 Process Explorer 查看正在运行的线程时 我看到 8 个线程都具有相同的起始地址 ntdll dll RtlUserThreadStart 并且所有 8 个线程的
  • emacs中如何删除重复行

    我的文本有很多行 我的问题是如何删除 emacs 中的重复行 在没有外部实用程序的情况下使用 emacs 或 elisp 包中的命令 例如 this is line a this is line b this is line a 删除第三行
  • 如何让 Kotlin 类型安全构建器在 Scala 中工作?

    Kotlin 很棒类型安全的构建者 https kotlinlang org docs reference type safe builders html这使得创建像这样的 dsl 成为可能 html head title The titl
  • 如何启动 java-web-start 应用程序并等待其退出?

    我刚刚发现javaws wait没有做 Windows 上应该做的事情 它将在应用程序完成之前返回 这个 bug 已经存在 5 年多了 并且已关闭 无法修复6281477 https bugs java com bugdatabase vi
  • 如何在 ubuntu 上的 emacs 中运行 shell 命令,同时避免 bash 作业控制错误?

    我在 ubuntu 中安装了 emacs 使用 sudo apt get install emacs 我遇到的问题是 当我尝试从 emacs 中运行 shell 命令时 例如M ls 输出之前是这样的 bash cannot set ter
  • 使用外源数据进行 SARIMAX 样本外预测

    我正在使用 SARIMAX 进行时间序列分析 并且一直在努力解决这个问题 我想我已经成功地拟合了一个模型并用它来进行预测 但是 我不知道如何利用外源数据进行样本预测 我可能做错了整个事情 所以我在下面包含了我的步骤和一些示例数据 impor
  • 如何使用 JDBC 将大型(或至少是重要的)BLOB 放入 Oracle 中?

    我正在开发一个应用程序来执行一些批处理 并且希望将输入和输出数据作为文件存储在 Oracle 数据库的 BLOB 字段中 Oracle版本是10g r2 使用如下的PreparedStatement setBinaryStream 方法会将
  • 应用程序包包含本机代码,我找不到调试符号 .zip

    这是关于 PlayStore 警告调试符号 添加行到 build gradle app 后我已成功构建 Gradle android buildTypes release ndk debugSymbolLevel FULL 但遵循指示htt
  • 使用 Mongoose 多次查询,无需嵌套

    我正在尝试使用 node js 生成一个文档 该文档需要从 mongo 数据库运行多个不相关的数据库查询 这是我当前的代码 Data find function err results if err return next err fini
  • Pandas:了解操作何时影响原始数据帧

    我喜欢 pandas 并且已经使用它很多年了 并且非常有信心我能够很好地掌握如何对数据帧进行子集化并适当地处理视图与副本 尽管我使用了很多断言来确保 我还知道有很多关于SettingWithCopyWarning的问题 例如如何处理Pand
  • Spring中的ApplicationContext导入

    我正在从本教程学习 Spring http courses caveofprogramming com courses the java spring tutorial lectures 38024 http courses caveofp
  • tkinter 应用程序中的 super()

    我无法理解这个错误 在下面的代码中 当我使用tk Frame一切都按预期进行 但是如果我使用super 我被抛出了AttributeError 应用程序对象没有属性 tk class Application tk Frame def ini
  • WPF 与分辨率无关

    如果我将所有内容放入 viewbox 容器中 那么我的 wpf 应用程序将与分辨率无关 或者我需要执行其他操作吗 请帮助概念 根据可用屏幕或中等尺寸缩放 元素如果您希望始终填充屏幕或输出设备的某些空间 而与指标无关 那么使用视图框是一个不错
  • 如何忽略“类型实例化过深且可能无限。ts(2589)”打字稿错误?

    更新到 Typescript 3 5 后 我收到很多 类型实例化过深 可能是无限的 ts 2589 错误 我怎么能忽视他们呢 代码发生的地方 使用TypeORM https typeorm io import Connection Repo
  • 静态类属性上的 isset

    class A public static foo 42 class A attribute foo var dump isset class attribute gives bool false 我如何检查这个类中是否存在这个静态属性 U
  • html() 与 innerHTML jquery/javascript 和 XSS 攻击

    我正在对我自己的代码测试 xss 攻击 下面的示例是一个简单的框 用户可以在其中输入他想要的任何内容 按 测试 后按钮 JS 会将输入字符串显示为两个 div 这是我为了更好地解释我的问题而制作的示例