2

エンタメ関係のサイトを運営しています。そこで、XSS 攻撃を防ぐために新しい方法を使用することを考えました。次の単語リストを作成しました

alert(, javascript, <script>,<script,vbscript,<layer>,
<layer,scriptalert,HTTP-EQUIV,mocha:,<object>,<object,
AllowScriptAccess,text/javascript,<link>, <link,<?php, <?import,

私のサイトは娯楽に関連しているので、通常のユーザー (悪意のあるユーザーを除く) がコメントでそのような言葉を使用することは期待していません。したがって、ユーザーが送信した文字列から上記のカンマ区切りの単語をすべて削除することにしました。私はあなたのアドバイスを必要とします。これを行った後、htmlpurifier のようなツールを使用する必要はありませんか?

注: htmlspecialchars() はリッチ テキスト エディター (CKEditor) から生成されたタグも変換するため、使用していないため、ユーザー フォーマットはなくなります。

4

5 に答える 5

4

ブラックリストは簡単に回避できるため、使用することはお勧めできません。たとえば、をチェックして、おそらく削除してい<script>ます。これを回避するために、悪意のあるユーザーは次のように入力できます。

<scri<script>pt> 

あなたのコードは<script>、外側を<script>そのまま残して真ん中を取り除き、ページに保存します。

HTML を入力する必要があり、ユーザーが入力しない場合は、HTML を入力できないようにします。HTML を含む記事を入力するには、自分だけがアクセスできる別の方法が必要です。

于 2013-03-28T10:25:11.077 に答える
3

このアプローチは、HTML インジェクションの問題が何であるかを誤解しており、まったく効果がありません。

HTML にスクリプトを記述する方法は、上記の一覧以外にもたくさんあります。また、エスケープ フォームを使用してフィルターを回避する方法もたくさんあります。この種の単純なシーケンスのブラックリストでは、潜在的な「有害な」構造をすべてキャッチすることは決してできません。そうしようとすると、本物のコメントでユーザーに迷惑をかけることになります。on(例: ...で始まる単語の使用を禁止する)

HTML インジェクション XSS を防止する正しい方法は次のとおりです。

  • htmlspecialchars()通常のテキスト (コンテンツの大部分) であるはずのコンテンツを出力するときに使用します。

  • ユーザー提供の HTML マークアップを許可する必要がある場合は、許可したい無害なタグと属性をホワイトリストに登録し、HTMLPurifier または別の同様のライブラリを使用して強制します。

これは、Web アプリケーションを作成する際の標準的でよく理解されている部分であり、実装するのは難しくありません。

于 2013-03-28T11:59:41.007 に答える
2

htmlspecialchars()など、利用可能にしたい特定のタグに対して行われた変更を元に戻す関数を作成しないのはなぜ<b><i><a>ですか?

于 2013-03-28T10:21:37.263 に答える
1

リストを回避するためのハックはさておき、ブラックリストよりもホワイトリストを使用する方が常に優れています。

この場合、サポートしたいタグの明確なリストがすでにあるので、HTML purifier を使用して 、 などの<em>タグをホワイトリストに登録します。<b>

于 2013-03-28T10:20:59.917 に答える
0

あなたは試すことができます

htmlentities()

echo htmlentities("<b>test word</b>");

ouput: &lt;b&gt;test word&lt;/b&gt;gt;

strip_tags()

echo strip_tags("<b>test word</b>");

ouput: test word

mysql_real_escape_string()

または簡単な機能を試す

function clean_string($str) {
  if (!get_magic_quotes_gpc()) {
    $str = addslashes($str);
  }
  $str = strip_tags(htmlspecialchars($str));
  return $str;
}
于 2013-03-28T10:20:49.137 に答える