コンテンツへスキップ

URLデコード

%E2%9C%93 を ✓ に戻します。二重エンコードされた文字列、フォームエンコード、一部が壊れた入力も、拒否せずに処理します。データは保存されません。

  • 保存しません
  • 順番待ちなし
  • 登録不要・透かしなし
デコード結果

ここにデコード結果が表示されます。

使い方

1

エンコードされたテキストを貼り付け

URL全体でも、クエリ文字列でも、値1つだけでもかまいません。

2

必要なら方式を選択

標準のデコードか、+ をスペースとして扱うフォームデコードかを選びます。分からなくても、2つの結果が異なる場合はページが知らせます。

3

結果をコピー

テキストが二重にエンコードされていたら、もう一度デコードします。よくあることで、一度見れば簡単に見分けられます。

ツールには決められないあいまいさ

デコードの仕組みは単純です。% の後に16進数が2桁続く箇所を探してバイトに戻し、そのバイト列をUTF-8として読むだけです。本当の意味であいまいな点はただ1つ。プラス記号はスペースを意味することも、プラスそのものを意味することもあります。送信されたフォームでは、Web自体のURL仕様より古い慣習によってスペースを意味します。パスの一部では文字どおりの記号です。テキスト自体にはどちらなのかが書かれていないため、このページは片方を選んで気付かれないまま間違えるのではなく、両方の読み方を表示します。これが最も効いてくるのは、プラスが本物のデータであるメールアドレスやBase64の値の場合です。

ASCII以外のテキストは、1文字あたり複数のパーセント表記になります。エンコードは文字単位ではなくUTF-8のバイト単位で行われるからです。アクセント付きの文字は2つ、ほとんどの記号は3つ、絵文字は4つになります。有効なUTF-8ではない並びをデコードすると置換文字になります。これはたいてい、テキストが別の文字コードでエンコードされたか、文字の途中で切れてしまったことを示しています。

二重デコードは単なるミスではなく、セキュリティ上のバグです。値をデコードしてチェックし、その後もう一度デコードすると、攻撃者はチェックから文字を隠せてしまいます。%252e%252e%252f は「../」を探すフィルターを通過します。1回デコードした時点ではまだ %2e%2e%2f だからです。そして2回目のデコードで、フィルターが防ぐはずだったディレクトリトラバーサルになります。デコードはちょうど1回だけ行い、その後に検証してください。順番を逆にしてはいけません。

エンコードされていないテキストは崩れることなくそのまま返されます。文字列にデコードが必要かどうか分からないときに便利な動作です。後ろに16進数が2桁続かないパーセント記号は、エラーとして扱わずにそのまま残します。それは文字どおりのパーセント記号で、エンコードされたのではなく貼り付けられたテキストによく見られます。

ほかの目的には

コードでは、デコーダーをエンコーダーに合わせるべきです。JavaScriptには decodeURIComponent があり、Pythonはまさにプラス記号の問題のために unquote と unquote_plus を分けています。PHPに rawurldecode と urldecode があるのも同じ理由です。さらに良いのは、URL型やクエリ文字列パーサーに任せることです。ほとんどのフレームワークはパラメーターをデコードしてくれるので、その後にもう一度デコードすると、上で説明した二重デコードのバグが生まれます。

値をデコードするのではなく長いURLを調べたいなら、デコーダーよりパーサーが向いています。python -c "import urllib.parse,sys; print(urllib.parse.urlparse(sys.argv[1]))" はアドレスを部分ごとに分解するので、何もデコードする前にどの部分が何なのかを確認できます。リンクがおかしな動作をするとき、本当に知りたいのはたいていそこです。

よくある質問

デコードした後も %25 が残っています

二重にエンコードされていたということで、非常によくあることです。すでにエンコード済みの値が、リダイレクトやログ処理を通る途中でもう一度エンコードされると起こります。%25 は % という文字自体をエンコードしたものなので、1回目のデコードで %2520 は %20 になり、2回目のデコードでスペースになります。もう一度デコードするだけです。このパターンを見つけると、ページがお知らせします。

「+」はスペースにするべきですか?

文字列がどこから来たかによります。だからこそ推測ではなく選択にしています。application/x-www-form-urlencoded の本文、つまり送信されたHTMLフォームでは、+ はスペースを意味します。パスの一部や、単にURLを経由しただけのデータでは、+ は文字どおりのプラス記号で、スペースに変えると値が壊れます。問題になりやすいのはBase64の文字列です。本物の + を含んでいるため、フォームデコードすると壊れてしまいます。

壊れた文字列はどうなりますか?

すべてを拒否するのではなく、デコードできる部分をデコードし、残りはそのままにします。すでに一部がデコードされていたり途中で切れていたりするテキストによくある、有効なエスケープの一部ではない % が1つでもあると、ブラウザ標準のデコーダーはエラーを出して何も返しません。このページでは有効なエスケープをすべてデコードし、余分な文字はそのまま残します。壊れたログの行を読もうとしているときには、このほうがはるかに役立ちます。

テキストはどこかに保存されますか?

いいえ。何も保存されず、通信も一切行いません。ページを読み込んだ後はインターネットから切断しても、そのまま動作します。

URL全体を一度にデコードできますか?

はい。全体を貼り付けてください。構造は読みやすいまま残し、エンコードされた部分だけをテキストに戻すので、複数のエンコード済みパラメーターを含む長いURLも、実際に読める形になります。

ご注意: プラス記号の意味はあいまいです。クエリ文字列ではスペースを、パスでは文字どおりのプラスを意味します。このページは推測せず両方の方法でデコードし、どちらがどちらかを示します。パーセントエンコードされていないテキストは、崩れることなくそのまま返されます。

このツールをあなたのサイトに設置

ブログ、授業のページ、ヘルプ記事などに無料で設置できます。コードを1つ貼り付けるだけで、訪問者がそのページ上でツールを使えるようになります。