SQLインジェクション対策で入力値をどう扱うか
基本情報技術者試験 平成30年度春期 午前 問41 / セキュリティ › セキュリティ実装技術
過去問にチャレンジ
SQLインジェクション攻撃による被害を防ぐ方法はどれか。
- ア
入力された文字が,データベースへの問合せや操作において,特別な意味をもつ文字として解釈されないようにする。
- イ
入力にHTMLタグが含まれていたら,HTMLタグとして解釈されない他の文字列に置き換える。
- ウ
入力に上位ディレクトリを指定する文字列(../)が含まれているときは受け付けない。
- エ
入力の全体の長さが制限を超えているときは受け付けない。
会話形式の解説
講師この問題では、入力値がSQL文の一部として解釈されるかどうかに注目します。
受験者入力を制限する方法がいくつもあります。どれがSQLへの対策なのか迷います。
講師入力された文字が、データベースへの問合せで特別な意味をもつ文字として扱われたら、何が起きますか。
受験者入力値がSQLの構文として働き、不正な問合せや操作につながります。文字をそのように解釈させない方法が正解ですね。
講師そのとおりです。では、HTMLタグとして解釈させない処理は、どこでの解釈を防いでいますか。
受験者HTMLでの解釈です。XSSへの対策で、SQLへの入力値の渡し方は直していません。
講師では、「../」を含む入力を拒む方法はどうでしょうか。
受験者上位ディレクトリを指定する記述なので、ディレクトリトラバーサルへの対策です。
講師入力の長さを制限する方法だけで、SQLの構文としての解釈を防げますか。
受験者防げません。短い入力でもSQLの構文として働く可能性があります。文字数と解釈のされ方は別ですね。
講師正解は、入力文字をデータベースへの問合せや操作で特別な意味をもつ文字として解釈させない方法です。実装では、プレースホルダを使ってSQL文と入力値を分ける方法があります。
まとめ
SQLインジェクションを防ぐには、入力値がSQLの構文として解釈されないようにします。HTMLタグの解釈を抑える処理はXSSへの対策です。「../」の拒否はディレクトリトラバーサルへの対策に当たります。入力の長さだけを制限しても、SQLの構文として働くことは防げません。
解答・解説
正解はアです
この問題のテーマ
SQLインジェクションを防ぐために、入力値をどう扱うべきかを問う問題です。
解き方の考え方
入力された文字がSQL文の構文として解釈されると、不正な問合せや操作につながります。各選択肢がSQLの構文解釈を防ぐ処理か、それとも別の問題への対策かを見分けます。実装では、プレースホルダを使ってSQL文と入力値を分ける方法があります。
選択肢ごとの解説
- ○ア 入力された文字が,データベースへの問合せや操作において,特別な意味をもつ文字として解釈されないようにする。アは、入力文字をデータベースへの問合せや操作で特別な意味をもつ文字として解釈させない方法です。入力値がSQLの構文として働く経路を断つので、設問に合います。
- ×イ 入力にHTMLタグが含まれていたら,HTMLタグとして解釈されない他の文字列に置き換える。イは、入力中のHTMLタグをタグとして解釈させない処理です。これはXSSへの対策であり、SQLの構文として入力が扱われることへの対策ではありません。
- ×ウ 入力に上位ディレクトリを指定する文字列(../)が含まれているときは受け付けない。ウは、入力に含まれる「../」を拒む処理です。上位ディレクトリを指定してファイルにアクセスするディレクトリトラバーサルへの対策に当たります。
- ×エ 入力の全体の長さが制限を超えているときは受け付けない。エは入力の長さだけを調べる方法です。短い入力でもSQLの構文として働く可能性があるため、長さの制限だけでは防げません。
POINT
- 入力値の文字数と、その文字がSQLでどう解釈されるかは別の問題です。
- HTMLの解釈を抑える処理は、SQLへの入力値の渡し方を代わりに直してはくれません。
- 「../」はディレクトリの移動に関わる記述です。
