SQLインジェクションを実際にやってみる

2021/10/01 05:00

SQLインジェクションの脆弱性について起きる仕組みや実際にサンプルを用いた実演を交えてお伝えしています。システム開発の中でSQLをテキストで組み立てる場合に発生しやすいもので、被害が甚大になりやすいことでも知られています。2本それぞれ15分程度の動画です。

SQLインジェクションとは

システムの中でSQLを組み立てるコードに問題がある場合、悪意のある第三者からの不正なリクエストによって、非公開の情報を奪取されたり、情報の改竄や削除が行われるものです。

対策

「ユーザーの入力した文字列を信用してはいけない」ということがよく言われますが、これもその考え方を踏襲することが大切です。

プレースホルダを使うこと

大抵は「?」をプレースホルダにしてSQLの組み立てを文字列連結で作らない仕組みがあります。プレースホルダに実際の値を当て込める(バインドと言います)処理を行う際にSQLの特殊文字の置き換えが行われます。

  • PreparedStatement(プリペアドステートメント)
  • フレームワーク等で提供されているプレースホルダ機能

プレースホルダが使えない場合には以下のような自前のエスケープ処理を行う必要があるでしょう。

  • 自前でのSQLの特殊文字のエスケープ処理

フレームワークや外部ライブラリを使っている場合

大抵の推奨される使い方をしている場合には自動で安全にされていることが多いですが、自分でSQLを書かなければならない場合には、配布元資料で調べてから実装していくことをオススメします。「PlaceHolder」や「Bind」のような単語で示されていることが多いと思います。

解説に利用したコード ~ Sample code ~

https://github.com/CircleAround/simple-koa-bbs/pull/8

参考

以下のIPAの資料は大変網羅的なので是非一度目を通してみてください。今回ですと同じページで提供されている「安全なSQLの呼び出し方」も合わせて確認されると良いでしょう。

安全なウェブサイトの作り方

この記事を書いた人

佐藤 正志

サークルアラウンド株式会社 代表取締役