【问题标题】:Preventing layout break using jQuery when entering "<script>alert("hi");</script>" via Ajax通过 Ajax 输入 "<script>alert("hi");</script>" 时使用 jQuery 防止布局中断
【发布时间】:2013-09-10 05:29:41
【问题描述】:

我有一个带有加号图标的输入字段。单击加号图标时,输入的值将添加到输入字段上方。

实际上,我正在使用模板在输入字段上方添加内容。单击加号图标时,我将相应的模式替换为值,并使用 jQuery 替换功能将内容放在输入字段上方。

如果任何黑客输入像"&lt;script&gt;alert("hi");&lt;/script&gt;" 这样的值,布局就会中断。

如何通过 jQuery 阻止这些类型的攻击?我知道可以进行服务器端验证。但是有什么方法可以通过 jQuery/客户端验证来阻止这些攻击?

【问题讨论】:

  • 我知道您希望在客户端执行此操作,但只是重申一个有争议的问题,客户端验证是纯粹的漂亮用户体验。服务器端验证(和输出转义)是安全的,是 XSS 唯一需要关注的验证。任何脚本小子都可以并且将使用 firebug/dev 工具等发送 HTTP 协议允许的任何值。
  • 这里是客户端 jQuery answer
  • 谢谢,我知道服务器端验证是最终的安全性,我已经做到了,但只是想知道客户端的方式......我会试试这个,让你们知道。再次感谢您的快速回复...
  • appendCntDiv = appendCntDiv.replace(r1, counter).replace('{:elemVal}', SkillName).replace('{:hidVal}', skHdId).replace('{:expVal} ', exp);在这里,我将 {:elemVal} 替换为具有脚本标签的技能名称,因此如何在执行替换功能之前过滤脚本标签。

标签: javascript jquery escaping


【解决方案1】:

这很简单。不要使用jQuery的.html(),使用.text()

转义会自动发生,除了不使用错误的API函数外,没有什么特别需要做的。

<div id="textDisplay"></div>
<input type="text" id="enteredText"> <button id="transferText">Click!</button>

$(function() {
    $("#transferText").click(function () {
        var userInput = $("#enteredText").val();

        $("#textDisplay").text(userInput);
    });
});

【讨论】:

  • 谢谢,我知道服务器端验证是最终的安全性,我已经做到了,但只是想知道客户端的方式......我会试试这个,让你们知道。再次感谢您的快速回复...
  • appendCntDiv = appendCntDiv.replace(r1, counter).replace('{:elemVal}', SkillName).replace('{:hidVal}', skHdId).replace('{:expVal} ', exp);在这里,我将 {:elemVal} 替换为具有脚本标签的技能名称,因此如何在执行替换功能之前过滤脚本标签。
  • appendCntDiv 之后会发生什么? (下次在问题中包含您的代码。在 cmets 中讨论代码片段完全没有意义。)
  • 除此之外:这个问题已经解决了。使用 actual 模板引擎而不是手动替换。有很多模板库可供选择,只需选择一个并使用它。这里有几个:microjs.com/#templating。 (或者,换一种说法:除非您的目标是编写模板引擎,否则不要编写模板引擎。使用已经存在、经过测试且不会被这些简单事物绊倒的引擎。)
猜你喜欢
  • 2016-10-13
  • 2013-02-11
  • 2019-02-22
  • 2020-04-19
  • 2022-06-23
  • 1970-01-01
  • 2020-07-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多