0

関数ライブラリにsanitseという関数があります。文字列の 1 つの引数を取り、サニタイズされた文字列を返します。

function sanitise($data){
    return htmlentities(mysql_real_escape_string($data));
}

私はフォーラムを開発しており、テキストとして送信されたデータをサニタイズする必要があります。(データベースに保存されます)。しかし、発生する問題があります。データが保存されると、新しい行は \r\n として表され、取得後にスレッドに表示されます。代わりに新しい行が必要です。nl2br はそれを整理しません。別の投稿で、これを解決するための解決策を「ハッキング」するのではなく、問題の原因 (関数) に対処する必要があることを読みました。

データをサニタイズしなければ、コメントは正しく表示されます。しかし、それはもちろん安全ではありません。

どんな提案もありがたく受け取られます。

4

1 に答える 1

2

とにかく、あなたがしていることは安全ではありません。自分が何をしているのかを本当に理解する必要があります。

mysql_real_escape_string():この関数は文字列を受け取ってエスケープし、SQL ステートメント内で使用できるようにします。これが行うことは、何がデータで何がクエリかをクエリ パーサーに明確にすることだけです。これを理解することが重要です。

htmlentities()/htmlspecialchars(): これらの関数は文字列をエスケープして、HTML パーサーが<やなどの文字を HTML であると認識することなく、HTML 内で使用できるようにし"ます。これらのエンティティは と に&lt;なり&quot;ます。

これらの関数は、正しいコンテキストで使用する必要があります。クエリコンテキストで使用される前に文字列に触れる最後のものとして使用しないことで、その値のほとんどを無効にします。mysql_real_escape_string()この関数は、データベースにデータを挿入する場合、および文字列が完全に形成されている場合にのみ使用してください。最善の方法は、クエリ内でデータをまったく使用しないことです。代わりに、準備済み/パラメーター化されたクエリで PDO を使用してください。これにより、クエリからデータが効果的に削除され、SQL インジェクションの可能性がなくなります。

HTML に任意の文字列を挿入する準備ができるまで、使用しないでください。htmlentities()つまり、データベースにデータを入れる前にこの関数を使用しないでください。そうしないと、他のコンテキストでデータを操作するのが非常に難しくなります。これを行うために人々が作る混乱に対処するのは本当に面倒です。やらないでください。

ここで、リテラル\rまたは\nテキストで表示されている場合、そのデータは別のものから来ています。使用している2つの機能からではありません。これらの関数はいずれも、そのような文字列を挿入しません。

参照: https://stackoverflow.com/a/7810880/362536

于 2013-03-15T03:36:14.717 に答える