ユーザー入力を受け取り、それを MySQL 正規表現として使用する簡単な Perl スクリプトを作成しています。ボビーテーブルのナンセンスなしで合格できるようにしたいと思います。特に、あらゆる種類の特殊文字を許可し、引用自体から抜け出す可能性のあるものはすべて拒否したいと考えています。
コードは次のようなものです。
my $myRegex = join(' ', @ARGV);
# ...other code...
sendToSQL("select blah from foo where bar regexp '$myRegex'");
特に、\(...\)
andのような構造を維持する必要があります。それらをand\.
に変更することはできません。これはすでに存在しているはずの単純なもののように感じます-私はここで車輪を再発明しないようにしています.\\\(...\\\)
\\.
このスクリプトは、SSH 経由で信頼できるユーザー (私を含む 3 人のうちの 1 人) からのみ入力を受け取るため、「原則として」文字列をチェックせずに渡すことができます。しかし、うっかり部分的なコマンドを SQL にリークして奇妙な結果を出すよりも、正直な間違いを検出できれば、私はずっと気分が良くなります。(これ自体はセキュリティ上の問題ではありません。スクリプトにアクセスできるユーザーは、既に mySQL を直接実行できます。)
編集: 提案された複製は、私の問題にわずかに関連しており、確かに複製ではありません。私は DBI を使用しておらず、私の懸念はインジェクション攻撃ではありません。懸念は、ユーザーが悪意のあるデータベースで悪意のあるコードを実行することではなく、ユーザーが不注意でデータベースの副作用を引き起こさないことです。(スクリプトを使用するには、MySQL に直接アクセスできる必要があります。この場合、データベースに任意の変更を加えることができます。)