2009-07-03 13 views
4

私は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これらのアプローチのどちらかが本当に保証されていますか?どのようにそれだけで、実際の攻撃を防ぐ努力とは対照的に、(別の攻撃ベクトルを使用する攻撃者を強制することになると多くの努力が多すぎる

+1

攻撃者が既に設定ファイルを書き換えてデータベースに接続できるのであれば、アプリを介してSQLインジェクション攻撃をするのはなぜでしょうか?フロントドアが開いているときに2階の窓に寄っています。 – Schwern

+0

これは正確に私の質問でした。実際にセキュリティを向上させない場合は、動的SQLからORMに切り替える価値がありますか?私はそうするよう圧力をかけられていて、既に私の質問にあった何かを行うための技術的な方法(正規表現のサニタイズ)に対して、より多くの議論を望んでいた。 –

答えて

10

使用quote_identifier:?これらのケースでは

my $sql = "SELECT * FROM ". 
    $dbh->quote_identifier($cfg->{tablename}). 
    " WHERE foo = ?"; 
+0

これを可能性として反映するための質問を更新した正規表現スタイルの墨塗りを行う)。 私の本当の疑問は残っています:攻撃者がquote_identifierがあなたを保存する位置にいる場合、彼らはpsql経由で同じことをするポジションにいます。 –

+0

もちろん、DBのログインとパスを知っている攻撃者からあなたを救うことはできません。しかし、より多くのばかなアプリを作成します。また、DBログインデータが他の場所に格納されている場合は、攻撃に役立ちます。 の間に、quote_identifier()はテーブル名からシンボルを削除しません。引用符のようなシンボルをエスケープし、あなたのDBに対応する引用符で囲みます。 –

+0

興味深い詳細:quote_identifierはOracleでは機能しません。 – Massa

1

、I自分のバージョンのプレースホルダーを作成して、テーブル名として挿入する値をチェックして、それが期待しているテーブル名であることを確認します。

私は正規表現を使用して名前をサニタイズしません。それは許可された名前のあなたのリストに入っています、またはそれは間違っていて、あなたはそれらにエラーを与えます。

関連する問題