中途面接にて聞かれたこと。
セキュリティの話になり、どのような対処をしていたかという話になりました。
IDやPWをフォームに入力した際に、そのまま入力されたフォームの値を利用すると
SELECT * FROM member_table WHERE ID=’$id’ AND PASS=’$pass’;
というクエリの場合に、
SELECT * FROM member_table WHERE ID=’hogeid’ AND PASS=’hogepass’;
と入力され、特定のユーザの情報を引っ張ってこれると思うが、
たとえば、IDの部分に「’ OR 1=1 OR ID=’」と入力されると、
SELECT * FROM member_table WHERE ID=” OR 1=1 OR ID=” AND PASS=’hogepass’;
となり、どんなデータでも引っ張ってこれてしまうという恐ろしい事が実行できてしまいます。
まあ、セキュリティも何も無いって感じですね。
これを防ぐ為に、入力値のチェックをしなければならないのですが、
一番簡単な方法としては、シングルクォートを取ってしまうという事。
preg_replaceを利用して、文字を置き換えるのは一つのやり方として、
「もともとPHPの関数でそうゆうの用意されてるよね?」って聞かれた。
答えれませんでした\(^o^)/
たぶんこれのことよね。
- addslashes() – addslashes: 文字列をスラッシュでクォートする (String 関数) – PHPプロ!マニュアル
このaddslashes関数をかませることで、「’」文字を削除するのではなく「\’」として検索させるのです。
SELECT * FROM member_table WHERE ID=’\’ OR 1=1 OR ID=\” AND PASS=’hogepass’;
※PostgreSqlでは”って書かないとダメだっけ?
もしかしたら、IDや名前に「’」を使ってる人がいるかも知れませんもんね。
というわけで、自分へのメモってことで。
/ > でもそんなの関係ねぇ!
< \ そんなの関係ねぇ!
〇/ はい!
/| オッパッピー!!
/>
関連PHP関数
- stripcslashes() – stripcslashes: addcslashes でクォートされた文字列をアンクォートする (String 関数) – PHPプロ!マニュアル
- stripslashes() – stripslashes: クォートされた文字列のクォート部分を取り除く (String 関数) – PHPプロ!マニュアル
- addcslashes() – addcslashes: C 言語と同様にスラッシュで文字列をクォートする (String 関数) – PHPプロ!マニュアル
- htmlspecialchars() – htmlspecialchars: 特殊文字を HTML エンティティに変換する (String 関数) – PHPプロ!マニュアル
- quotemeta() – quotemeta: メタ文字をクォートする (String 関数) – PHPプロ!マニュアル
- get_magic_quotes_gpc() – get_magic_quotes_gpc: magic_quotes_gpc の現在の設定を得る (PHP オプション/情報 関数) – PHPプロ!マニュアル
コメントを残す