web-dev-qa-db-ja.com

HTMLを出力するためのmysql_real_escape_string()のデコード

私はSQLインジェクションから身を守ろうとしており、以下を使用しています。

mysql_real_escape_string($string);

HTMLを投稿すると、次のようになります。

<span class="\&quot;className\&quot;">
<p class="\&quot;pClass\&quot;" id="\&quot;pId\&quot;"></p>
</span>

Real_escape_stringが追加する他のバリエーションの数がわからないので、いくつかを置き換えて他のバリエーションを見逃したくない...これを正しくフォーマットされたHTMLに「デコード」して、次のようにするにはどうすればよいですか。

html_entity_decode(stripslashes($string));
11
Peter Craig

mysql_real_escape_string() マニュアルページには、エスケープされている文字が示されています。

mysql_real_escape_string()は、MySQLのライブラリ関数mysql_real_escape_stringを呼び出します。この関数は、\ x00、\ n、\ r、\、 '、 "、および\ x1aの文字の前に円記号を付けます。

これらのエスケープ文字をエスケープされていない形式に置き換えることで、エスケープを正常に元に戻すことができます。

mysql_real_escape_string()はHTMLをサニタイズするために使用すべきではありません... Webページデータを出力する前にそれを使用する理由はありません。これは、データベースに入れようとしているデータにのみ使用する必要があります。衛生管理プロセスは次のようになります。

入力

  1. フォームまたはHTTPリクエストからのユーザー入力を受け入れる
  2. mysql_real_escape_string()を使用してデータベースクエリを作成します

出力

  1. データベースからデータをフェッチします
  2. 印刷する前に、htmlspecialchars()を介してユーザー定義データを実行します

MySQLi[〜#〜] pdo [〜#〜] などの別のデータベースドライバーを使用すると、プリペアドステートメントを使用できます。これにより、ほとんどの入力のエスケープが処理されます。君は。ただし、これらを切り替えたり利用したりできない場合は、必ずmysql_real_escape_string()...を使用してください。データを挿入する前にのみ使用してください。

13
zombat

あなたはすべてを台無しにしました。

mysql_real_escape_stringはデコードを必要としません。

スラッシュでデータを取り戻す場合、それはデータが2回エスケープされたであることを意味します。そして、余分なスラッシュを取り除く代わりに、それらを追加しないでください。

言うまでもなく、エスケープするものはすべて廃止され、

プリペアドステートメントを使用する

エスケープ文字列の代わりに。

したがって、エスケープしたり、デコードしたりしないでください。
問題は解決しました。

10

mysql_real_escape_stringは、ユーザーが提供したデータをデータベースに格納するときにSQLインジェクションを防ぐために使用されますが、 [〜#〜] pdo [〜#〜] (たとえば) 。エスケープをいじる代わりに、それを使用することを常にお勧めします。

そうは言っても、後でそれを表示する方法についての質問に関しては、データが保存された後、データを取得すると、データは完全で有効であり、「エスケープ解除」する必要はありません。独自のエスケープシーケンスを追加しない限り、追加しないでください。

8
Guss

私が見ることができるようにフォーマットで何が起こっているのかわかりませんが、あなたのhtmlフォーム

<span class="\&quot;className\&quot;">
<p class="\&quot;pClass\&quot;" id="\&quot;pId\&quot;"></p>
</span>

単純にする必要があります。

<span class="className">
<p class="pClass" id="pId"></p>
</span>

それを取り戻すとき、それをデータベースに入れる前に、mysql_real_escape_string()を使用してそれをエスケープし、SQLインジェクション攻撃を受けないようにします。

したがって、テキストが次に進む場所の準備ができている値をエスケープしています。

データベースから取得する(またはそのいずれかをhtmlとしてユーザーに表示する)と、XSS攻撃からユーザーを保護するために、htmlentities()などを使用して次に進む場所(html)に備えて再度エスケープします。

これは、マントラFIEO、フィルター入力、エスケープ出力のEO部分を形成します。これは、まぶたの内側に刺青する必要があります。

0
Cups

このルーチンにデコーダールーチンが付属していないのはなぜだろうと思っていました。おそらく、MySQLによって、エスケープされなかったかのようにまったく同じ方法で解釈されます。 $row=mysql_fetch_array($res, MYSQL_ASSOC)';を実行すると、エスケープされていない結果が得られます。

0
HELPFUL_SHADOW

さて、私はこれを昔ながらの方法で突き刺しました、そして今のところ私は私のアプローチに何も悪いことを見ることができません。明らかにそれは少し粗雑ですが、それは仕事を成し遂げます:

function mysql_unreal_escape_string($string) {
    $characters = array('x00', 'n', 'r', '\\', '\'', '"','x1a');
    $o_chars = array("\x00", "\n", "\r", "\\", "'", "\"", "\x1a");
    for ($i = 0; $i < strlen($string); $i++) {
        if (substr($string, $i, 1) == '\\') {
            foreach ($characters as $index => $char) {
                if ($i <= strlen($string) - strlen($char) && substr($string, $i + 1, strlen($char)) == $char) {
                    $string = substr_replace($string, $o_chars[$index], $i, strlen($char) + 1);
                    break;
                }
            }
        }
    }
    return $string;
}

これはほとんどの場合をカバーするはずです。

0
Muhwu