Javascript 在<;脚本>;块
一方面,如果我有Javascript 在<;脚本>;块,javascript,html,escaping,Javascript,Html,Escaping,一方面,如果我有 <script> var s = 'Hello </script>'; console.log(s); </script> 在这种情况下,这不是期望的行为 正确转义块中JS字符串的一种方法是,如果斜杠在左尖括号后面,则转义斜杠,或者总是转义斜杠,即 var s = 'Hello <\/script>'; var s='Hello'; 这似乎很有效 然后是HTML事件处理程序中的JS代码问题,它也很容易被破坏 <div
<script>
var s = 'Hello </script>';
console.log(s);
</script>
在这种情况下,这不是期望的行为
正确转义
块中JS字符串的一种方法是,如果斜杠在左尖括号后面,则转义斜杠,或者总是转义斜杠,即
var s = 'Hello <\/script>';
var s='Hello';
这似乎很有效
然后是HTML事件处理程序中的JS代码问题,它也很容易被破坏
<div onClick="alert('Hello ">')"></div>
“>
起初看起来有效,但在大多数(或所有?)浏览器中都会中断。这显然需要完整的HTML实体编码
我的问题是:如果您的JS代码部分是在服务器端生成的,并且可能包含恶意数据,那么正确覆盖上述所有情况的最佳/标准做法是什么?例如,脚本块中的JS,事件处理程序中的JS?大多数人使用以下技巧:
var s = 'Hello </scr' + 'ipt>';
var s='Hello';
(编辑-不知何故没有注意到您在问题中已经提到了斜杠转义…)
好吧,你知道如何避开斜杠了
在内联事件处理程序中,不能在文本中使用边界字符,因此请使用另一个:
<div onClick='alert("Hello \"")'>test</div>
测试
但这一切都有助于让你的生活变得困难。只是不要使用内联事件处理程序!或者如果你绝对必须这样做,那么让它们调用其他地方定义的函数
一般来说,服务器端代码编写javascript的原因很少。不要从服务器生成脚本,而是将数据传递给预先编写的脚本
(原件)
您可以使用反斜杠转义JS字符串文字中的任何内容(否则不是特殊的转义字符):
var s='Hello';
这还有一个积极的作用,就是它不会被解释为html。因此,您可以用“\/”替换“/”以避免产生不良影响
不过,一般来说,我担心用户提交的数据会以字符串文字形式嵌入javascript。您是否在服务器上生成javascript代码?为什么不直接以JSON或HTML“data”属性或其他形式传递数据?我认为最佳做法是首先避免使用内联JS 将JS代码放在一个单独的文件中,并将其包含在
src
属性中
<script src="path/to/file.js"></script>
以下字符可能会干扰HTML或Javascript解析器,应以字符串文本形式转义:、“、”、\、
和&
正如您所发现的,在脚本块中,使用转义字符是有效的。连接方法(“
)可能很难读取
var s = 'Hello <\/script>';
我是这样做的:
函数编码(r){
返回r.replace(/[\x26\x0A\'”]/g,函数(r){return“”+r.charCodeAt(0)+“;”})
}
var myString='Encode HTML entities!\n“安全”转义和其他标记!';
test.value=encode(myString);
testing.innerHTML=encode(myString);
/*************
*\x26是与符号(必须是第一个),
*\x0A是新行,
*************/
www.WHAK.com
因此,如果代码是在服务器端生成的,我需要查找并用损坏的代码替换它?摆脱斜杠不是更容易吗?Re:将字符串传递给JS:使用JSON是一个有效点,但我正试图通过将数据直接插入HTML/JS来节省一些流量和连接。只需少量对于数据,我认为这没关系。这种技术只会在带宽方面花费你,因为这样的脚本不能被浏览器缓存。快速而肮脏,把它放在一个隐藏的元素中:
没有规则禁止你想怎么做就怎么做,但它确实会省去很多麻烦,并使代码更容易、更安全、更易于维护生成脚本。Re:还原边界字符的解决方案需要我的服务器端代码在我的JS代码段中查找引号,并决定是否应该用单引号或双引号括起来。变得太复杂了。像任何HTML文本一样转义要容易得多。除了它不能可靠工作外,因为java脚本不是文本。您需要将javascript文本中的转义规则和HTML元素中的转义规则结合起来,这一点突然变得非常复杂。单引号中的双引号变成了“
,但是,绑定字符串文本的双引号呢?答案很简单:避免内联脚本。而是传递数据。老实说,我已经修复了我的代码,它可以工作了。规则#1:在服务器上生成JS字符串文字时,使用反斜杠转义引号、换行符和斜杠。规则#2:在脚本块中将JS代码以外的任何内容插入HTML时,请像往常一样使用htmlentities()进行转义。如果我有使用内联代码的理由,该怎么办?为了提高效率,在高负载的网站上节省流量、连接等。@mojuba:好吧,当您开始进行这种性能调整时,大多数最佳实践已经被抛到了窗外:)十六进制转义方法的可能重复是目前为止最好的:您不必担心字符串在代码中的位置,只需通过一个基本的服务器端功能发送所有内容。太好了,我喜欢!
<script src="path/to/file.js"></script>
//jquery example
$('div.something').on('click', function(){
alert('Hello>');
})
var s = 'Hello <\/script>';
<div onClick="alert('Hello ">')">click me</div>
<div onClick="alert('Hello \u0022>')">click me</div>
<script>
var s = 'Hello \u003c/script\u003e';
alert( s );
</script>