ホームページ  >  記事  >  バックエンド開発  >  mysql_real_escape_string() インジェクション防止の詳細な説明を求める

mysql_real_escape_string() インジェクション防止の詳細な説明を求める

WBOY
WBOYオリジナル
2016-08-04 09:20:561372ブラウズ

mysql_real_escape_string() は、ワイドバイトとインジェクションの問題を解決できるaddslashes() と mysql_escape_string() の良い代替手段とみなされていますが、公式の説明は不明瞭です:

mysql_real_escape_string() インジェクション防止の詳細な説明を求める

mysql_real_escape_string — 接続の現在の文字セットを考慮して、SQL ステートメントで使用される文字列内の特殊文字をエスケープします

この文が本当に理解できません。接続の現在の文字セットを考慮すると、これは何を意味しますか? 専門家に詳しく説明していただけますか?

参考:
http://php.net/manual/zh/function.mysql-real-escape-string.php
http://www.cnblogs.com/suihui/archive/2012/09/20/2694751。 html
http://www.neatstudio.com/show-963-1.shtml

追加の質問: @佢佇俜
1. 追加されたコンテンツは mysql に転送されないので、注入された場合' or 1=1;-- s、ここで注入されたコンテンツは最終的に実行のために mysql に転送されるのではありませんか?
参考: https:/ /セグメントフォルト.com/q/1010000005994443

2.并考虑到连接的当前字符集現在の接続の文字セットを変更するとはどういう意味ですか?

返信内容:

mysql_real_escape_string() は、ワイドバイトとインジェクションの問題を解決できるaddslashes() と mysql_escape_string() の良い代替手段とみなされていますが、公式の説明は不明瞭です:

mysql_real_escape_string() インジェクション防止の詳細な説明を求める

mysql_real_escape_string — 接続の現在の文字セットを考慮して、SQL ステートメントで使用される文字列内の特殊文字をエスケープします

この文が本当に理解できません。接続の現在の文字セットを考慮すると、これは何を意味しますか? 専門家に詳しく説明していただけますか?

参考:
http://php.net/manual/zh/function.mysql-real-escape-string.php
http://www.cnblogs.com/suihui/archive/2012/09/20/2694751。 html
http://www.neatstudio.com/show-963-1.shtml

補足質問: @佢閑俜
1.追加されたコンテンツはmysqlに転送されないので、注入された場合' or 1=1;-- s、ここで注入されたコンテンツは最終的にmysqlに転送されて実行されるのではないでしょうか?
参考: https:/ /セグメントフォルト.com/q/1010000005994443

2.并考虑到连接的当前字符集現在の接続の文字セットを変更するとはどういう意味ですか?

これはmysql gbkのダブルバイトインジェクションについてです

たとえば、SQL ステートメントを想定したユーザー ログイン:
$sql = "select * from user where user_name='$username' and password='$password'";

1 注入箇所があり、逃げ場がない場合。パラメータ username=' または 1=1;-- を渡すと、この時点の SQL ステートメントは

$sql = "select * from user where user_name='' or 1=1;-- s ' and password='$password'";

--はコメント文字なので、後から回避できたかどうかを判断する必要はありません

2 インジェクションポイントがあり、特殊文字エスケープが使用されている場合。するとこの時のSQL文は

$sql = "select * from user where user_name='' or 1=1;-- s ' and password='$password'";

迂回できません

3 この時点で、ある優秀なハッカーが gbk エンコーディングにワイド バイト インジェクションがあることを発見しました。このとき、username=%df%27 または 1=1;--

を渡します。

このときに実行されるSQL文は次のようになります:

$sql = "select * from user where user_name='運' or 1=1;-- s ' and password='$password'"; バイパスに成功しました

この問題を解決する方法

mysql_real_escape_string — 接続の現在の文字セットを考慮して、SQL ステートメントで使用される文字列内の特殊文字をエスケープします

mysql_real_escape_string方法对SQL语句的转义机制,随着当前数据库连接的字符集的改变而改变。相同的SQL ステートメントでは、異なる文字セットでは、エスケープ後の結果が同じにならない場合があります。

重要:

mysql_real_escape_string方法属于mysql扩展,该扩展自PHP版本5.5.0之后已被标记为过时,并在PHP版本7之后被移除。请使用mysqli或者PDO扩展进行数据库操作。数据库字符集请尽量使用utf8或者utf8mb4(もっと良い)。

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