5

私はphpを使用して個人のWebサイトを開発しています。すべて問題ありませんが、 php.netmysql_real_escape_stringのマニュアルを読んだところ、次の2つが見つかりました。

  1. この関数は、MySQLにクエリを送信する前に、データを安全にするために常に(いくつかの例外を除いて)使用する必要があります。
  2. mysql_real_escape_string()は%と_をエスケープしません。これらは、LIKE、GRANT、またはREVOKEと組み合わせた場合のMySQLのワイルドカードです。

2つの質問があります:
1-これらの例外は何ですか?
2-それらの文字をエスケープする方法は?

4

3 に答える 3

5

この関数は、MySQLにクエリを送信する前に、データを安全にするために常に(いくつかの例外を除いて)使用する必要があります。

私の大きな失望に、マニュアルページは完全なゴミを言っており、彼らはそれを正しくすることを拒否しています
したがって、まったく逆に、この関数が必要になる場合はごくわずかです。つまり、SQLクエリに文字列を追加する場合です。

mysql_real_escape_string()は%と_をエスケープしません。これらは、LIKE、GRANT、またはREVOKEと組み合わせた場合のMySQLのワイルドカードです。

それはあまり重要ではありません。意図的にLIKE演算子を使用している限り、これらの文字は害を及ぼしません。

ただし、LIKEステートメントに向かう文字列をエスケープする場合は、このコードを使用できます

$like = addCslashes($like,'\%_');

(スラッシュに注意してください。手動で示すようにエスケープする必要もありますC。関数名の文字にも注意してください)。
この手順の後$like、クエリの作成に使用している方法に関係なく、結果の変数を使用できます。引用符で囲んでエスケープするか、プリペアドステートメントで使用します。

于 2012-04-21T14:37:25.747 に答える
3

データを安全にすることについて話しているときに、マニュアルがどのような例外を参照しているのかわかりません。例外は、データが安全であることがすでにわかっている場合であると言えます。たとえば、次のようなケースが思い浮かびます。

  • データは数値として入力されます(これは実際には次の項目の専門分野です)
  • エスケープする必要のある文字が含まれていないことはすでにご存知でしょう(たとえば、ハードコーディングしたいくつかのオプションを含む「ホワイトリスト」配列で何かを検索した場合など)

たとえば、持っている場合は、クエリに挿入する前$id = intval($_GET['id'])にエスケープする必要はありません。$id

でも!すべての入力をエスケープすることは決して害にはなりません。そうすることで、コードに脆弱性が導入される可能性がなくなります(たとえば、エスケープを忘れた場合、要件が変更された場合など)。ですから、すべてを逃れ、「例外」を忘れる習慣を身につけることをお勧めします。

入力の一部としての%and文字については、これらを認識するコマンドにこの入力をフィードする場合を除いて_、これらをエスケープする必要はありません。したがって、たとえば、次のようなクエリがある場合:

$term = $_GET['term'];
$sql = sprintf("SELECT FROM table WHERE column LIKE '%%s%'",
               mysql_real_escape_string($term));

この場合、ユーザーがの%一部としてaと入力$termすると、実際にリテラルを検索したいと考えるのが妥当です%。したがって、このような場合は、 (デフォルトのエスケープ文字)%に置き換えてエスケープする必要があります。またはこれには2つの良いオプションがあります。\%\str_replacestrtr

于 2012-04-21T14:34:21.300 に答える
1

write your own function;)詳細については、このスレッドを参照してください。

それ以外の場合は、PDOライブラリまたは他のそのようなライブラリを使用できます。

于 2012-04-21T14:42:16.570 に答える