他の Web ページへの "通常の" href リンクを許可したいのですが、クライアント側のスクリプトに誰かが忍び込むことを許可したくありません。
HREFおよびonclick/onmouseover/etc内で「javascript:」を検索しています。イベントは十分ですか?それとも他に確認することはありますか?
他の Web ページへの "通常の" href リンクを許可したいのですが、クライアント側のスクリプトに誰かが忍び込むことを許可したくありません。
HREFおよびonclick/onmouseover/etc内で「javascript:」を検索しています。イベントは十分ですか?それとも他に確認することはありますか?
ユーザーがマークアップを使用してコンテンツを送信できるようにしているようです。そのため、クロスサイト スクリプティングの防止に関するいくつかの記事を参照することをお勧めします。この記事では、javascript が HREF タグに挿入されるのを単に防止するだけでなく、それ以上の内容をカバーしています。以下は、役に立つかもしれないと私が見つけたものです。
http://weblogs.java.net/blog/gmurray71/archive/2006/09/preventing_cros.html
完全に安全にするには、許可されたプロトコルのホワイトリストを使用する必要があります。ブラックリストを使用すると、遅かれ早かれ、「telnet://」や「shell:」など、聞いたことのない悪用可能なブラウザ固有のものを見逃すことになります...
いいえ、確認する必要があることは他にもたくさんあります。
最初の URL はエンコードできます (HTML エンティティまたは URL エンコード、または両方の組み合わせを使用)。
次に、不正な形式の HTML をチェックする必要があります。これは、ブラウザが推測して、最終的に何らかのスクリプトを許可する可能性があります。
3 番目に、CSS ベースのスクリプト、たとえば background: url(javascript:...) または width:expression(...) を確認する必要があります。
私が見逃したものはおそらく他にもあります - 注意が必要です!
ユーザー入力を取得するときは、細心の注意を払う必要があります。前述のようにホワイトリストを作成する必要がありますが、href だけではありません。例:
<img src="nosuchimage.blahblah" onerror="alert('Haxored!!!');" />
また
<a href="about:blank;" onclick="alert('Haxored again!!!');">click meh</a>
PHP の のコンパニオン関数strip_tags
、つまりstrip_attributes
. 残念ながら、まだ書かれていません。(ヒントヒント。)
ただし、ドキュメントには興味深い提案がありstrip_tags
ます。
http://www.php.net/manual/en/function.strip-tags.php#85718
理論的には、これにより、送信されたリンクから href、クラス、または ID 以外のものはすべて取り除かれます。おそらくさらにロックダウンして、hrefsを取得したいようです。
1 つのオプションは、html をまったく許可せず、一部のフォーラムが使用するのと同じ種類のフォーマットを使用することです。交換するだけ
[url="xxx"]yyy[/url]
と
<a href="xxx">yyy</a>
これにより、マウスオーバーなどの問題を回避できます。次に、リンクがホワイトリストに登録されたプロトコルで始まり、引用符が含まれていないことを確認してください ("
または、php やブラウザーによって復号化される可能性のあるもの) )。