3

MYSQLi の real_escape 関数と nl2br を使用してエスケープおよびサニタイズしようとすると、テキスト領域があり、単純に出力すると奇妙な結果が得られます。

私のPHPコード:

 <?php
 $db = new mysqli('localhost', 'user', 'pass', 'demo');

 if($db->connect_errno > 0){
 die('Unable to connect to database [' . $db->connect_error . ']');
 }

 $postText = nl2br($db->escape_string($_POST['posting']));
  ?>

奇数の出力は次のとおりです。

 i love this\r\n\r\nand this is gonna be funn.,

奇妙なことに、私が使用しnl2brないreal_escapeで使用すると、ユーザーの入力を信頼できないため、明らかに先に進むことができない出力が得られます。

これについて助けてください..

4

2 に答える 2

2

出力が SQL クエリで使用される場合にのみ、SQL エスケープを適用する必要があります。

  • 値をページに出力する必要がある場合は、htmlspecialchars()またはを使用しますhtmlentities()

  • JavaScript リテラルで使用する場合は、json_encode().

  • 等。

つまり、各コンテキストには独自のエスケープがあります。それらを混同しないでください。

nl2br()また、データベースに書き込むときにも使用しないでください。むしろ、データベースから取得した後に適用してください。

于 2013-02-09T08:26:19.450 に答える
0

はい、そうです。
この関数の出力は、印刷することを意図していません。ただし、SQL 文字列リテラルのみをフォーマットします。この関数は、どのような入力も「サニタイズ」することを意図していないことに
注意してください。詳細はこちらをご参照ください

したがって、これら 2 つの関数を一緒に使用しないでください。

  • クエリに動的に配置する SQL 文字列をフォーマットするには、escape_string を使用します。
  • テキストを HTML ページに印刷する場合にのみ nl2br を使用する

コメントの質問によると、文字列をすぐに印刷しなければならない場合はありません。
すべての POST リクエストの後、PHP はヘッダーで応答してLocation:、ブラウザにページをリロードするように指示する必要があるためです。このようなリロード時に、データベースからデータバスを読み込んで印刷することができます。

于 2013-02-09T08:21:22.867 に答える