数日前、Web サイトにユーザーが注入されました。ここで、SQL インジェクションを防ぐための PHP の組み込み処理関数をいくつか紹介します。たとえば、PHP の MySQL 操作関数には、addslashes()、mysql_real_escape_string()、mysql_escape_string() があります。 ) およびその他の関数。
具体的な使用法: addlashes は SQL インジェクションを防止します
多くの国内の PHP プログラマーは依然として SQL インジェクションを防止するために addslashes に依存していますが、中国語での SQL インジェクションを防ぐためのチェックを強化することをお勧めします。 addslashes の問題は、ハッカーが 0xbf27 を使用して一重引用符を置き換えることができるのに対し、addslashes は 0xbf27 を 0xbf5c27 に変更するだけで、有効なマルチバイト文字である 0xbf5c が引き続き一重引用符とみなされ、addslashes が正常にインターセプトできないことです。もちろん、addslashes は役に立たないわけではありません。マルチバイト文字の場合は、mysql_real_escape_string を使用します。
さらに、PHP マニュアルの get_magic_quotes_gpc のコードは次のとおりです。 ;?php
Function post_check($post) {
$post = addlashes($post); // magic_quotes_gpc がオンになっていない場合を修正 送信されたデータのフィルタリング } $post = str_replace("_" , "_", $post); // '_' を除外します $post = str_replace("%", "%", $ post) // ' % ' を除外します}//オープンソースcode phpfensi.com ?>//Or function inject_check($sql_str) { return eregi('select|insert|update|delete| '| function verify_id($id=null) (inject_check($id) ) { exit('送信されたパラメータは不正です! ');} // 判定の注入 Elseif (! IS_NUMERIC ($ ID)) {exit (' 送信されたパラメータが不正です! ');} // デジタル判定 $ ID = intVal ($ ID); // 全体型付き全体 接続の現在の文字セットを考慮して、unescaped_string 内の特殊文字をエスケープします。これにより、mysql_query() で安全に使用できます。注: mysql_real_escape_string() は、% と _.mysql_real_escape _string,例# 1 mysql_real_escape_string() の例、コードは次のとおりです: $item = "ザックとデリックのラップトップ" ; $escaped_item = mysql_real_escape_string ( $item ) ; printf ( "エスケープされた文字列: % sn" , $escaped_item ); ?& gt; //上記の例では、次の出力が生成されます: // エスケープされた文字列: Zak's and Derick's Laptop mysql_escape_stringThis関数は unescaped_string をエスケープしますので、 mysql_query() で安全に使用できることを確認してください。
注意: mysql_escape_string() は % と _ をエスケープしません。この関数は mysql_real_escape_string() とまったく同じですが、mysql_real_escape_string() が接続ハンドルを受け入れ、現在の文字セットに従って文字列を転送する点が異なります。 mysql_escape_string() は接続パラメータを受け入れず、現在の文字セット設定を考慮しません。
例 1. mysql_escape_string() の例のコードは次のとおりです:
$item = "Zak's Laptop" ;
$escaped_string($item);
printf ("エスケープされた文字列: %sn", $escaped_item?> 出力:
// エスケープされた文字列: ザックのラップトップ
mysql_ real_escape_string と mysql_escape_string これら 2 つの関数の違い: mysql_real_escape_string は (PHP 4 >= 4.3.0、PHP 5) で使用する必要があります。それ以外の場合は、mysql_escape_string のみを使用できます。 2 つの関数の違いは次のとおりです: mysql_real_escape_string は次のとおりです。接続の現在の文字セットを考慮し、mysql_escape_string は考慮されません。判断を使用して包括的に処理できます。コードは次のとおりです。 function cleanuserinput($dirty){ if (get_magic_quotes_gpc()) { $clean = mysql_real_escape_string(stripslashes($dirty)) ; }else{ $clean = mysql_real_escape_string($dirty) } return $clean;要約すると: * ラッシュを追加します( ) は強制的な追加です。() は文字セットを決定します。ただし、PHP バージョンの要件があります。* mysql_escape_string は接続の現在の文字セットを考慮しません。