ホームページ >バックエンド開発 >PHPチュートリアル >SQLインジェクションの脆弱性を効果的に防ぐ方法を詳しく解説_PHPチュートリアル

SQLインジェクションの脆弱性を効果的に防ぐ方法を詳しく解説_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-13 17:09:351301ブラウズ

1. 動的に構築された SQL ステートメントにパラメーターが含まれている場合は、パラメーターに対して次の操作を実行してください。 a. '(一重引用符) を ''(2 つの一重引用符) に置き換えます
b. -- (コメント文字) を置き換えます
c. ステートメントにパラメーターを追加する場合は、必ず前後に引用符を追加してください。「select * from table where id='''+@id+'''' などの追加
」 2. 動的に構築された SQL ステートメントにテーブル パラメーターが含まれている場合は、次のようにテーブルに [] (角括弧) を追加しないでください。 'select * from ['+@tab+']'

3. 動的 SQL ステートメントを避ける: 特に、IE クライアントからクエリ、変更、削除条件を取得するフィールドは、挿入される可能性が最も高くなります。たとえば、上記のクライアントから取得した personid は、クライアントから取得した persongid として直接使用されます。開発の便宜上、SQL ステートメントの条件では personid に対して必要なチェックが行われないため、開発中に SQL ステートメントを実行する場合は、PreparedStatement クラスを使用することをお勧めします。

4. データの検証: クライアント IE で Web ページの特殊効果を使用してユーザー入力データの正当性を検証することは、実際にはあまり効果的ではありません。開発者は、ユーザーがデータを厳密に検証できると想定すべきではありません。法的データを入力します。アプリケーション内のセミコロン、引用符、括弧、SQL キーワードなどを必ず確認してください。正規表現を使用すると、複雑なパターン マッチングを実行でき、正規表現を使用すると良好な結果が得られます。

××× Web サイトのアドレス帳表示プログラムは、personid を渡す必要があります。アドレス帳表示プログラムは、データの正当性の検証を行わずに personid を直接取得し、personid は文字列変数であるため、personid は url パラメータを通じて渡すことができます。 personid を取得するコードは次のとおりです:

if (getparameter(req,"personid")!=null){

personid=getparameter(req,"personid").trim();

}その他{

personid="";

}

このプログラムで結合される動的 SQL ステートメントは次のとおりです:

personsql="select * from table name where userid="+long.tostring(userid)+" and addrcontactid="+personid;

プログラムは personid が整数であるかどうかをチェックしないため、攻撃者が次の URL を入力すると、personid に値を無造作に割り当て、後続のプログラム ロジックを実行し続けることができます。

http://www.----------------------?personid=6414 または 2=2

結合された SQL ステートメントは次のとおりです:

userid=1433620 および addrcontactid=6414 または 2=2 のテーブル名から * を選択

予防方法

SQL インジェクションの脆弱性は、「数千マイルの堤防がアリの巣の中で崩壊する」と言えます。この種の脆弱性は、通常、プログラマのインジェクションに対する理解の欠如によって引き起こされます。プログラムのフィルタリングが厳密でないか、特定のパラメータのチェックが忘れられています。ここでは、ASP チュートリアルの request 関数を置き換える関数を紹介します。関数は次のとおりです。

関数セーフリクエスト(paraname,paratype)

'--- パラメータを渡す ---
'paraname: パラメータ名 - 文字型

'paratype: パラメーターの型 - 数値型 (1 は上記のパラメーターが数値であることを意味し、0 は上記のパラメーターが文字であることを意味します)

薄暗いパラバリュー
paravalue=リクエスト(パラメータ名)

paratype=1 の場合

isnumeric(paravalue) でない場合は
response.write "パラメータ" & paraname & "数値型でなければなりません!" response.end

の場合は終了 それ以外は
paravalue=replace(paravalue,"'","''")

したら終了 セーフリクエスト=パラバリュー
関数終了


上記機能の応用

記事のIDなどのint型パラメータの場合、まずそれが整数であるかどうかを判断できます。

id =trim(request("id"))

if id<>"" then

数値(id)でない場合は
Response.write「数値パラメータを入力してください」

応答.終了
終了したら
id = clng(id)
それ以外
response.write「パラメータIDを入力してください」
応答.終了
終了したら



http://www.bkjia.com/PHPjc/629725.html

www.bkjia.com

http://www.bkjia.com/PHPjc/629725.html技術記事 1. 動的に構築された SQL ステートメントにパラメーターが含まれている場合は、パラメーターに対して次の操作を実行します。 a. ' (一重引用符) を '' (2 つの一重引用符) に置き換えます。 b. -- (コメント文字) を c. に置き換えます。ステートメントにパラメーターを追加する場合...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。