正しいSQLインジェクション対策とそのロジック
ここから話を発展させて,
SQL文の動的な組み立て方には
(出展:
動的プレースホルダは,
(出展:
静的プレースホルダは動的プレースホルダよりやや安全です。ですが,
- 文字列連結による組み立ては,
アプリケーションの開発者の無知や不注意によりSQLインジェクションの可能性がある - 動的プレースホルダはライブラリのバグによりSQLインジェクションの可能性がある
- 静的プレースホルダは原理的にSQLインジェクションの可能性がない
ということなので,
PHPのコマンドインジェクション対策について
「htmlspecialchars()やintval()を使っておけば対策されると思ってい良いのでしょうか?」
コマンドインジェクション対策には,
- そもそも外部呼び出しを避ける
- 外部由来のデータをsystem関数に指定しない
- 可能であれば,
シェルを介在しないコマンド実行を用いる - system関数等の引数を安全な関数を用いてエスケープ処理をする
たとえば,
- escapeshellarg:使用可能
- escapeshellcmd:使用禁止
このescapeshellcmdが使用禁止になっている理由の解説もありました。シングルクオート
ユーザが入力した文字列をmailコマンドで安全に送信したい
ユーザがフォームに入力した文字列を受け取り,
echo ${入力文字列} | mail -s 'タイトル' 宛先@mail
のようにmailコマンドで送信したい,
質問にある脆弱なサンプルはsystem関数の引数の中に外部変数があるため,
Fizzbuzzの問題とコピペプログラマ
また,
多くのエンジニアがFizzbuzzをかけないと話題になりましたが,
信じがたいですが,
ただ,
teratail Q&Aではどうなのか?
セキュリティ系の回答者のレベルは高いように感じます。一方,
終わりに
徳丸さんは,
- セキュリティで
「こうすれば安全」 という方法はないので, 個別に覚えていくのが結局は早道になる
― ただし「これだけは危険」 という方法を覚えておき, 避ける必要がある - 『体系的に学ぶ安全なWebアプリケーションの作り方』
を読もう
『体系的に学ぶ安全なWebアプリケーションの作り方』