ホームページ >バックエンド開発 >PHPチュートリアル >SQLインジェクションの脆弱性を効果的に防ぐ方法を詳しく解説_PHPチュートリアル
1. 動的に構築された SQL ステートメントにパラメーターが含まれている場合は、パラメーターに対して次の操作を実行してください。
a. '(一重引用符) を ''(2 つの一重引用符) に置き換えます
b. -- (コメント文字) を置き換えます
c. ステートメントにパラメーターを追加する場合は、必ず前後に引用符を追加してください。「select * from table where id='''+@id+'''' などの追加
」
2. 動的に構築された SQL ステートメントにテーブル パラメーターが含まれている場合は、次のようにテーブルに [] (角括弧) を追加しないでください。 'select * from ['+@tab+']'
4. データの検証: クライアント IE で Web ページの特殊効果を使用してユーザー入力データの正当性を検証することは、実際にはあまり効果的ではありません。開発者は、ユーザーがデータを厳密に検証できると想定すべきではありません。法的データを入力します。アプリケーション内のセミコロン、引用符、括弧、SQL キーワードなどを必ず確認してください。正規表現を使用すると、複雑なパターン マッチングを実行でき、正規表現を使用すると良好な結果が得られます。
××× Web サイトのアドレス帳表示プログラムは、personid を渡す必要があります。アドレス帳表示プログラムは、データの正当性の検証を行わずに personid を直接取得し、personid は文字列変数であるため、personid は url パラメータを通じて渡すことができます。 personid を取得するコードは次のとおりです:
if (getparameter(req,"personid")!=null){このプログラムで結合される動的 SQL ステートメントは次のとおりです:personid=getparameter(req,"personid").trim();
}その他{
personid="";
}
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 は上記のパラメーターが文字であることを意味します)
paratype=1 の場合
薄暗いパラバリュー
paravalue=リクエスト(パラメータ名)isnumeric(paravalue) でない場合は
記事のIDなどのint型パラメータの場合、まずそれが整数であるかどうかを判断できます。
response.write "パラメータ" & paraname & "数値型でなければなりません!" response.end
の場合は終了 それ以外は
paravalue=replace(paravalue,"'","''")
したら終了 セーフリクエスト=パラバリュー
関数終了
上記機能の応用
id =trim(request("id"))
if id<>"" then
数値(id)でない場合はResponse.write「数値パラメータを入力してください」http://www.bkjia.com/PHPjc/629725.html応答.終了
終了したら
id = clng(id)
それ以外
response.write「パラメータIDを入力してください」
応答.終了
終了したら
www.bkjia.com