記事個別表示 (3083)
これは「水無月ばけらのえび日記 : サニタイズの話つづき」に関連するコメントです。
[3083] Re: 「サニタイズの話つづき」
名無しさん (2005年7月19日 12時59分)
ここにこの投稿をくっつけると話が唐突になるかもしれませんが、続きで読んでもらっていると期待して…
>>>高木さんの言う「適切にプログラムを記述す」るというのは、データや命令等について、情報としてのメタレベルを適切に判断し、それらをそれぞれのメタレベルに合わせて適切に扱う、ということではないでしょうか。
>>の意味は伝わったでしょうか?
>
> 特に難しい表現ではないと思うので、私は私なりに理解できたつもりではあります。しかし、名無しさんの意図と一致しているかどうかは分かりません。
> 伝わっているかどうか怪しいと思われているのであれば、例を挙げて説明していただけると分かりやすいかと。
引き続き SQL 文を例として使います。すでに特定の文脈で例として適切でなかったとありますが、このことが説明の障害にはならないと考えています。
ここでは文字集合とその符号化方式について考えます。
SQL 文を発行するときには、その文を書くために使える文字集合と符号化方式がそのプロセッサの仕様として定義されているはずです。同一の機能を実現するための手段が複数あったとしても、それは定義されています。
その SQL 文において、文字列リテラルとして使える文字集合と(広い意味での)符号化方式は SQL 文そのものに使えるそれらとは異なっているのが通常です。そうでなければ、たとえば(文字列を固定長とするなどの他の手段を用いない限り)文字列リテラルの終了をプロセッサが認識できないからです。こちらの文字集合と符号化方式もプロセッサの仕様として定義されているはずです。
この文字集合と符号化方式のセットが文字列リテラルの書式の一部を構成しています。
SQL 文を書くときには、この書式を守らないことには話になりません。つまり SQL 文のプロセッサには、そのプロセッサの仕様に従った文字集合と符号化方式に従ったデータを渡す必要があるわけです。このこと自体には異論はないと思います。
これに対して、フォームで文字列を入力として受け取る事を考えます。
その文字列の文字集合と符号化方式は上の SQL 文のプロセッサの仕様とはまったく関係のないところで決まります。
その文字列を SQL 文のプロセッサに渡すためには、当然、調整が必要になります。
入力文字列をその符号化方式に従ってデコードし、それを SQL 文のプロセッサの仕様に従った文字列リテラルにエンコードして SQL 文を構成する必要があります(コード上は明示的におこなわれないことがあるかもしれませんが、その場合でも暗示的にはおこなわれており、抽象的には必須の過程です)。
ここで具体的にこれらの文字集合と符号化方式を見ると、それらはそれぞれかなりの部分が重なって、ほとんど同じになっているケースも多いのではないかと思います。
しかし実際にはそれらはそれぞれに固有で別個のものです。特に入力文字列と文字列リテラルのそれはほぼ確実に内容も異なります。
これが何を表すのかは必要ならば後で述べますが、必要ないかとも思います。
「単引用符がそのまま SQL に渡る」のような表現は上記の観点からはあいまいな表現になってしまっていると思われます。
SQL 文のプロセッサが文字列リテラルに使えると定義する文字集合が単引用符を含む限り、「文字としての」単引用符はそのまま渡せるわけです。適切な符号化方式が使われている限り。
符号化方式を無視して何らかのビット列をそのまま SQL 文のプロセッサに渡したとしたら、それはむしろきっと意味的には同じデータをそのまま渡せていないことになります。
とりあえず、ここまででコメントいただけますか?
これは「水無月ばけらのえび日記 : サニタイズの話つづき」に関連するコメントです。
全読: [3083]Re: 「サニタイズの話つづき」からのスレッド(4件)]