1

私のアプリケーションでは、ユーザーはステータスの更新を投稿できます。コード html/javascript またはその他のスクリプトを投稿する可能性があります。データベースに保存し、Web ページに表示します。このコードを表示したいページに影響を与えることなく、コードは通常のテキストとして表示され、サーバー側での処理中またはクライアント側での読み込み中に実行されるべきではありません...どうすればこれを達成できますか? mysql_real_escape_string()また、フィルターなどの処理をせずに保存していstrip_tags()ます...処理を行わなくてもいいですか?それに関連する脅威はありますか?それに対して何らかの操作を実行する必要がある場合、より安全な側で使用し、ユーザー入力を通常/プレーンテキストとして表示するという私の目的を達成するためにどの関数を使用する必要がありますか。

更新htmlspecialchars:すべての回答を読んだ後、私は行って、についてもっと読むべきだと思いますhtmlentities

4

5 に答える 5

2

これはまさに何htmlspecialchars()のためのものhtmlentities()です。

はい、DBに挿入する前に、ユーザーが提供したデータをエスケープする必要があります。mysql_real_escape_string()これを達成しますが、ドキュメントの大きな赤いボックスに従って、他のすべての機能とともにmysql_*非推奨です。代わりにPDOまたはMySQLiの使用を検討する必要があります。

于 2013-03-31T15:29:31.247 に答える
2

htmlentitiesが必要なようです。テキストを表示するときにこれを使用します。テキストを読んだり保存したりするときに特別なことをする必要はありません。

参考までに: これはおそらく、ユーザーが作成したテキストを表示するのに良い考えです.XSS、CSRF、およびその他の厄介なインジェクションの問題をすべて防ぎます.

編集

私はここで賛成票を投じているように見えますが、データを保存するときにデータをエンコードしないことをお勧めしますが、データを表示するときは注意してください。より一貫性があり、データを純粋に保つことができます。

たとえば、 のWHERE SOME_TEXT LIKE '%<script>%'代わりにデータを直接クエリできるWHERE SOME_TEXT LIKE '%&lt;script&gt;'ため、データ アクセスがより簡単になります。レポートやデスクトップ アプリケーションなどに無害にデータを表示できます。また、表示側でのデータのエンコードについて一貫している場合は、入力で既にエンコードしているかどうかを考える必要はありません (ダブルエンコードになり、非常に見苦しくなります)。これが安全でないデータ エントリ ポイントであると見なしたかどうかに関係なく、出力します。

于 2013-03-31T15:28:36.663 に答える
2

既存の回答では既にhtmlspecialcharsとが言及されていますが、テキストを表示するときに適用するのではなく、テキストを保存するhtmlentitiesときにこれらを適用することをお勧めします。これには 2 つの理由があります。

  • あなた(または他の誰か)が後で同じデータに別のビューを追加した場合、これが忘れられていれば、噛まれることはありません(最小の驚きの原則)
  • データを保存するよりも表示する頻度の方がはるかに高いため、計算のペナルティを受ける回数ははるかに少なくなります。
于 2013-03-31T15:32:55.193 に答える
1

を使用しhtmlspecialcharsます。これは事実上の「html をテキストとして表示する」機能です。

インジェクションを防ぐために (実際には、PDO/mysqli で適切にパラメーター化されたクエリを使用する必要があります) を使用して保存する必要がありますが、表示される生データには影響しません格納するときではなく、DB から取得して表示mysql_real_escape_stringする準備ができたときに使用します。htmlspecialchars

于 2013-03-31T15:27:31.163 に答える
1

<pre>タグとタグを使用して、<code>フォーマットされたコードを表示できます。ただし、コードが実行されて表示されないようにするには、テキストを文字エンティティに変換する必要があります。> は >、< は < などになります。

たとえば、PHP を使用してこれを行うことができます。

<?php echo htmlentities('function getSize() {  var myFSO = new
ActiveXObject("Scripting.FileSystemObject");
  var filepath =
document.upload.file.value;   var
thefile = myFSO.getFile(filepath);
  var size = thefile.size;  alert(size
+ " bytes"); }'); ?>

システムはユーザー入力に依存しているため、ユーザー入力を実際に処理して HTML エンティティに変換するには、AJAX に依存する必要がある場合があります。

于 2013-03-31T15:29:23.723 に答える