mysql_real_escape_string() は、ワイドバイトとインジェクションの問題を解決できるaddslashes() と mysql_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 — 接続の現在の文字セットを考慮して、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
(もっと良い)。