2011-12-14 17 views
2

私は私が働いている開発者が使用しているいくつかのZend Frameworkのコードを探しています、そしてそれに、私は以下を参照してください。今Zend FrameworkのSQLインジェクションの保護

$select = new Zend_Db_Select($DB); 
$sql = $select->where("id ='".$id."'");    

を、$ idがどこにもサニタイズされていませんプレースホルダを使用すると、Zend経由の注入からしか保護されていないという印象を受けました。この文字列は脆弱です。

コードクレームの著者は、この場合でもzendがそれを処理しますが、ドキュメントではそうは言いませんが、私は見つけることができません。

これが実際に安全であれば誰でもクリアできるのですか?

答えて

5

あなたは正しいです。他の開発者は間違っています。

hereのマニュアルを参照すると、例20で議論されているページの最後に、パラメータがユーザーの入力から来た場合、SQLインジェクションの対象となるコメントがあります。例20は、貼り付けたコードと同じことを行うことです。 (あなたのコードには一重引用符が含まれていますが、もちろんこれで安全になるわけではありません)

この安全ではなく、それほどクリーンな方法で書かれたプレースホルダを無視する理由はわかりません。

$id = 3; 
$where = $this->getAdapter()->quoteInto("id =?', $ id); 

結果:

+0

ありがとう、私はここで検証していただきありがとうございます。私はZendフレームワークに精通していませんが、私が知っていることに基づいて...それは間違っているようでした。 :) – Will

0

プレースホルダを使用すると、Zendはデータを消毒します。

$select = new Zend_Db_Select($DB); 
$sql = $select->where("id = ? ", $id); 
+0

はい、私はそれが保護されることを知っていますが、元の著者は彼の意思も主張しています。私はそれが間違っていると信じています。ただ検証しようとしています。 – Will

+0

私はZendとその衛生技術に精通していませんが、whereメソッドの文字列を念頭に置くとデータ*が消滅する可能性があります。私。 $ db_obj-> method()への入力をすべて消毒します。 – Brendan

+1

あなたのケースでは、データは消されません。 '$ id =" 1 "OR" 1 ";のようなものを渡し、結果のSQLクエリを見てください。プレースホルダはZendの変数と似ています。プレースホルダをどう扱うかを知っています。フィルタをかける/検証する方法、手動で生成された文字列を渡すと、そのままの状態で実行されます。 – Minras

1

私はこれを行う

id = '3' 

をこの方法では、自動的に正しくSQLを構築する単一引用符を追加します。私はそれが非常に効率的だと思います。

関連する問題