ホームページ  >  記事  >  バックエンド開発  >  PHP は SQL インジェクション関数の使用を妨げます

PHP は SQL インジェクション関数の使用を妨げます

WBOY
WBOYオリジナル
2016-07-25 09:12:221220ブラウズ

SQLインジェクションを防ぐには、PHPでaddslashes関数を使用します。

国内の多くの PHP プログラマーは SQL インジェクションを防ぐために依然として addslashes に依存していますが、中国語での SQL インジェクションを防ぐために全員がチェックを強化することをお勧めします。

addslashes の問題は、ハッカーが 0xbf27 を使用して一重引用符を置き換えることができるのに対し、addslashes は 0xbf27 を 0xbf5c27 に変更するだけで、有効なマルチバイト文字とみなされるため、addslashes は正常にインターセプトできないことです。

もちろん、addslashes は、マルチバイト文字の処理に使用されます。mysql_real_escape_string を使用します。

また、PHP マニュアルの get_magic_quotes_gpc 関数の使用方法については、次の例をご覧ください。

例:

  1. function post_check($post)
  2. {
  3. if (!get_magic_quotes_gpc()) // magic_quotes_gpc が開いているかどうかを判断します
  4. {
  5. $post = addlashes($post); // magic_quotes_gpc を実行します。送信されたデータが開かれていないときにフィルタリングします
  6. }
  7. $post = str_replace("_", "_", $post); // '_' をフィルタリングします
  8. $post = str_replace("%", "%" , $post); // ' % ' を除外します
  9. $post = nl2br($post); // 変換を入力します
  10. $post= htmlspecialchars($post); // HTML タグの変換
  11. }
  12. ?> ;
  13. または
  14. function inject_check($sql_str)
  15. {
  16. return eregi('select|insert|update|delete|'|
  17. function verify_id($id=null)
  18. {
  19. if (! $id) { exit('送信されたパラメータがありません!') } // 空かどうかの判定
  20. elseif (inject_check($id)) { exit('送信されたパラメータが不正です!' } // インジェクションの判定
  21. elseif ( !is_numeric($id)) { exit('送信されたパラメータは不正です!') } // 数値判定
  22. $id = intval($id) // 整数化
  23. return $id;
  24. ?>
コードをコピー
string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier ] )

この関数は、unescaped_string 内の特殊文字をエスケープし、接続の現在の文字セットを考慮するため、mysql_query() で安全に使用できます。

注意: mysql_real_escape_string() は % と _ をエスケープしません。

mysql_real_escape_string

例 1、mysql_real_escape_string() の例

    $item = "ザックとデリックのラップトップ" ;
  1. $escaped_item = mysql_real_escape_string ( $item );
  2. printf ( "エスケープされた文字列: %sn" , $escaped_item );
  3. ?>
コードをコピー
出力: エスケープされた文字列: ザックとデリックのラップトップ

mysql_escape_string この関数は unescaped_string をエスケープするため、mysql_query() で安全に使用できます。 注: mysql_escape_string() は % と _ をエスケープしません。 この関数は、mysql_real_escape_string() とまったく同じですが、mysql_real_escape_string() が接続ハンドルを受け入れ、現在の文字セットに従って文字列を転送する点が異なります。 mysql_escape_string() は接続パラメータを受け入れず、現在の文字セット設定を気にしません。

例 1. mysql_escape_string() の例

    $item = "ザックのラップトップ";
  1. $escaped_item = mysql_escape_string($item);
  2. printf ("エスケープされた文字列: %sn", $escaped_item);
  3. ?>
コードをコピー
出力: エスケープされた文字列: Zak のラップトップ

2 つの関数 mysql_real_escape_string と mysql_escape_string の違い: 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_eスケープ文字列( $ ダーティ);
  • }
  • return $clean;
  • }
  • コードをコピー
  • 概要: * addslashes() が強制的に追加されます。 * mysql_real_escape_string() は文字セットを決定しますが、PHP バージョンの要件があります。 * mysql_escape_string は接続の現在の文字セットを考慮しません。

    声明:
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。