SQL文やコマンド実行には命令と引数を分離するAPIがあります。便利なAPIなのですが、安全性について根本的な勘違いが多いです。
- プリペアードクエリ系のAPIさえ使っていれば安全
- execv系のAPIさえ使っていれば安全
これらは大きな勘違いです。
- データ処理の安全性は”出力先”の処理に依存する
SQLのデータもコマンド実行のデータも、そのデータ出力の安全性は出力先(コンテクスト)でどのように処理されるかに依存します。
SQLインジェクションもコマンドインジェクションも1つでも間違いがあると大問題となる脆弱性ですが、大きな勘違いはかなり広く浸透しています。どこからこんな”とんでもない誤解”が生まれて、広まるのでしょうか?
なぜ大きな勘違い/間違いであるのか、既にブログに書いているので詳しくはこれらを参照してください。
これら2つを勘違いしていると致命的なセキュリティ問題を何時作ってもおかしくありません。
数学の公式だけ覚えて間違った使い方をする、と同類の間違いです。教育システムが根本的な原因?
「これさえ使えば良い」といったモノでも、「これさえ使えば良い」には前提条件があり、それが揃っていないと使えないモノが多いです。
誤った前提条件でないか?検証することは可能です。