私はPostgreSQLと話す比較的小さなアプリケーションを開発しており、SQLインジェクションからの保護に関して、どれだけ遠すぎるかについてのフィードバックを得たいと考えていました。SQL tablenameインジェクションからの保護 - どのくらい遠すぎますか?
アプリケーションはPerlであり、ORMモジュール(DBIのみ)は使用しません。 SQL文は、プレースホルダと、典型的な形に構成されています。
my $sql = "SELECT * FROM $cfg->{tablename} WHERE foo = ?";
my $sth = $dbh->prepare($sql);
$sth->execute('bar');
テーブル名が補間された理由は、アプリケーションが列「foo」を持っているすべてが、複数のテーブルに対して同じ操作を実行しなければならないことです。
?プレースホルダは、単純なSQLインジェクション攻撃の大部分を保護します。私の質問はtablenameの周りにあり、プレースホルダを使用することはできません。このテーブルはconfigファイルからのものですが、アプリケーションは--configfileスイッチをサポートして、別の設定ファイルを使用します。
データベースの資格情報は、設定ファイルに保存されます。したがって、攻撃者が$ cfg - > {tablename}が何か悪意のあるものに置き換えられた設定ファイルを作ったり、デフォルトのものを置き換えたりすると、悪意のあるコードが実行される可能性があります。
攻撃者がこれを行うには、有効なデータベース資格情報が必要です。そうしないと、アプリケーションは接続されません。彼らが信任状を持っているならば、DBIを使って独自のコードを作成するか、psql cliを使って悪意のあるものを行うことができます。
私はこれに対して保護するための2つの方法を参照してください。私は$ orm-のために何かをやっていると思います。その場合にはORMに
- スイッチ、> get_class_for_table($ cfgの - > {テーブル名を}
- SQL文を準備する前にテーブル名をサニタイズするために正規表現を使用し
- 使用$ dbh-> quote_identifier()
明らかに第二の方法は、「安いと陽気」1である。しかし、文を与えられましたaこれらのアプローチのどちらかが本当に保証されていますか?どのようにそれだけで、実際の攻撃を防ぐ努力とは対照的に、(別の攻撃ベクトルを使用する攻撃者を強制することになると多くの努力が多すぎる
攻撃者が既に設定ファイルを書き換えてデータベースに接続できるのであれば、アプリを介してSQLインジェクション攻撃をするのはなぜでしょうか?フロントドアが開いているときに2階の窓に寄っています。 – Schwern
これは正確に私の質問でした。実際にセキュリティを向上させない場合は、動的SQLからORMに切り替える価値がありますか?私はそうするよう圧力をかけられていて、既に私の質問にあった何かを行うための技術的な方法(正規表現のサニタイズ)に対して、より多くの議論を望んでいた。 –