2

もちろん、変数をデータベースにポストするときは、mysql_real_escape_string. このようにして、特殊文字がデータベースに正しく入ります。

この変数をデータベースから読み取るとき、次のように mysql_real_escape_string を再度使用しますstripslashes

$var = stripslashes(mysql_real_escape_string($record['rowname']));

そうしないと、引用符の前にスラッシュが表示されます。

上記のこれを使用$varしてエコーしたいecho "$var"場合は、すでに削除されてエスケープされているため、単純にできますよね?

stripslashesさらに、変数に+を使用mysql_real_escape_stringした場合、この同じ変数をデータベースに再度 POST するだけでmysql_real_escape_string十分ですか? stripslashesまたは、この変数を再度使用する必要がありますか?

要約:

これがどのように機能するかを知っているように:

  1. mysql_real_escape mysqlでデータを使用するときはいつでも使用してください。変数をデータベースに投稿するのと同じように、変数を介してクエリを読み取るとき。
  2. stripslashesエスケープされた変数をエコーアウトするときに使用します。
  3. stripslashes変数をデータベースに再度投稿してエスケープしたい場合は、再度ストリップスラッシュする必要はありません。

恋しいhtmlspecialcharsですか?

編集

それで、これはすべて間違っていますか?

    while( $record=mysql_fetch_array($result) ) 
    {
        $custid=mysql_real_escape_string($record['custid']);
        $custsurname=mysql_real_escape_string($record['custsurname']);
        $custmidname=mysql_real_escape_string($record['custmidname']);
        $custforename=mysql_real_escape_string($record['custforename']);
        $custcountry=stripslashes(mysql_real_escape_string($record['custcountry'])); }
4

2 に答える 2

6

間違っていると思います。重要な点は、エスケープは状況依存であり、その事実を完全に無視することです。

すべてのデータ形式には、形式仕様で特別な意味が割り当てられている単語または文字があります。たとえば'、SQL の記号は「文字列区切り記号」を?意味し、URL の記号は「開始クエリ文字列」を<意味し、HTML の記号は「開始タグ」を意味します。リテラルの単語または文字を挿入する場合、つまり、そのまま挿入してその特別な意味を削除する場合は、エスケープが必要です。

それを認識すれば、形式とコンテキストによって構文が異なることは明らかです。<HTML では「開始タグ」を意味しますが、SQL や URL では意味しません。したがって、ターゲット形式用に構築され、形式規則に従うエスケープ メソッドを使用する必要があります。

データベースから読み取っmysql_real_escape_string()たデータを処理する場合は、「データをエスケープして、SQL 文字列内に挿入できるようにする」と言っています。データは内部で SQL 文字列として使用する準備ができていますが、他の用途では破損しています。

この例では、実行したことのほとんどが元にstripslashes()戻されるため、基本的に変更されていない出力が得られます。しかし、それは純粋なチャンスです。mysql_real_escape_string()

最後になりましたが、データベースの入力パラメーターを 1 つずつエスケープする必要があるのは非常に面倒です。他のすべての DB 拡張機能は、使用しているものを除き、準備済みステートメントを提供します。最新のものを提供しない非推奨の拡張機能にとらわれないでください。

1注: 従来の mysql 拡張機能は、より優れた代替手段が利用できるようになると、数年間非推奨となり、もはや言語の一部ではありません。

更新:少し明確化 — エスケープは単なる構文トリックです。元のデータをそのまま見るだけで、ターゲット エンジンの目には入力を変更しません。したがって、入力を取得するときにエスケープを解除する必要はありません。

于 2012-11-23T11:17:46.233 に答える
4

stripslashesデータベースからのデータやデータを取得する必要はありませんmysql_real_escape_string。クエリを実行する前にデータをエスケープするだけで、クエリパーサーは特殊文字とリテラル文字を認識できます。

stripslashes(いくつかの症状を修正するためのハックとして)決して使用しないでください。エスケープ後に変数が必要になる場合は、元の変数を使用してください。

$data_safe = mysql_real_escape_string( $data );
//$data can still be used normally

エスケープは特定のコンテキストに対してのみ行われます。コンテキストがmysqlクエリの場合、クエリに対してのみmysqlを実際にエスケープします。コンテキストがhtml出力の場合、文字列をhtmlとして出力する直前にhtmlescapeします。データ自体を実際に変更する必要はありません。これを誤解するとO\'BrianO&#39;Brianなどが表示されます。

于 2012-11-23T11:11:35.967 に答える