Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在<;脚本>;块_Javascript_Html_Escaping - Fatal编程技术网

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 &quot;>')">click me</div>
<div onClick="alert('Hello \u0022>')">click me</div>

<script>
    var s = 'Hello \u003c/script\u003e';
alert( s );
</script>