2011-07-29 10 views
3

私はMSSQLデータベースへの接続にADOdbを使用しています。 SQLインジェクションを防ぐのに十分なのでしょうか?これは安全ですか? ADOdb準備文

私が使用していますプリペアドクエリは次のとおりです。

 $db = ADONewConnection('odbc_mssql'); 
     $dsn = "Driver={SQL Server};Server=SERVNAME;Database=DBNAME;"; 
     $ADODB_COUNTRECS = false; 

     $db->Connect($dsn,'LOGIN','PASS'); 

     $sql = 'SELECT login, etc FROM users WHERE login ='.$db->Param('0').' AND pass ='.$db->Param('1').''; 
     $stmt = $db->Prepare($sql); 
     $stmt = $db->Execute($stmt,array("$user_id","$psw")); 

ORあなたはおそらくPDOへの切り替えをお勧めですか?

答えて

6

なぜ誰もこれに答えることはできませんでした。私は思ったほど神秘的なやり方で働いています;)とにかく、私はある程度の自信を持ってこれに自分自身で答えることができるように十分に研究しました。

はい、mysql_real_escape_stringのが効果的に機能を脱出単なる文字列です:いくつかの賢明な人々が言っ​​ているようので、本質的に用意したクエリでそう

は、mysql_real_escape_string();としてエスケープだけ入力よりもはるかに安全です。それは魔法の弾丸ではありません。単一のクエリ文字列で安全に使用できるように、危険な文字をエスケープするだけです。ただし、事前に入力を害さないと、特定の攻撃経路に対して脆弱になります。完全な答えに

リンク:mysql_real_escape_string

だから私はエスケープ対私のプリペアドステートメントをテストするためにやっていること - 私はシンプルな提出フォームを作り、mysql_real_escape_string();で入力をサニタイズしようとしましたが、確かにそれはのような例を挙げて失敗しています"1 OR 1=1"、一部の人々はそのように単一引用符内のエスケープ値を追加することを示唆:

$クエリ= "mydbというSELECT * FROM WHERE ID = '"。。$ escapedID」'「;

"1 OR 1=1"の例を防ぐのに役立ちますが、確かにこれはベストプラクティスではありません。エスケープの問題は、クエリロジックを悪意のある方法で変更する人たちを守ることができないことです。

これから私はADODBの準備文に固執します。 SQLインジェクションに関する

$dbConnection = NewADOConnection($connectionString); 
    $sqlResult = $dbConnection->Execute( 
    'SELECT user_id,first_name,last_name FROM users WHERE username=? AND password=?' 
    , array($_POST['username'], sha1($_POST['password'])); 

他の非常に有用な質問:

上記の私の元の質問の1、または bobby-tablesウェブサイトからの短いバージョンと同様に

また、このビデオを見て、それが把握するSQLインジェクションは非常に簡単になります:

+0

あなたの推論から1あなたが適切に問題を理解していると言うことはできません。 1.一重引用符は保護しません。あなたの例のクエリは、それらがなくても失敗するだけです(正真正銘の 'name'フィールドには何らかの文字が含まれていると仮定します)。 2。エスケープすると、該当する場合は、「クエリロジックを悪意のある方法で変更する人々から保護します」と確信しています。私はADODBの準備文の中に何が入っているのか分からないが、(少なくとも互換性のために)それは同じ古き良きエスケープだと思う。 4.フィールド名を動的に追加する必要がある場合は、優れた実践例のいずれも示していません。 –

+0

違反行為をしないでください。私はその問題に集中しています。外見ではなく、一部の言い回しが無礼であると感じる場合は、意図的にではありません。 –

+1

私は建設的な批判を気にしない:) 1.あなたは正しい、私の間違いは、IDではない名前でなければなりません。 2.エスケープに関しては、実際には私の結論ではありません。http://www.slideshare.net/billkarwin/sql-injection-myths-and-fallaciesスライド47を見てください。3.私はあまりよく分かりませんが、準備された照会は通常の照会とは少し異なります。 4.フィールド名を動的に挿入するには、同じビデオ 'SQL Injection Myths&Fallacies'で提案されている「ホワイトリスト」アプローチを使用します。例を含める必要があります。 – GEMI

関連する問題