web-dev-qa-db-ja.com

GETパラメーターで許可される文字

エンコードまたはエスケープせずにGETパラメーターで許可されるのはどの文字ですか?私はこのようなことを意味します:

http://www.example.org/page.php?name=XYZ

XYZの代わりに何がありますか?私は次のキャラクターだけだと思う​​:

  • a〜z(A〜Z)
  • 0-9
  • -
  • _

これは完全なリストですか、それとも追加の文字が許可されていますか?

あなたが私を助けてくれることを願っています。前もって感謝します!

53
caw

予約文字があり、予約された意味を持ち、それらは区切り文字です—_:/?#[]@_ —およびサブデリミタ—!$&'()*+,;=

unserved characters—英数字と_-._~_—と呼ばれる文字のセットもありますエンコードされません。

つまり、予約されていない文字セットに属さないものは、特別な意味を持たない場合(たとえば、GETの一部として渡される場合)、%エンコードされることになっています。パラメータ)

RFC3986:Uniform Resource Identifier(URI):Generic Syntax も参照してください

質問では、エンコードまたはエスケープせずにGETパラメーターで許可される文字を尋ねます

RFC3986 (一般的なURL構文)および RFC7230、セクション2.7.1 (HTTP/S URL構文)によると、パーセントエンコードに必要な文字は外部の外にある文字のみですqueryセット、以下の定義を参照してください。

ただし、HTML5、 Webフォーム、および廃止されたインデックス検索 、W3C勧告などの追加仕様があります。これらのドキュメントは、=&+;のような記号に、特にいくつかの文字に特別な意味を追加します。

ここでの他の回答は、「/」「?」を含むほとんどの予約文字をエンコードする必要があることを示唆しています。それは正しくありません。実際、 RFC3986、セクション3.4 は、パーセントエンコーディング「/」「?」に対するアドバイスです。文字。

使いやすさのために、これらの文字のパーセントエンコードを避ける方が良い場合があります。

RFC3986では、クエリコンポーネントを次のように定義しています。

query       = *( pchar / "/" / "?" )
pchar       = unreserved / pct-encoded / sub-delims / ":" / "@"
pct-encoded = "%" HEXDIG HEXDIG
sub-delims  = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
unreserved  = ALPHA / DIGIT / "-" / "." / "_" / "~" 

オクテットの対応する文字が許可されたセットの外にある場合、またはコンポーネントの区切り文字として、またはコンポーネント内で使用されている場合、パーセントエンコードメカニズムを使用してコンポーネントのデータオクテットを表します。

結論は、XYZ部分はエンコードする必要があるということです:

special: # % = & ;
Space
out of query set: [ ]
non ASCII encodable characters

特殊記号がない限り=&; key = valueセパレーターです。

他の文字のエンコードは許可されていますが、必須ではありません。

10
dmitri

RFC 1738 からURLで許可される文字:

英数字、特殊文字「$ -_。+!* '()」、および予約目的で使用される予約文字のみをURL内でエンコードせずに使用できます。

予約文字は「;」、「/」、「?」、「:」、「@」、「=」および「&」です。つまり、使用する場合はURLエンコードする必要があります。

4
ctford

Chromeアドレスバーとbashの_$QUERY_STRING_を使用してテストを行い、次のことを確認しました。

~!@$%^&*()-_=+[{]}\|;:',./?およびGrave (backtick)はプレーンテキストとして渡されます。

、_"_、_<_および_>_は、それぞれ_%20_、_%22_、_%3C_および_%3E_に変換されます。

_#_は、ye olde anchor によって使用されるため、無視されます。

個人的に、私は弾丸をかみ、base64でエンコードすると言います:)

4
jimmetry

英数字およびすべて

~-_.!*'(),

uRL内で有効です。

他のすべての文字はエンコードする必要があります。

4
womp

URI(URNおよびURLを含む)のエンコードに関するすべてのルールは、RFC1738およびRFC3986で指定されています。ここに、これらの長く退屈なドキュメントのTL; DRがあります。

パーセントエンコーディングは、URLエンコーディングとも呼ばれ、特定の状況下でURIの情報をエンコードするメカニズムです。 URIで許可される文字は、予約されているか予約されていないかのいずれかです。予約文字とは、特別な意味を持つことがある文字のことですが、エンコードが必要な文字はそれだけではありません。

エンコードを必要としない予約されていない文字が66個あります:_abcdefghiklmopqrstuvwABCDEFGHIKLMOPQRSTUVWXYZ0123456789-_.~_

エンコードする必要がある予約文字は18個あります:!*'();:@&=+$,/?#[]、および他のすべての文字はエンコードする必要があります。

文字をパーセントエンコードするには、「%」とそのASCII値を16進数で連結します。PHP関数「urlencode」および「rawurlencode」は、この作業を行います。

2
Nino Filiu

"." | "!" | "~" | "*" | "'" | "(" | ")"も使用できます [RFC2396] 。本当に、適切にエンコードされていれば、何でもGETパラメーターに含めることができます。

0
geowa4