ホームページ  >  記事  >  バックエンド開発  >  包括的な PHP Web サイトのインジェクション対策プログラム_PHP チュートリアル

包括的な PHP Web サイトのインジェクション対策プログラム_PHP チュートリアル

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

これは、PHP と SQL を組み合わせた包括的なアンチインジェクション プログラムです。PHP では主に get、post、cooke、file をフィルタリングし、SQL では削除および更新のクエリ コマンドを検出およびフィルタリングします。

SQLインジェクション攻撃の一般的な考え方

· SQL インジェクションの場所を検出します。 ·バックグラウンドデータベースのタイプを決定します。 ·XP_CMDSHELLの実行可能性を判断する
·WEB仮想ディレクトリを発見する
·ASP、php、jsp トロイの木馬をアップロードします。 ·管理者権限を取得します;


//PHP サイト全体のアンチインジェクション プログラム、このファイルをパブリック ファイルに require_once する必要があります

//magic_quotes_gpc ステータスを決定します


コードは次のとおりですコードをコピーif (@get_magic_quotes_gpc ()) { $_GET = 秒 ( $_GET ); $_POST = 秒 ( $_POST ); $_COOKIE = 秒 ( $_COOKIE ); $_FILES = 秒 ( $_FILES ); } $_SERVER = 秒 ( $_SERVER ); 関数 sec(&$array) {
// 配列の場合は、配列を走査して再帰的に呼び出します
if (is_array ( $array )) {
foreach ( $array as $k => $v ) {
$array [$k] = 秒 ( $v ); }
} else if (is_string ( $array )) {
//addslashes関数を使って処理します
$array = ラッシュを追加します ( $array ); } else if (is_numeric ( $array )) {
$array = 整数 ( $array ); }
$配列を返す
}



1.整数パラメータの判定

入力パラメータ YY が整数の場合、通常、abc.asp 内の元の SQL ステートメントはおおよそ次のようになります:
select * from table name where field=YY なので、次の手順を使用して SQL インジェクションが存在するかどうかをテストできます。
①HTTP://xxx.xxx.xxx/abc.asp?p=YY’(シングルクォーテーション付き) このとき、abc.ASP内のSQL文は
となります。 select * from table name where field=YY’、abc.asp が異常実行します
②HTTP://xxx.xxx.xxx/abc.asp?p=YY かつ 1=1 の場合、abc.asp は正常に実行され、結果は HTTP://xxx.xxx.xxx/abc.asp?p と同じになります。 =YY ; ③HTTP://xxx.xxx.xxx/abc.asp?p=YY で 1=2、abc.asp が異常動作します。 上記の 3 つの手順が完全に満たされている場合は、abc.asp に SQL インジェクションの脆弱性が存在するはずです。
上記に基づいて、整数フィルター関数を作成します

コードは次のとおりです


コードをコピー




関数 num_check($id) {

if (! $id) {

die ( 'パラメータを空にすることはできません!' ); } //空かどうかを判断する

else if (inject_check ( $id )) { die ('不正なパラメータ' ); } //判定を注入する else if (! is_numetic ( $id )) { //数値判定 $id を返す }
die ('不正なパラメータ' ); } $id = 整数 ( $id ); //整数

//文字フィルター関数
関数 str_check($str) {
if (inject_check ( $str )) {
die ('不正なパラメータ' ); }
// 判定を注入する
$str = htmlspecialchars ( $str ); //HTMLを変換
$str を返します。 }
関数 search_check($str) {
$str = str_replace ( "_", "_", $str ); //「_」をフィルターで除外します
$str = str_replace ( "%", "%", $str ); //「%」を除外します
$str = htmlspecialchars ( $str ); //HTMLを変換
$str を返します。 }
//フォームフィルター関数
関数 post_check($str, $min, $max) {
if (isset ( $min ) && strlen ( $str ) < $min) {

die ('最小 $min バイト'); } else if (isset ( $max ) && strlen ( $str ) > $max) {

die ('最大 $max バイト'); }
ストリップスラッシュ配列を返します ( $str ); }



入力パラメータ YY が文字列の場合、通常、abc.asp 内の元の SQL ステートメントはおおよそ次のようになります:
select * from table name where field='YY' なので、次の手順を使用して SQL インジェクションが存在するかどうかをテストできます。
①HTTP://xxx.xxx.xxx/abc.asp?p=YY’(シングルクォーテーション付き) このとき、abc.ASP内のSQL文は
となります。 select * from table name where field=YY’、abc.asp が異常実行します
②HTTP://xxx.xxx.xxx/abc.asp?p=YY&;nb ... 39;1'='1'、abc.asp は正常に動作し、HTTP://xxx.xxx.xxx と同じです。 /abc .asp?p=YY の実行結果は同じです
③HTTP://xxx.xxx.xxx/abc.asp?p=YY&;nb ... 39;1'='2'、abc.asp が異常実行します。 上記の 3 つの手順が完全に満たされている場合は、abc.asp に SQL インジェクションの脆弱性が存在するはずです。

コードは次のとおりですコードをコピーこの記事で紹介されている注射予防法は比較的包括的なものです。試したり、より良い方法を考え出すこともできます。
//アンチインジェクション機能

関数 inject_check($sql_str) {
return eregi ( 'select|inert|update|delete|'|/*|*|../|./|UNION|into|load_file|outfile', $sql_str ); // www.hzhuti.com はインジェクションを防ぐためにフィルタリングされています
}

関数tripslashes_array(&$array) {

if (is_array ( $array )) {

foreach ( $array as $k => $v ) {
$array [$k] = ストリップスラッシュ_配列 ( $v ); }
} else if (is_string ( $array )) {
$array = ストリップスラッシュ ( $array ); }
$配列を返す
}



?>

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

www.bkjia.com

http://www.bkjia.com/PHPjc/629668.html技術記事これは、PHP と SQL を組み合わせた包括的なアンチインジェクション プログラムです。PHP では、主に get、post、cooke、ファイルをフィルタリングし、SQL では削除および更新クエリ コマンドを実行します。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。