見出し画像

Facebookから【バイナリセーフとバイナリアンセーフ】

深夜というか早朝に、鎮痛剤が効いて就寝するまでに書いたことがあるので転記しておきます。


【バイナリセーフとバイナリアンセーフ】

ちょっと、連投ですが鎮痛剤が効いたらすぐ寝ようと思いましたが、少しまだ寝苦しそうなので一つだけ書いてから寝ます。バイナリセーフとバイナリアンセーフの話。

多少専門的になりますが、今日少し書いた主に多バイト文字の文字列処理などに関係する話題となります。これも、私も全て知っているわけではありませんが、各プログラミング言語において文字列を扱う関数やメソッドには、バイナリセーフとバイナリアンセーフがあります。

文字列は、内部表現を見るとそれを表現する文字コードによる数値表現ですが、そこに多少イレギュラーな入力をすることで、本来は文字としては定義されないコードや数値が挿入される場合もあります。典型的には、主にC言語等で用いられるいわゆる終端文字(ヌルバイト)などで、こうした文字が文字列中に想定外に含まれる場合、扱う内容によっては正しい処理がなされないことがあります。

こうした、いわゆるASCIIやUTF-8と言ったコード体系での文字としての表現外のコードを扱っても、問題を起こさない関数やメソッドを一般に「バイナリセーフ」と言います。反対に、先ほど述べた例のように、例えばヌルバイトが文字列中に不正に含まれる場合に、想定されない処理が発生し得る関数やメソッドを「バイナリアンセーフ」と呼びます。

一般に、大抵のスクリプト言語では、通常は文字列の入出力にはいわゆる高水準の入出力関数やメソッドが使用されるケースが多いと思います。この場合は、扱うものにもよりますが大抵はバイナリアンセーフであることが多く、大抵の場合はそれで大きな問題はありませんが、ユーザー側の入力がより可変で想定外の入力の考慮の必要がある場合は、それを想定してバイナリセーフを用いることが適切である場合もあります。

典型的には、例えばHTTPにおけるヘッダー部分において、ユーザー側が何らかの形で細工をしてヘッダー文字列の中に開発者側が想定しないヌルバイトと言った文字を含ませる場合に、そこが言語や扱う関数・メソッドによっては「終端文字」として認識されてしまい、これも開発者側が意図しないヘッダー文字列の分割という事態が発生する場合があります。これも一つの例ですが、これを一般に「ヘッダー分割攻撃」と呼ぶ場合があり、こうした入力に備えるためにそれを扱う部分についてはバイナリセーフな関数やメソッドの利用が必須の場合があります。

寝る前に軽く書いたものなのでここまでにしますが、例をあげた典型的なヌルバイト以外にも、コードによっては各種の制御コードが含まれる場合もあるので、そうした文字以外の入力に対して何らかの考慮が必要な場合は、バイナリセーフまたはバイナリアンセーフの利用についての知識及び検討は開発の上で必要なケースが多々ある、という話になります。今回は、軽く以上といたします。

いいなと思ったら応援しよう!