GET 文字列に入れることができるように、JavaScript を使用して URL を安全にエンコードするにはどうすればよいでしょうか?
var myUrl = "http://example.com/index.html?param=1&anotherParam=2";
var myOtherUrl = "http://example.com/index.html?url=" + myUrl;
myUrl
その2行目に変数をエンコードする必要があると思いますか?
GET 文字列に入れることができるように、JavaScript を使用して URL を安全にエンコードするにはどうすればよいでしょうか?
var myUrl = "http://example.com/index.html?param=1&anotherParam=2";
var myOtherUrl = "http://example.com/index.html?url=" + myUrl;
myUrl
その2行目に変数をエンコードする必要があると思いますか?
組み込み関数のencodeURIComponent(str)とencodeURI(str ) を確認してください。
あなたの場合、これはうまくいくはずです:
var myOtherUrl =
"http://example.com/index.html?url=" + encodeURIComponent(myUrl);
次の 3 つのオプションがあります。
escape()
エンコードしません:@*/+
encodeURI()
エンコードしません:~!@#$&*()=:/,;?+'
encodeURIComponent()
エンコードしません:~!*()'
ただし、あなたの場合、URLをGET
他のページのパラメーターに渡したい場合は、 escape
orを使用する必要がありますencodeURIComponent
が、 は使用しないでencodeURI
ください。
詳細については、スタック オーバーフローの質問のベスト プラクティス: エスケープ、または encodeURI / encodeURIComponentを参照してください。
固執しencodeURIComponent()
ます。この関数encodeURI()
は、URL で意味的に重要な多くの文字 ("#"、"?"、"&" など) をわざわざエンコードしません。escape()
これは、サーバー上でエンコードされたスペースとして解釈されます (また、ここで他の人が指摘したように、非 ASCII 文字を適切に URL エンコードしません)。
と の違いについてのencodeURI()
encodeURIComponent()
素晴らしい説明があります。何かをエンコードして、URI のコンポーネントとして (たとえば、クエリ文字列パラメーターとして) 安全に含めることができるようにする場合は、encodeURIComponent()
.
最良の答えは、クエリ文字列の値encodeURIComponent
に対して使用することです (それ以外の場所では使用しません)。
ただし、多くの API が " " を "+" に置き換えたいと考えているため、以下を使用する必要がありました。
const value = encodeURIComponent(value).replace('%20','+');
const url = 'http://example.com?lang=en&key=' + value
escape
ブラウザごとに実装が異なり、encodeURI
多くの文字 (# や / など) をエンコードしません。完全な URI/URL を壊さずに使用できるように作られています。これはあまり役に立たず、安全でもありません。
また、@ Jochem が以下で指摘しているようencodeURIComponent()
に、(各) フォルダー名で使用したい場合がありますが、何らかの理由でこれらの API はフォルダー名に必要ないように見える+
ため、単純な古いencodeURIComponent
機能はうまく機能します。
例:
const escapedValue = encodeURIComponent(value).replace('%20','+');
const escapedFolder = encodeURIComponent('My Folder'); // no replace
const url = `http://example.com/${escapedFolder}/?myKey=${escapedValue}`;
qs npm パッケージを使用することをお勧めします
qs.stringify({a:"1=2", b:"Test 1"}); // gets a=1%3D2&b=Test+1
JS オブジェクトで使用する方が簡単で、すべてのパラメーターに対して適切な URL エンコードを提供します。
jQuery を使用している場合は、$.param
メソッドを使用します。フィールドを値にマッピングするオブジェクトを URL エンコードします。これは、各値に対してエスケープ メソッドを呼び出すよりも読みやすくなります。
$.param({a:"1=2", b:"Test 1"}) // gets a=1%3D2&b=Test+1
二重エンコーディングを防ぐには、エンコーディングの前に URL をデコードすることをお勧めします (たとえば、ユーザーが入力した URL を扱っている場合、既にエンコードされている可能性があります)。
入力として持っているとしましょうabc%20xyz 123
(1 つのスペースは既にエンコードされています):
encodeURI("abc%20xyz 123") // wrong: "abc%2520xyz%20123"
encodeURI(decodeURI("abc%20xyz 123")) // correct: "abc%20xyz%20123"
何もうまくいきませんでした。私が見たのは、ログインページのHTMLで、コード200でクライアント側に戻ってきました(最初は302ですが、同じAjaxリクエストが別のAjaxリクエスト内にログインページを読み込んでいます。これは、プレーンを読み込むのではなく、リダイレクトするはずでした。ログインページのテキスト)。
ログインコントローラに、次の行を追加しました。
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;
}
}
});
});
今は問題なく、お守りのように機能します。
これはおよびJS 組み込み関数のライブデモです。encodeURIComponent()
decodeURIComponent()
<!DOCTYPE html>
<html>
<head>
<style>
textarea{
width:30%;
height:100px;
}
</style>
<script>
// encode string to base64
function encode()
{
var txt = document.getElementById("txt1").value;
var result = btoa(txt);
document.getElementById("txt2").value = result;
}
// decode base64 back to original string
function decode()
{
var txt = document.getElementById("txt3").value;
var result = atob(txt);
document.getElementById("txt4").value = result;
}
</script>
</head>
<body>
<div>
<textarea id="txt1">Some text to decode
</textarea>
</div>
<div>
<input type="button" id="btnencode" value="Encode" onClick="encode()"/>
</div>
<div>
<textarea id="txt2">
</textarea>
</div>
<br/>
<div>
<textarea id="txt3">U29tZSB0ZXh0IHRvIGRlY29kZQ==
</textarea>
</div>
<div>
<input type="button" id="btndecode" value="Decode" onClick="decode()"/>
</div>
<div>
<textarea id="txt4">
</textarea>
</div>
</body>
</html>
私はいつもこれを使って URL のエンコードを行っています。エンコードする必要がない場合でも、すべての文字をエンコードするため、これは完全に安全です。
function urlEncode(text) {
let encoded = '';
for (let char of text) {
encoded += '%' + char.charCodeAt(0).toString(16);
}
return encoded;
}