ホームページ > バックエンド開発 > PHPチュートリアル > PHP のアンチ SQL インジェクション手法の概要と分析_PHP チュートリアル

PHP のアンチ SQL インジェクション手法の概要と分析_PHP チュートリアル

WBOY
リリース: 2016-07-13 17:10:50
オリジナル
1603 人が閲覧しました

SQL インジェクションは、プログラム開発において誰もがよく考慮する問題です。必要な場合は、一般的な SQL インジェクション防止コードを分析してください。

1. PHP 送信データのフィルタリングの基本原則

1) 変数をデータベースに送信するときは、フィルター処理に addlashes() を使用する必要があります。たとえば、注入の問題は 1 つの addslashes() だけで解決できます。実際、変数値に関しては、 intval() 関数も文字列のフィルタリングに適しています。

2) php.iniでmagic_quotes_gpcとmagic_quotes_runtimeを有効にします。 magic_quotes_gpc は、get、post、cookie の引用符をスラッシュに変更できます。 magic_quotes_runtime は、データベースに出入りするデータにおいて書式設定の役割を果たします。実際、このパラメータは、インジェクションが夢中になっていた昔から非常に人気がありました。

コードは次のとおりです コードをコピー


if ( isset($_POST["f_login"] ) )
{
// データベースに接続します...
//...コードは省略されています...

// ユーザーが存在するかどうかを確認します
$t_strUname = $_POST["f_uname"];
$t_strPwd = $_POST["f_pwd"];
$t_strSQL = "SELECT * FROM tbl_users WHERE ユーザー名 = '$t_strUname' AND パスワード = '$t_strPwd' LIMIT 0,1";

if ( $t_hRes = mysql_query($t_strSQL) )
{
// クエリが成功した後の処理 少し...
}
}
?>

サンプルテスト

<フォームメソッド=ポストアクション="">
ユーザー名:

パスワード:




3) システム関数を使用する場合は、システム関数を安心して使用できるように、escapeshellarg() およびscapeshellcmd() パラメータを使用してフィルタリングする必要があります。

4) クロスサイトの場合、strip_tags() と htmlspecialchars() の両方のパラメーターが有効であり、ユーザーが送信した html と php のタグはすべて変換されます。たとえば、山括弧「<」は「<」などの無害な文字に変換されます。

コードは次のとおりです コードをコピー
$new = htmlspecialchars("テスト", ENT_QUOTES);
ストリップタグ($text,);

5) 関連する関数のフィルタリングについては、先ほどの include()、unlink、fopen() などと同様に、操作を実行したい変数を指定するか、関連する文字を厳密にフィルタリングする限り、問題ないと思います。完璧になります。

2. PHP を使用した簡単なデータ フィルタリング

1) ストレージ: トリム($str)、スラッシュを追加($str)
2) デポジット: ストリップスラッシュ($str)
3) 表示: htmlspecialchars(nl2br($str))

1. 注射攻撃の種類

攻撃の動機にはさまざまな種類があるかもしれませんが、一見したところ、さらに多くの種類があるように見えます。これは、悪意のあるユーザーが複数のクエリを実行する方法を見つけた場合に当てはまります。これについては、この記事の後半で詳しく説明します。

など スクリプトが SELECT 命令を実行している場合、攻撃者は、以下に示すように、「1=1」などの条件を WHERE 句に挿入することで、テーブル内のすべての行を強制的に表示できます (挿入された部分は太字で示されています)。 ):

コードは次のとおりです コードをコピー

品種 = 'ラグレイン' または 1=1;' のワインから * 選択してください

前に説明したように、これはテーブルの一般的な構造 (単純なレコードでは不可能なもの) を明らかにするだけでなく、機密情報を含むレコードを明らかにする可能性があるため、それ自体が有益な情報になる可能性があります。
更新された指令は、より差し迫った脅威をもたらす可能性があります。 SET 句に他の属性を入れることで、攻撃者は、次の例 (挿入された部分が太字で示されている) のように、現在更新中のレコード内の任意のフィールドを変更できます。

