#####SQLコードインジェクション防止の8のベストプラクティス
https://snyk.io/blog/sql-injection-cheat-sheet/
######第5章です。
- クライアントサイドの入力バリデーションに依存しない
- 制限された権限を持つデータベースユーザーを使用する
- プリペアドステートメントとクエリパラメータ化を使用する
- コードをスキャンしてSQLインジェクションの脆弱性を探す
- ORMレイヤーを使用する
- ブロックリストに依存しない
- 入力バリデーションを行う
- ストアドプロシージャに注意する
5.ORMレイヤーを使用する
オブジェクトリレーショナルマッピング(ORM)レイヤーの使用の検討も推奨しています。ORMレイヤーは、データベースからのデータをオブジェクトに、またはその逆に変換します。ORMライブラリを使用すると、明示的なSQLクエリを減らすことができ、SQLインジェクションに対する脆弱性を大幅に低減できます。
既存のORMライブラリのいくつかの優れた例としてJavaのHibernate およびEntityFramework for C#があります。これらのORMライブラリの使用により、オブジェクトとデータベーステーブル間のマッピングを行うための雛型となるコードを自動生成することが可能です。
これならば、SQLクエリに自分で関与する必要さえありません。
とはいえ、カスタムクエリを作成する必要がある場合は、ここで問題が発生します。JavaのHibermateには、独自のHibernateクエリ言語(HQL)があります。HQLクエリをコンパイルするときは、インジェクションに再度注意し、プリペアドステートメントと同様に機能するcreateQuery()
関数を使用する必要があります。
JavaScriptの場合、sequelizeのようなよく知られたORMライブラリも利用できます。sequelizeを使用すると、値をデータベース内の特定のタイプにマップする方法を定義できます。しかし、最終的に、ORMライブラリはロジックをSQLステートメントに変換し直す必要があります。したがって、これらのライブラリがパラメータの適切なエスケープを実装していると考えられます。
ORMライブラリにSQLインジェクションの問題が含まれていないことを確認するには、既知の脆弱性がないかをスキャンする必要があります。間違った古いバージョンのsequelizeまたはhibernateの使用によっても、問題が発生することがあります。Snyk Open Sourceを使ってプロジェクトをチェックすることにより、ライブラリ内の隠されたSQLインジェクションや他の多くの問題を防止することができます。
5つめは以上です。
最後までお読みいただきありがとうございました!
######次回はSQLインジェクションを防ぐ 〜6に続きます。
SQLインジェクションに関する英語全原文はこちらです。
######Contents provided by:
Jesse Casman, Fumiko Doi, Content Strategists for Snyk, Japan, and Randell Degges, Community Manager for Snyk Global