URI
RFC 3986 STD: 66 Uniform Resource Identifier (URI): Generic Syntax
場所ベースの URL と 名前ベースの URN (urn:ではじまるもの)をあわせた名前空間。どちらもURI。 RFC 3987 IRI ではドメイン以外の部分も含めた国際化に対応していてURIに変換も可能。 RFC 3305 でURL, URNの分け方をやめてまとめてURIとして扱うことになっていたり。そうは言ってもRFC 8141にURNがあったり言い換える必要は低そうなので出てきた世代の名前で呼べばよさそう。
URIの括りでできたacctなどをURLかURNか分ける必要もなく。
ABNFで表記できるがURL Standardになるとそれもなくなってしまう。 code:URI
hier-part = "//" authority path-abempty
/ path-absolute
/ path-rootless
/ path-empty
authority (サーバ等)が含まれない場合、"//" を使ってはいけないことになっている のて file:/// などは不可 ?
code:path
path = path-abempty ; "/" ではじまるか空
/ path-absolute ; "//" ではない "/" ではじまる
/ path-noscheme ; ":"コロンなしsegment ではじまり
/ path-rootless ; segment ではじまり
/ path-empty ; 文字ゼロ
well-known RFC 8615
URI
URL 基本的に名称はURIに統合される
ftp
telnet
tel
gopher
mailserver / mailto / imap / pop
ssh
tag RFC 4151
URN urn: ではじまること RFC 8141 Section 7 RFCなど
xmpp
scheme
RFC 2396 → 3986 URI構文
RFC 2718 → 4395 → 7595 URI Scheme のガイドラインと登録手順
%エンコード
RFC 3986で更新されている
JavaScriptなどにある encodeURI と encodeURIComponent などの違いもあり
table:符号化
RFC 2396 RFC 2732 RFC 3986
ALPHA ◎ ◎ ◎
DIGIT ◎ ◎ ◎
alphanum ALPHA + DIGIT ALPHA + DIGIT 削除
gen-delims :/?#[]@
sub-delims !$&'()*+,;=
reserved ;/?:@&=+$, ;/?:@&=+$,[] gen-delims + sub-delims
unwise ()|\^[] ()|\^ 削除
mark -_.!~*'() 削除
unreserved alphanum + mark ALPHA + DIGIT + -._~
pchar unreserved + pct-encoded + sub-delims + :@
query文字 pchar + /?
unwise が %符号化の基準になっていたのかな、RFC 3986では消滅しているのでunreserved を使う?
pchar はqueryの区切り文字も含む
URI,URLでの利用を考慮したBASE64URLがあるのでunreservedの場所などで利用できる query
query文字として通るものを通しておくと制御文字、0x80以降の他は ? & = 程度を追加エスケープすればよさそう
パースルールはサーバなどで決めるのでqueryとして通ればURIでは問題ない?
table:query ASCII
20 30 40 50 60 70
00 E - 0 GA @ - P E? ` - p
01 SA ! - 1 - A - Q - a - q
02 E " - 2 - B - R - b - r
03 GE # - 3 - C - S - c - s
04 SA $ - 4 - D - T - d - t
05 C % - 5 - E - U - e - u
06 S & - 6 - F - V - f - v
07 S ' - 7 - G - W - g - w
08 SA ( - 8 - H - X - h - x
09 SA ) - 9 - I - Y - i - y
0A SA * GA : - J - Z - j - z
0B S + SA ; - K GE [ - k E? {
0C SA , E < - L E \ - l E? |
0D - - S = - M GE ] - m E? }
0E - . E > - N E? ^ - n - ~
0F GA / GE ? - O - _ - o
GE,E エスケープ必要 gen-delims 他
- unreserved エスケープしないほうが良い
SA,GA ASCII記述可
S sub-delims内でエスケープ必要?
C 制御文字(エスケープ必要)
と解釈できそうなもの
エスケープが必要(な場合がある)
gen-delims からは :/?@ の4もじがエスケープ除外されているが?はqueryで利用するので?#[]がエスケープ推奨
"?" "#" はqueryの区切り文字 "?" は前と "#" は flagment と区別する(開始の"?"は推奨程度?)
"[" "]" はIP文字で他の位置で利用禁止
":" 場合によって区切り文字として使われるので必要?
sub-delims
"'" しんぐるくおーと URL区切り文字として使われることがあるのでそのときはエスケープ必須 (queryではなくURI, URLとしてエスケープすればいいかな)
"=" queryの代入文字として使われるので内容としてはエスケープ必須
"&"代入の区切りとして":"とどちらかが使われるので必須
"+" query (URI)では不要? URLの GETやPOSTの場合必要だったり
他
""" だぶるくぉーと、"'" しんぐるくぉーと、" " すぺーすで区切られる可能性があるのでその文字はエスケープ必要
"%" ";" 文字エスケープなのでエスケープ必要 HTMLの %amp; などの場合があり";"は必要に応じて
""" はIP文字としてエスケープ対象になっている。アドレス以外で利用禁止されているのでqueryではエスケープ必要?
BASE64URLにする場合はBASE64と比較してスペース置き換えの"+"とフォルダ区切りの"/"を"-"と"_"に置き換えPaddingの"="を省略する。
query以外でも使えそうな変更がされている
どこで安全か安全ではないか、という基準でunreserved 以外フルエスケープから最低限のエスケープまでいろいろできる