SQL インジェクション攻撃 (SQL インジェクション) とは、攻撃者が慎重に作成した SQL ステートメントをフォームに送信し、Web プログラムが送信されたデータをチェックしない場合に、SQL インジェクション攻撃を引き起こします。
SQL インジェクション攻撃の一般的な手順:
1. 攻撃者は SQL インジェクションの脆弱性のあるサイトにアクセスし、インジェクション ポイントを探します
2. 攻撃者はインジェクション ステートメントを構築し、そのインジェクション ステートメントを SQL ステートメントと結合します。新しい SQL ステートメントを生成するプログラム
3. 新しい SQL ステートメントが処理のためにデータベースに送信されます
4. データベースが新しい SQL ステートメントを実行し、SQL インジェクション攻撃を引き起こします
データベースCREATE TABLE `postmessage` ( `id` int(11) NOT NULL auto_increment, `subject` varchar(60) NOT NULL default ”, `name` varchar(40) NOT NULL default ”, `email` varchar(25) NOT NULL default ”, `question` mediumtext NOT NULL, `postdate` datetime NOT NULL default ’0000-00-00 00:00:00′, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=gb2312 COMMENT=’运用者的留言’ AUTO_INCREMENT=69 ; grant all privileges on ch3.* to ‘sectop’@localhost identified by ’123456′; //add.php 插入留言 //list.php 留言列表 //show.php 显示留言
レコードは 1 回ではなく 1 回クエリされました
//show.php 行 12-15//mysql クエリを実行します。 state$query = "select * from postmessage where id = " .$_GET["id"];$result = mysql_query($query)or die("ySQL クエリ ステートメントの実行に失敗しました:" . mysql_error ());パラメータ ID とその前の文字が渡された後、結合された SQL ステートメントをデータベースに入れてクエリを実行します送信して 1=1 を実行すると、ステートメントは select * from postmessage where id = 71 となり、 1=1. このステートメントの前後の値はすべて true であり、その後の と も true であるため、クエリされたデータが送信され、1=2 となり、ステートメントは select * from postmessage where id = 71 となります。 1=2。このステートメントの最初の値は true、最後の値は false、次の値は false であり、データをクエリすることはできません通常の SQL クエリは、構築したステートメントを通過した後、SQL インジェクション攻撃を形成します。 。この注入ポイントを通じて、たとえば、union を使用して管理パスワードを読み取る、データベース情報を読み取る、または mysql のload_file を使用して outfile やその他の関数にさらに侵入する権限を取得できます。 防止方法整数パラメータ:intval関数を使用してデータを整数に変換関数プロトタイプint intval (mixed var, int Base)varは整数に変換される変数baseを選択できます。これは基本的な数値で、デフォルトは 10 です浮動小数点パラメータ: floatval または doubleval 関数を使用して、それぞれ単精度と倍精度の浮動小数点パラメータを変換します関数のプロトタイプint floatval (mixed var )var は変換される変数です int doubleval (混合 var) var は変換される変数です 文字パラメータ: addslashes 関数を使用して一重引用符 "'" を "'" と二重引用符に変換します引用符「"」は「"」に、バックスラッシュ「」は「\」に変換され、NULL文字とバックスラッシュ「"関数プロトタイプ文字列はラッシュを追加します(文字列str)strはチェックされる文字列ですこれで、次のようにコードの抜け穴を修正できます// mysqlクエリステートメントを実行します$query = "select * from postmessage where id = ".intval($_GET["id"]);$result = mysql_query( $query)or die("ySQL クエリ ステートメントの実行に失敗しました: " .mysql_error());
文字型の場合は、まず magic_quotes_gpc を On にできるかどうかを判断し、その場合は addslashes を使用してエスケープします。特殊文字
if(get_magic_quotes_gpc())
{
$var = $_GET["var"] }
else
{
$var =addslashes($_GET[ "var"]) ;
}
上記はPHP脆弱性解決策(5) - SQLインジェクション攻撃の内容です。 PHP 中国語 Web サイト (www.php.cn) に注意してください。