エンコードまたはエスケープせずにGETパラメーターで許可されるのはどの文字ですか?私はこのようなことを意味します:
http://www.example.org/page.php?name=XYZ
XYZの代わりに何がありますか?私は次のキャラクターだけだと思う:
これは完全なリストですか、それとも追加の文字が許可されていますか?
あなたが私を助けてくれることを願っています。前もって感謝します!
予約文字があり、予約された意味を持ち、それらは区切り文字です—_:/?#[]@
_ —およびサブデリミタ—!$&'()*+,;=
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セパレーターです。
他の文字のエンコードは許可されていますが、必須ではありません。
RFC 1738 からURLで許可される文字:
英数字、特殊文字「$ -_。+!* '()」、および予約目的で使用される予約文字のみをURL内でエンコードせずに使用できます。
予約文字は「;」、「/」、「?」、「:」、「@」、「=」および「&」です。つまり、使用する場合はURLエンコードする必要があります。
Chromeアドレスバーとbashの_$QUERY_STRING
_を使用してテストを行い、次のことを確認しました。
~!@$%^&*()-_=+[{]}\|;:',./?
およびGrave (backtick)
はプレーンテキストとして渡されます。
、_"
_、_<
_および_>
_は、それぞれ_%20
_、_%22
_、_%3C
_および_%3E
_に変換されます。
_#
_は、ye olde anchor によって使用されるため、無視されます。
個人的に、私は弾丸をかみ、base64でエンコードすると言います:)
英数字およびすべて
~
-
_
.
!
*
'
(
)
,
uRL内で有効です。
他のすべての文字はエンコードする必要があります。
URI(URNおよびURLを含む)のエンコードに関するすべてのルールは、RFC1738およびRFC3986で指定されています。ここに、これらの長く退屈なドキュメントのTL; DRがあります。
パーセントエンコーディングは、URLエンコーディングとも呼ばれ、特定の状況下でURIの情報をエンコードするメカニズムです。 URIで許可される文字は、予約されているか予約されていないかのいずれかです。予約文字とは、特別な意味を持つことがある文字のことですが、エンコードが必要な文字はそれだけではありません。
エンコードを必要としない予約されていない文字が66個あります:_abcdefghiklmopqrstuvwABCDEFGHIKLMOPQRSTUVWXYZ0123456789-_.~
_
エンコードする必要がある予約文字は18個あります:!*'();:@&=+$,/?#[]
、および他のすべての文字はエンコードする必要があります。
文字をパーセントエンコードするには、「%」とそのASCII値を16進数で連結します。PHP関数「urlencode」および「rawurlencode」は、この作業を行います。
"." | "!" | "~" | "*" | "'" | "(" | ")"
も使用できます [RFC2396] 。本当に、適切にエンコードされていれば、何でもGETパラメーターに含めることができます。