2011-07-20 15 views
0

SQLインジェクションに対して、パラメータ化されたクエリの使用とデータの検証とは別の対策があるかどうかを知りたかったのです。 ありがとう!SQLインジェクション防止:最大対策

+0

データベースを使用しないでください。 – Jacob

+0

私の重要な追加と共に受け入れられた答え[PHPでSQLインジェクションを止める最善の方法](http://stackoverflow.com/questions/60174/best-way-to-stop-sql-injection-in-php)それをすべて。 –

答えて

0

すべてのテーブルをスキャンしてテーブル名とカラムのホワイトリストを作成するスクリプトを作成し、それを使用してテーブル/カラム名になるすべてのユーザ入力を検証しますパラメトリッククエリーに入りません。それ以外のものはPDO Bind!

0

明らかに、クライアント側で実行していることに加えて、サーバー側のデータも検証していることを確認してください。

また、ウェブで話している場合は、すべてのデータ、つまり、クエリ文字列とCookieの値フィールドとフォームフィールドを検証していることを確認してください。

私はこれがGoogleで最初のヒットである知っているが、私は(再びウェブに関連)随時この記事を読み返すと、実際にそれを評価します: http://www.securiteam.com/securityreviews/5DP0N1P76E.html

+0

しかし、検証の問題ではありませんか?私は、検証と準備された陳述以上のものがあるかどうかを知りたかったのです。コメントありがとうと私はリンクを読む(最初の一見から良いようです) –

0

私はいつもを通じて私のユーザーの入力テキストを実行しますカスタムサニタサーバー側では、すべての厄介なものを取り除くことができます。 (& "= 'etc)

私は、私が呼び出すストアドプロシージャを除いて私のコードには何もSQLステートメントを持っていないので、たとえ脆弱性が見つかったとしても、ストアドプロシージャを調べる必要があります

ストリング "123456"と "12345"とUNION SELECT *を期待している場合は、ストアドプロシージャのパラメータで、VARCHAR(10)などのテキストサイズを制限することができます。INNER JOIN MEMBER_ADDRESS "ON ID"が来ると、ストアドプロシージャはそれを好きにしません。

最後の1つのポイントは、戻って来るすべての例外をキャッチし、それらを正常に処理しようとします。 ebsitesは "データベースに接続できませんでした、USER_ID 'はmydatabase.memberに存在しません"というような内容を表示します。あなたのデータベースのアーキテクチャーで誰かに嗅覚を与えると、悪用のためにボールが回転し始めます。

+0

ありがとう。質問してもいいですか?私はGoogleができることを知っているが、ただ誰かに説明するのが良い。単一のSQL文なしではどうしますか?どのようにストアドプロシージャを作成しますか? ありがとう! –

+0

確かに、それはあなたが持っているSQLデータベースに依存します。ほとんどの人がLinuxサーバーにいるのと同じように、デフォルトでMySQL(5.X.X)を持っています。これが私の個人的な好みです。ストアドプロシージャは、基本的には、データベースに格納されているプロシージャ(メソッドのようなもの)です。 あなたはこのようなものを使用してSPを作成することができます(DBにSQLの直接実行): は がMy_ID = _idテストから SELECT *をBEGIN(_idのINT(10)に) 'my_db'.'get_my_user'をCREATE PROCEDUREを。 END 次に、このSQL文を実行して、そのプロシージャをコールします。sql = "call get_my_user($ value)"; – tutts

+0

は、 'call get_my_user($ value)'は通常のSQLクエリであるため、同じ脆弱性があります。 –

関連する問題