为了账号安全,请及时绑定邮箱和手机立即绑定

为什么要在渲染局部之前进行escape_javascript?

为什么要在渲染局部之前进行escape_javascript?

凤凰求蛊 2019-12-10 10:03:27
我正在看这个Railscast插曲,想知道为什么在escape_javascript这里需要致电:$("#reviews").append("<%= escape_javascript(render(:partial => @review)) %>");有什么escape_javascript用?根据Rails的文档:escape_javascript(javascript)转义符返回以及JavaScript段的单引号和双引号。但这对我来说意义不大。
查看完整描述

3 回答

?
Helenr

TA贡献1780条经验 获得超3个赞

是否因为您不希望用户发布浏览器实际执行的JavaScript?


查看完整回答
反对 回复 2019-12-10
?
qq_花开花谢_0

TA贡献1835条经验 获得超6个赞

如果您在这里查看源代码,它将更加清晰。

此功能完成以下两件事:

  1. 它将输入字符串中的字符替换为JS_ESCAPE_MAP中定义的字符

    这样做的目的是确保javascript代码正确序列化,而不会干扰嵌入它的外部字符串。例如,如果您的JavaScript字符串用双引号引起来,则字符串文字中的所有引号都必须用单引号引起来,以免破坏代码。

  2. 该函数还检查结果字符串是否为html安全。如果不是,则进行必要的转义以确保该字符串变为html安全并返回结果。

当您使用escape_javascript时,通常会动态地将其嵌入到另一个字符串或现有的html中。您需要确保这样做不会使整个页面无法呈现。

其他回复中指出了此回复的某些方面,但我想将所有内容放在一起,包括javascript转义和html转义之间的区别。此外,一些响应暗示此功能有助于避免脚本注入。我认为这不是此功能的目的。例如,在您的评论中,如果您的评论具有警报(“嗨,那里”),则仅将其附加到节点将不会触发弹出窗口。您没有将其嵌入在页面加载或通过其他事件触发的函数中。仅将alert('hi there')作为您的html的一部分并不意味着它将作为javascript执行。

话虽如此,但我并不否认不可能进行脚本注入。但是要避免这种情况,在获取用户数据并将其存储在数据库中时需要采取步骤。您提供的功能和示例与呈现已保存的信息有关。

希望这对您有所帮助。


查看完整回答
反对 回复 2019-12-10
  • 3 回答
  • 0 关注
  • 825 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信