Javascript 当尖括号位于';中时,为什么使用encodeURIComponent会锁定我的网页;将是';编码值?

Javascript 当尖括号位于';中时,为什么使用encodeURIComponent会锁定我的网页;将是';编码值?,javascript,http,url,encoding,Javascript,Http,Url,Encoding,我开始了解如何以及何时进行编码,以减少XSS和正确显示字符 然而,我有一些客户端脚本(JavaScript),它将一些html写入页面,特别是写入查询字符串 为此,我使用了javascript的“encodeURIComponent”函数来帮助处理存储在外部json文件中的用户输入 我注意到,无论我如何对这些值进行编码,当任何值中都有尖括号时,它实际上每次都会锁定页面,但当json值中没有尖括号时,它会完美地工作 我先尝试了html编码,然后使用“encodeURIComponent”,也尝试了

我开始了解如何以及何时进行编码,以减少XSS和正确显示字符

然而,我有一些客户端脚本(JavaScript),它将一些html写入页面,特别是写入查询字符串

为此,我使用了javascript的“encodeURIComponent”函数来帮助处理存储在外部json文件中的用户输入

我注意到,无论我如何对这些值进行编码,当任何值中都有尖括号时,它实际上每次都会锁定页面,但当json值中没有尖括号时,它会完美地工作

我先尝试了html编码,然后使用“encodeURIComponent”,也尝试了另一种方法。由于javascript没有天生的html编码器,我自己编写了一个简单的编码器。在这里:

function htmlEncode (input)
{

    while(input.indexOf("&") > -1)
    {
        input = input.replace("&", "&")
    }
    while(input.indexOf("<") > -1)
    {
        input = input.replace("<", "&lt;")
    }
    while(input.indexOf(">") > - 1)
    {
        input = input.replace(">", "&gt;")
    }
    while(input.indexOf("\"") > -1)
    {
        input = input.replace("\"", "&#x22;")
    }
    while(input.indexOf("'") > -1)
    {
        input = input.replace("'", "&#x27;")
    }
    while(input.indexOf("/") > -1)
    {
        input = input.replace("/", "&#x2F;")
    }

    return input
}
不幸的是,我不能提供更多的信息,因为当它锁定时,它会很难锁定,并且没有诊断工具可以运行(甚至不能右键单击或滚动)

我认为编码两次是愚蠢的,但是当尖括号单独使用“encodeURIComponent”锁定浏览器时,我想我也会尝试html编码,但它仍然会锁定任何一种方式

在保存到json文件时,我是否可以做些什么,或者是否应该阻止使用尖括号

-----------------------这就是我在下面函数中看到的-----------------


你可以做得更好。我给你带来我的好朋友,字母“g”:


进入浏览器的控制台。

您能显示它锁定的详细信息吗?我刚刚做了几个测试,在FF 18上工作得很好。@Chad尝试在字符串中使用尖括号。我做了几次:
var str='';编码元件(str)立即返回
%3Cthing%2F%3E”
。我也很困惑,因为您要替换的代码不是URL编码的,它们是HTML实体代码。@Chad哦,
encodeURIComponent()
;我是指问题中的函数。@Pointy啊!这还不清楚,认为
encodeURIComponent()
正在崩溃。我从你的三步演示中明白了你的意思。这是我自己编写的htmlEncode函数第一次像这样锁定。我可以看到如何使用注册。这里的表达方式会更好(尽管,我相信你可以看出,我在这方面没有那么熟练,或者我可能会先尝试一下)。我现在就试试这个,马上回来!一个简单的问题是:在这里编码两次是愚蠢的还是必须编码两次?我认为这是必要的,因为它在我不使用htmlEncode函数的情况下就锁定了,尽管如此。@VoidKing-well
encodeURIComponent
对我来说很好;也许您可以在问题中添加调用它的代码。@VoidKing不,您没有。JavaScript支持“本机”正则表达式语法,就像我在示例代码中编写的一样。答案(在修复它之后;也就是现在)很好。好吧,与其做一个胆小鬼,试着挽回面子,我要说(两腿之间夹着尾巴),我找到了我的另一个“htmlEncode”函数(它显然通过检查“&”然后替换“&;”和不断地反复检查来破坏东西)。我忘记了这个函数通过另一个外部js文件与这个页面进行通信。已经说过,我不知道我的解析器出了什么问题,或者为什么当我放进角括号时,页面只会出错,但是不管怎样,与原来的问题一样,这个答案已经被接受了。
stringCompiler = "/Event htms/Event.cshtml?title=" + encodeURIComponent(jsonObj.events[i].title) +
                        "&explanation=" + encodeURIComponent(jsonObj.events[i].explanation) + "&dateString=" +
                        encodeURIComponent(jsonObj.events[i].dateMonth) + "-" + encodeURIComponent(jsonObj.events[i].dateNumber) + "-" + encodeURIComponent(jsonObj.events[i].dateYear);
function htmlEncode (input) {
  return input.replace(/&/g, '&amp;')
    .replace(/</g, '&lt;')
    .replace(/>/g, '&gt;')
    .replace(/\//g, '&#x2F;')
    .replace(/'/g, '&#x27;')
    .replace(/"/g, '&#x22;');
}
encodeURIComponent("<>&");