SQLインジェクションセキュリティ勉強会などの打ち上げで、SQLインジェクションが怖い、どうやってやるのか教えて欲しいという話をされることがあります。そんなわけで、自分の勉強の為にも普段行うPHP/MySQLの記述でSQLインジェクションが発生しないか検証して記事にしてみました。尋ねられてもこの記事を見せれば良いわけだと画策ですよ。対策まとめSQLインジェクションとは結論から書くとSQLインジェクションの基本はアプリケーションのDBに不正なクエリを流し込むことで、開発者が意図しない結果を成立させてしまう攻撃です。以降はコメントになります】を入力する。後はコメントになるので、パスワードに何も入力せずともクエリが成立します。実際に、自分の環境でSQLインジェクションさせてみると感覚的にわかりやすい。appleなど、ユーザIDが予想できるもの、ユーザ名の重複を通知してくれるアプリケーション。これに関してパスワードの部分にSQLインジェクションを利用することで狙ったユーザに対してログインが出来てしまいます...!また、データ量が多いDBに対して、負荷のかかるクエリも打てるので、DoS攻撃に使われるとやっかいです。改ざんはもちろん、SQLインジェクションにより、途中でクエリを終了させ、DELETE文を混入させることで、テーブル丸ごとを削除するといったことも可能です。※SQLインジェクションの検証が出来なくなるので、一般的なフォームのバリデーションは行っていません。Nullも許容します...!予防するにはSQLインジェクションはDBMSの仕様*です。システムの要件を考えながら、意図した動作のみをただ行うように、セキュリティに配慮をした適切なプログラミングによる実装を行うことが大切。具体的には、DBに入ってくるフォームやパラメータのバリデーションチェック、プログラムの書き方、フレームワークが用意してくれている関数の利用で予防できるはずです。*バグと表現するのは実装側。IPAが教えてくれるSQLインジェクションの対策SQL文の組み立ては全てプレースホルダで実装する。SQL文の構成を文字列連結により行う場合は、アプリケーションの変数をSQL文のリテラルとして正しく構成する。ウェブアプリケーションに渡されるパラメータにSQL文を直接指定しない。セキュリティ実装チェックリストつまりどういうことなんでしょう?ソースコードがないとイメージしにくいですよね。今回はPHPを使って実際のコードを掲載します。流れとして、SQLインジェクション攻撃が出来ることを体験してみる。攻撃が通る記述と、対策済みの記述を確認を行います。残念ながら私は毎日業務でプログラムを書いているわけではないので、色々やっているうちに忘れてしまう危険があります・・・!!そんなわけで、プログラム系もぼちぼち記事にしていこうと思います。実践、簡単なデータベース構造と簡単なスクリプトを用意して検証してみます。今回はサクっと簡単に以下を用意しました。次にスクリプトの用意です。今回はPHPで簡単なクラスを用意してみました。<p>IDとパスワードを入力することで情報を確認出来ます。\">脆弱性あり関数</span>で検索しました...。"<h2>ユーザ一覧</h2>";$attackObj->select_table();?><hr/><h2>情報確認</h2><p>IDとパスワードを入力することで情報を確認出来ます。\">脆弱性あり関数</span>で検索しました...。1をつけて、条件文を成立させてしまう。$pass";今回はプログラム側でidのフォームにint型に型指定をしてしまっているので、検証用スクリプトそのままでは攻撃用のクエリが通りませんが、型指定をしないか、string型を指定すると上記のSQLインジェクションが通ります。'';これでコメントを使用したインジェクションが通るようになります。SQLインジェクション対策済み関数を利用してみるフォームにチェックを入れることで、SQLインジェクション対策を行った関数を選択出来るので、チェックを入れて【送信】をクリックします。存在しない無効な値なので、何も表示されません。理想的な結果が返りました。//静的プレースホルダデータベース接続時の処理にて、静的プレースホルダにしているのは共通です。IPAが教えてくれるSQLインジェクションの対策SQL文の組み立ては全てプレースホルダで実装する。SQL文の構成を文字列連結により行う場合は、アプリケーションの変数をSQL文のリテラルとして正しく構成する。ウェブアプリケーションに渡されるパラメータにSQL文を直接指定しない。セキュリティ実装チェックリストここを踏まえて比べてみます。//バインド型指定$stt->execute();prepare()でSQL文をセット入力される変数に対してバインド機構を利用し、更に型を指定バインド機構とは、あらかじめSQL文のひな型を用意し、後から変動個所(プレースホルダ)に実際の値(バインド値)を割り当ててSQL文を生成するデータベースの機能だ。SQL文のひな型とバインド値は個別にデータベースに送られ、構文解析されるので、バインド値に悪意あるSQL文が挿入されても、その実行を阻止することができる(図1-2)。SQLステートメントを書く時に必ずバインド機構を使用すれば、バインド機構に不具合がない限り、SQLインジェクションは不可能だと考えられる。上記を忘れずに行うことが重要。今回はDBへのクエリ対策が主でしたが、バリデーションや出力時のエスケープ処理などきちんと対応を行う必要があります。セキュリティ意識したプログラミングは行数が増えますが、きちんと記述したいところですね!お疲れ様です。セキュリティ企業と連携して、アプリケーション診断やセキュリティサーバホスティングサービスなど行っています。優(エンジニア)システムガーディアン爆弾処理班。アクセス負荷対策やNginxへの移行案件が多いこの頃。SoftLayerやAWSなどクラウド案件も多くなってきました。ProBook6560b467ビューWindows10で文字入力の変換が遅いならチェックを。440ビューSIMフリー端末購入してauに持ち込み機種変更した件システムガーディアン株式会社サイト内に掲載されている文章、及び、画像・写真については著作権等を含むものがあります。ご利用及び引用等不明な場合はお手数ですがお問い合せください。