ホームページ  >  記事  >  バックエンド開発  >  PHP関数addlashesとmysql_real_escape_string_PHPチュートリアルの違い

PHP関数addlashesとmysql_real_escape_string_PHPチュートリアルの違い

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

まず第一に: mysql_escape_string は非推奨なので使用せず、代わりに mysql_real_escape_string を使用してください。

mysql_real_escape_string と addslashes の違いは次のとおりです:

違い 1:

addslashes は MySQL 接続の文字セットについて何も知りません。使用している MySQL 接続以外のバイト エンコーディングを含む文字列を渡すと、値が文字 '、"、および x00 であるすべてのバイトが問題なくエスケープされます。8 ビットの他の文字と異なり、 UTF-8 では、これらのバイトの値は必ずしもすべて文字 '、"、および x00 で表されるわけではありません。考えられる結果は、MySQL がこれらの文字を受け取った後にエラーが発生することです。

このバグを修正したい場合は、iconv 関数を使用して変数を UTF-16 に変換し、addslashes を使用してエスケープしてみてください。

これが、エスケープにアッドスラッシュを使用しない理由の 1 つです。

違い 2:

addslashes と比較して、mysql_real_escape_string は r、n、x1a もエスケープします。これらの文字は MySQL に正しく伝える必要があるようです。そうしないと、間違ったクエリ結果が得られます。

これが、エスケープにアッドスラッシュを使用しないもう 1 つの理由です。

addslashes 対 mysql_real_escape_string

GBK では、0xbf27 は有効な複数文字文字ではありませんが、0xbf5c は有効です。シングルバイト環境では、0xbf27 は 0xbf の後に 0x27(‘) が続くものとして扱われ、0xbf5c は 0xbf の後に 0x5c() が続くものとして扱われます。

バックスラッシュでエスケープされた一重引用符は、MySQL に対する SQL インジェクション攻撃を効果的に防ぐことはできません。もしあなたがaddslashesを使ってくれたら、私(攻撃者、以下同じ)は非常に幸運です。 0xbf27 のようなものを挿入し、それを 0xbf5c27 (有効なマルチバイト文字とその後に一重引用符が続く) にスラッシュを追加します。言い換えれば、エスケープに関係なく、単一引用符を正常に挿入できます。これは、0xbf5c が全角文字ではなく半角文字として扱われるためです。

このデモでは、MySQL 5.0 と PHP 用の mysqli 拡張機能を使用します。試してみたい場合は、必ず GBK を使用してください。

users という名前のテーブルを作成します:

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

CREATE TABLE users(
username VARCHAR(32) CHARACTER SET GBK,
password VARCHAR(32) CHARACTER SET GBK,
PRIMARY KEY (username)
);

次のコードは、addslashes (または magic_quotes_gpc) のみを使用してクエリ データをエスケープする場合の状況をシミュレートします。
コードをコピーします コードは次のとおりです。 ?php
$mysql = array();
$db = mysqli_init();
$db->real_connect('localhost', 'lorui', 'lorui.com', 'lorui_db');
/* SQL インジェクションexample*/
$ _POST['ユーザー名'] = chr(0xbf) . chr(0×27) ' または ユーザー名 = ユーザー名 /*'; $_POST['パスワード'] = 'ユーザー名'; '] = addlashes( $_POST['username']); $mysql['password'] =addslashes($_POST['password']); $sql = "SELECT * FROM users WHERE username = '{$mysql['ユーザー名']}' AND パスワード = '{$mysql['パスワード']}'"; $result = $db->query($sql); if ($result->num_rows) { /* 成功*/ } else { /* 失敗*/ }



addslashes を使用しているにもかかわらず、ユーザー名とパスワードを知らなくても正常にログインできます。この脆弱性を悪用すると、SQL インジェクションを簡単に実行できます。
この脆弱性を回避するには、mysql_real_escape_string、準備されたステートメント (準備されたステートメント、「パラメーター化されたクエリ」)、または主流のデータベース抽象クラス ライブラリを使用します。

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

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/759336.html技術記事まず、mysql_escape_string は非推奨なので使用せず、代わりに mysql_real_escape_string を使用してください。 mysql_real_escape_string と addslashes の違いは次のとおりです。 違い 1: adds...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。