こう 聞かれます
- 「SQL インジェクションとは
何ですか。 どう 防ぎますか」 - 「検索の
語を SQL の 文字列に つないで 組み立てる コードが あります。 何が 問題ですか」 - 「入力の
'を消せば 防げますか」 (守りの 中心を 分かっているかを 確かめる形)
面接官が 見ている点
- 入力が
「値」ではなく 「SQL の 文」として 読まれてしまう、と 仕組みで話せるか - 守りの
中心に、 プレースホルダーを 使った 書き方を 挙げられるか - 記号を
消すような 手の 守りに 頼らない こと、 権限を 絞って 被害を 小さく する ことまで言えるか
短い答え
- SQL インジェクションは、
入力を SQL の 文字列に つないだせいで、 入力が 値ではなく SQL の 文の 一部として 読まれてしまう穴です。 - 防ぎ方の
中心は、 プレースホルダーを 使い、 SQL の 形と 値を 分けて データベースに 渡す ことです。 - 加えて、
アプリが 使う データベースの 利用者の 権限を、 要る 操作だけに 絞って 被害を 小さくします。
少し 詳しい答え
なぜ起きるか
入力を' が
JavaScript
const v = "x' OR '1'='1";
const q = `name = '${v}'`;
console.log(q);name = 'x' OR '1'='1'入力のOR '1'='1' が、
プレースホルダーで分ける
WHERE name = ? のように
ORM を
被害を 小さくする
アプリの
作った' を
よく ある間違い
- 「
'を消せば 防げる」と言う 記号を 消す守りは 漏れやすく、 正しい 入力まで 壊します。 プレースホルダーで 値と SQL を分けます - 「ORM を
使っているから 起きない」と言う 生の SQL に 文字列を つなぐ所が あれば起きます - 「入力欄で
文字数を 絞れば 大丈夫」と言う 要求は 画面を 通さずに 送れます。 守りは サーバーの SQL の 組み立て方で行います
深掘りの問い
- 「並べ替えの
列を 利用者に 選ばせるには」列名は 値として 渡せないので、 許す列名の 一覧から 選ぶ形に する、と答えます - 「プレースホルダーを
使えば、 入力の 確かめは 要りませんか」 SQL の 穴は 防げますが、 長さや 形の 確かめは 別の 目的で 要る、と答えます - 「穴が
あった とき、 被害を 小さく するには」 データベースの 利用者の 権限を 絞る、 エラーの 中身を 画面に 出さない、と答えます