私はSQLインジェクションから身を守ろうとしており、以下を使用しています。
mysql_real_escape_string($string);
HTMLを投稿すると、次のようになります。
<span class="\"className\"">
<p class="\"pClass\"" id="\"pId\""></p>
</span>
Real_escape_stringが追加する他のバリエーションの数がわからないので、いくつかを置き換えて他のバリエーションを見逃したくない...これを正しくフォーマットされたHTMLに「デコード」して、次のようにするにはどうすればよいですか。
html_entity_decode(stripslashes($string));
mysql_real_escape_string() マニュアルページには、エスケープされている文字が示されています。
mysql_real_escape_string()は、MySQLのライブラリ関数mysql_real_escape_stringを呼び出します。この関数は、\ x00、\ n、\ r、\、 '、 "、および\ x1aの文字の前に円記号を付けます。
これらのエスケープ文字をエスケープされていない形式に置き換えることで、エスケープを正常に元に戻すことができます。
mysql_real_escape_string()
はHTMLをサニタイズするために使用すべきではありません... Webページデータを出力する前にそれを使用する理由はありません。これは、データベースに入れようとしているデータにのみ使用する必要があります。衛生管理プロセスは次のようになります。
入力
mysql_real_escape_string()
を使用してデータベースクエリを作成します出力
htmlspecialchars()
を介してユーザー定義データを実行しますMySQLi や [〜#〜] pdo [〜#〜] などの別のデータベースドライバーを使用すると、プリペアドステートメントを使用できます。これにより、ほとんどの入力のエスケープが処理されます。君は。ただし、これらを切り替えたり利用したりできない場合は、必ずmysql_real_escape_string()
...を使用してください。データを挿入する前にのみ使用してください。
あなたはすべてを台無しにしました。
スラッシュでデータを取り戻す場合、それはデータが2回エスケープされたであることを意味します。そして、余分なスラッシュを取り除く代わりに、それらを追加しないでください。
言うまでもなく、エスケープするものはすべて廃止され、
エスケープ文字列の代わりに。
したがって、エスケープしたり、デコードしたりしないでください。
問題は解決しました。
mysql_real_escape_string
は、ユーザーが提供したデータをデータベースに格納するときにSQLインジェクションを防ぐために使用されますが、 [〜#〜] pdo [〜#〜] (たとえば) 。エスケープをいじる代わりに、それを使用することを常にお勧めします。
そうは言っても、後でそれを表示する方法についての質問に関しては、データが保存された後、データを取得すると、データは完全で有効であり、「エスケープ解除」する必要はありません。独自のエスケープシーケンスを追加しない限り、追加しないでください。
私が見ることができるようにフォーマットで何が起こっているのかわかりませんが、あなたのhtmlフォーム
<span class="\"className\"">
<p class="\"pClass\"" id="\"pId\""></p>
</span>
単純にする必要があります。
<span class="className">
<p class="pClass" id="pId"></p>
</span>
それを取り戻すとき、それをデータベースに入れる前に、mysql_real_escape_string()を使用してそれをエスケープし、SQLインジェクション攻撃を受けないようにします。
したがって、テキストが次に進む場所の準備ができている値をエスケープしています。
データベースから取得する(またはそのいずれかをhtmlとしてユーザーに表示する)と、XSS攻撃からユーザーを保護するために、htmlentities()などを使用して次に進む場所(html)に備えて再度エスケープします。
これは、マントラFIEO、フィルター入力、エスケープ出力のEO部分を形成します。これは、まぶたの内側に刺青する必要があります。
このルーチンにデコーダールーチンが付属していないのはなぜだろうと思っていました。おそらく、MySQLによって、エスケープされなかったかのようにまったく同じ方法で解釈されます。 $row=mysql_fetch_array($res, MYSQL_ASSOC)';
を実行すると、エスケープされていない結果が得られます。
さて、私はこれを昔ながらの方法で突き刺しました、そして今のところ私は私のアプローチに何も悪いことを見ることができません。明らかにそれは少し粗雑ですが、それは仕事を成し遂げます:
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;
}
これはほとんどの場合をカバーするはずです。