引き続き、体系的に学ぶ 安全なWebアプリケーションの作り方を読んだので、覚えたい部分を記事にしていく。
入力処理
入力処理では、入力値に対して以下の処理を行う。
- 文字エンコーディングの妥当性検証
- 文字エンコーディングの変換
- 入力値の妥当性検証
文字エンコーディングって?
文字をコンピュータで使えるように数字に変換する処理のこと。
変換する文字コードは複数の種類があるため、同じ文字でも異なる文字コードでは異なる数字に変換される。
jsでiconv-liteを使用して文字エンコーディングについて確認する。
var iconv = require("iconv-lite");
let buf = iconv.encode("testです。", "utf-8");
console.log(buf); // <Buffer 74 65 73 74 e3 81 a7 e3 81 99 e3 80 82>
let buf2 = iconv.encode("testです。", "Shift_JIS");
console.log(buf2); // <Buffer 74 65 73 74 82 c5 82 b7 81 42>
let test = iconv.decode(buf, "Shift_JIS");
console.log(test); // test縺ァ縺吶�
let test2 = iconv.decode(buf, "utf-8");
console.log(test2); // testです。
utf-8とshift_jisでエンコードすると異なる数値に変換されていることがわかる。
utf-8でエンコーディングしたものをutf-8とshift_jisでデコード(数値→文字列)すると、utf-8は正常に変換できるが、shift_jisは文字化けする。
入力値の検証
本来は数値だけしか入らないのに、文字を入力できてしまうと、
その値はDBに登録されるとき、エラーになる。
といった現象が起こるので、入力値の検証は必要。
メインは上記のようなエラーを防ぐことが目的だけど、セキュリティ向上にもつながる。
- SQLインジェクションの対策をしていなかったが、英数字のみを許可していたため、実害には至らない
などなど。
バイナリセーフ
バイナリセーフとは、入力値がどんなバイト列であっても正しく扱えること。
値ゼロのバイト(ヌルバイト)が現れても正しくしょるできることを主に指す。
ヌルバイトは、C言語やUnix、WindowsのAPIでは、ヌルバイトを文字列の終端とみなす取り決めがある。
なので、一部関数では途中でヌルバイトが現れるとそこが文字列の終端だと誤解してしまう。
こういった関数はバイナリセーフでない関数と呼ぶ。
ヌルバイト攻撃
ヌルバイトを使った攻撃をヌルバイト攻撃と呼ぶ。