在JavaScript中编码的URL?

你如何安全地使用JavaScript编码一个URL,以便它可以放入一个GETstring?

var myUrl = "http://example.com/index.html?param=1&anotherParam=2"; var myOtherUrl = "http://example.com/index.html?url=" + myUrl; 

我假设你需要在第二行上编码myUrlvariables?

查看内置函数encodeURIComponent(str)encodeURI(str)
在你的情况下,这应该工作:

 var myOtherUrl = "http://example.com/index.html?url=" + encodeURIComponent(myUrl); 

你有三个select:

  • escape()不会编码: @*/+

  • encodeURI()不会编码: ~!@#$&*()=:/,;?+'

  • encodeURIComponent()不会编码: ~!*()'

但在你的情况,如果你想传递一个URL到其他页面的GET参数,你应该使用escapeencodeURIComponent ,但不encodeURI

请参阅堆栈溢出问题最佳实践:escape或encodeURI / encodeURIComponent进一步讨论。

坚持与encodeURIComponent()encodeURI()函数不会编码许多在URL中具有语义重要性的字符(例如“#”,“?”和“&”)。 escape()已被弃用,并且不会编码“+”字符,这将被解释为服务器上的编码空间(正如其他人在这里指出的那样,没有正确地对非ASCII字符进行URL编码)。

encodeURI()encodeURIComponent()在其他地方有一个很好的解释 。 如果你想编码一些东西,使它可以被安全地包含为一个URI的组件(例如作为一个查询string参数),你想使用encodeURIComponent()

就我个人而言,我发现很多API都想用“+”replace“”,所以我使用下面的代码:

 encodeURIComponent(value).replace(/%20/g,'+') 

escape在不同浏览器中的实现方式不同, encodeURI不对大部分在URI中起作用的字符(如#和even /)进行编码,而是将其用于完整的URI / URL而不会破坏它。

编辑:您使用encodeURIComponent的查询string的 (不是字段/值的名称,绝对不是整个URL)。 如果以其他方式执行,则不会像=,?,&编码字符,可能会使您的查询string暴露。

如果你使用jQuery,我会去$.param方法。 它将URL对象映射字段编码为值,比对每个值调用一个转义方法更容易阅读。

 $.param({a:"1=2", b:"Test 1"}) // gets a=1%3D2&b=Test+1 

encodeURIComponent()是要走的路。

 var myOtherUrl = "http://example.com/index.html?url=" + encodeURIComponent(myUrl); 

但是你应该记住,从PHP版本的urlencode()和@CMS提到,它不会编码每个字符有一些小的差异。 http://phpjs.org/functions/urlencode/下的js相当于phpencode():;

 function urlencode(str) { str = (str + '') .toString(); // Tilde should be allowed unescaped in future versions of PHP (as reflected below), but if you want to reflect current // PHP behavior, you would need to add ".replace(/~/g, '%7E');" to the following. return encodeURIComponent(str) .replace(/!/g, '%21') .replace(/'/g, '%27') .replace(/\(/g, '%28') . replace(/\)/g, '%29') .replace(/\*/g, '%2A') .replace(/%20/g, '+'); } 

类似的东西,我试着用正常的JavaScript

 function fixedEncodeURIComponent(str){ return encodeURIComponent(str).replace(/[!'()]/g, escape).replace(/\*/g, "%2A"); } 

为了编码一个URL,如前所述,你有两个function:

 encodeURI() 

 encodeURIComponent() 

两者存在的原因是,第一个URL保留了可能会遗留太多事物的URL,而第二个则编码了所有需要的东西。

首先,您可以将新转义的url复制到地址栏中(例如),它就可以工作。 然而,你的非转义的'&'会干扰字段分隔符,'='会干扰字段名称和值,'+'将看起来像空格。 但是,对于简单的数据,当你想保留你正在逃避的URL的性质,这个工程。

第二个是你需要做的一切,以确保你的string没有任何干扰的URL。 它会留下各种不重要的字符,以便URL保持尽可能的人类可读性而不受干扰。 以这种方式编码的URL将不再作为一个URL来工作,而不会消除它。

因此,如果您可以花时间,则始终要使用encodeURIComponent() – 在添加名称/值对之前,使用此函数对名称和值进行编码,然后将其添加到查询string中。

我有一个艰难的时间来使用encodeURI()的理由 – 我会留给聪明的人。

为了防止双重编码,在编码之前解码url是一个好主意(如果你正在处理用户input的url,例如,可能已经被编码了)。

可以说,我们有abc%20xyz 123作为input(一个空间已经编码):

 encodeURI("abc%20xyz 123") // wrong: "abc%2520xyz%20123" encodeURI(decodeURI("abc%20xyz 123")) // correct: "abc%20xyz%20123" 

没有为我工作。 所有我看到的是login页面的HTML,回到代码200的客户端。(302首先,但相同的Ajax请求加载login页面内的另一个Ajax请求,这应该是一个redirect,而不是加载平原login页面的文本)。

在login控制器中,我添加了这一行:

 Response.Headers["land"] = "login"; 

而在全球的Ajax处理程序中,我这样做了:

 $(function () { var $document = $(document); $document.ajaxSuccess(function (e, response, request) { var land = response.getResponseHeader('land'); var redrUrl = '/login?ReturnUrl=' + encodeURIComponent(window.location); if(land) { if (land.toString() === 'login') { window.location = redrUrl; } } }); }); 

现在我没有任何问题,它像一个魅力。

编码URLstring

     var url = $(location).attr('href');  //获取当前url
     //要么
     var url ='folder / index.html?param =#23dd&noob = yes';  //或者指定一个 

var encodedUrl = encodeURIComponent(url); console.log(encodedUrl); //outputs folder%2Findex.html%3Fparam%3D%2323dd%26noob%3Dyes for more info go http://www.sitepoint.com/jquery-decode-url-string

您可以使用esapi库和使用下面的函数编码您的url。 该函数承受“/”不会丢失编码,而文本内容的其余部分进行编码:

 function encodeUrl(url) { String arr[] = url.split("/"); String encodedUrl = ""; for(int i = 0; i<arr.length; i++) { encodedUrl = encodedUrl + ESAPI.encoder().encodeForHTML(ESAPI.encoder().encodeForURL(arr[i])); if(i<arr.length-1) encodedUrl = encodedUrl + "/"; } return url; } 

https://www.owasp.org/index.php/ESAPI_JavaScript_Readme