在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;
我假设你需要在第二行上编码myUrl
variables?
查看内置函数encodeURIComponent(str)
和encodeURI(str)
。
在你的情况下,这应该工作:
var myOtherUrl = "http://example.com/index.html?url=" + encodeURIComponent(myUrl);
你有三个select:
-
escape()
不会编码:@*/+
-
encodeURI()
不会编码:~!@#$&*()=:/,;?+'
-
encodeURIComponent()
不会编码:~!*()'
但在你的情况,如果你想传递一个URL到其他页面的GET
参数,你应该使用escape
或encodeURIComponent
,但不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; }