コードは次のとおりですコードをコピー
ワインを更新SET type='red','vintage'='9999' WHEREvariation='lagrein'

更新命令の WHERE 句に 1=1 などの true 条件を追加すると、次の例のように、この変更の範囲をすべてのレコードに拡張できます (注入部分が太字で示されています)。

コードは次のとおりですワインを更新 SET type='red','vintage'='9999 WHEREvariation='lagrein' OR 1=1;'おそらく最も危険な命令は DELETE です - 想像するのは難しくありません。注入手法はこれまでに説明したものと同じです。以下の例のように、WHERE 句を変更することで影響を受けるレコードの範囲を拡張します (注入された部分が太字です)。
コードをコピー


コードは次のとおりですコードをコピー品種 = 'ラグレイン' OR 1=1; のワインから削除します 2. 複数のクエリインジェクション 複数のクエリ インジェクションは、単一のクエリに複数の破壊的な命令が含まれることを許可するため、攻撃者が引き起こす可能性のある潜在的な被害を悪化させます。 MySQL データベースを使用する場合、攻撃者はクエリに予期しないターミネータを挿入することでこれを簡単に達成できます。挿入された引用符 (一重または二重) は予期される変数の終わりを示し、ディレクティブをセミコロンで終了します。ここで、終了した元のコマンドの最後に追加の攻撃コマンドを追加できます。最終的な破壊的なクエリは次のようになります:
コードは次のとおりです:



コードは次のとおりですコードをコピー品種 = 'ラグレイン' のワインから選択してください 'gotcha';' によって識別された 'BadGuy@%' に *.* のすべてを付与します


このインジェクションにより、新しいユーザー BadGuy が作成され、ネットワーク権限 (すべてのテーブルに対するすべての権限) が付与され、この単純な SELECT ステートメントに「不気味な」パスワードが追加されます。前の記事のアドバイスに従い、プロセス ユーザーの権限を厳密に制限した場合、Web サーバー デーモンには取り消した GRANT 権限がなくなっているため、これは機能しません。しかし理論的には、このような攻撃により、BadGuy はデータベースに対してやりたいことを何でもできるようになる可能性があります。

私が書いたものを以下に共有します

コードは次のとおりです コードをコピー

関数phpsql_show($str){
$str = ストリップスラッシュ($str);
$str = str_replace("\", "", $str);
$str = str_replace("/", "/", $str);
$str = str_replace(" ", " ", $str);
$str = str_replace(",", ",", $str);
$str;
を返します }
関数 phpsql_post($str){
$str = ストリップスラッシュ($str);
$str = str_replace("|", "|", $str);
$str = str_replace("<", "<", $str);
$str = str_replace(">", ">", $str);
$str = str_replace(" ", " ", $str);
$str = str_replace(" ", " ", $str);
$str = str_replace("(", "(", $str);
$str = str_replace(")", ")", $str);
$str = str_replace("`", "`", $str);
//$str = str_replace("'", "'", $str);
$str = str_replace('"', """, $str);
$str = str_replace(",", ",", $str);
$str = str_replace("$", "$", $str);
$str = str_replace("", "\", $str);
$str = str_replace("/", "/", $str);
$str;
を返します }
関数 phpsql_replace($str){
$str = ストリップスラッシュ($str);
$str = str_replace("'", "'", $str);
$str;
を返します }


要約すると:

*addslashes() は強制的に追加されます
* mysql_real_escape_string() は文字セットを決定しますが、PHP バージョンの要件があります
* mysql_escape_string は接続の現在の文字セットを考慮しません。

dz での SQL インジェクションを防ぐには、addslashes 関数を使用します。同時に、dthmlspecialchars 関数にいくつかの置換があります $string = preg_replace(/&((((d{3,5}|x[a- fA-F0-9 ]{4}));)/, &1, この置換により、インジェクションの問題が解決され、中国語の文字化けに関するいくつかの問題も解決されます

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/629645.html技術記事 SQL インジェクションは、プログラム開発において誰もがよく考慮する問題です。必要な場合は、一般的な SQL インジェクション防止コードを分析してください。 1.phpデータを送信...
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート