0

データベース (MySQL) からの出力で htmlspeciachars を使用する場合、XSS を防ぐために他に何を考慮する必要がありますか?

データベース (この場合は MySQL) からデータをフェッチするときに、出力で htmlspecialchars を使用すると XSS を防止できるというのは正しいですか? この場合、HTML は HTML ドキュメントに表示されますか? 他に考慮すべきことはありますか?他にどのような場合に XSS に対して脆弱になる可能性がありますか?

ユーザーが新しい投稿を投稿するためのログインシステムを作成したWebサイトがあり、ここでユーザーはこれらのニュース投稿を削除できますが、JavaScript関数がalertbox()で使用され、ユーザーが本当にこのニュースを削除したいのですが、そうであれば、ニュース ID は次のようなリンクによって URL を介して渡されます。

echo '<a class="btn-small btn-danger" onclick="deleteNews('. htmlspecialchars($newsidfk) .')" ">Delete news</a>'; 

Javascript 関数:

//alert deleteNews
function deleteNews($newsidfk)
{
var ans = window.confirm(Are you sure you want to delete this news post?');
        if (ans == true)
        {
            window.location.href="delete.php?news_id_fk="+$newsidfk;
        }
}

XSS を防ぐために考慮すべきことが他にありますか、またはここで XSS を実行できませんか? 数値の代わりに文字列を持っているとしましょう。JavaScript エンコーディングを行う必要がありますか?encodeURI() 関数でしょうか?

htmlspecialchars を使用して、たとえば script-tags、link-tags、img-tags の実行を防止するのは正しいですか? そして、これが XSS の仕組みです。たとえば、誰かがユーザーの個人情報を盗むことができるからです。

データベースからの出力を表示するときは常にサニタイズする必要があることを学びましたが、データベースに保存されている入力はどうですか? これもサニタイズする必要がありますか、それとも PDO の準備済みステートメントを使用するだけで十分ですか?

wiki のこの記事から HTML サニタイズについて読みました: http://en.wikipedia.org/wiki/HTML_sanitization

4

2 に答える 2

1

JavaScriptリテラルは常にJSONとして出力します。

<a class="btn-small btn-danger" onclick="deleteNews(<?php echo htmlspecialchars(json_encode($newsidfk)); ?>)" ">Delete news</a>

<script>
var data = <?php echo json_encode($data); ?>
</script>
于 2013-01-06T22:25:28.447 に答える
1

データベース (この場合は MySQL) からデータをフェッチするときに、出力で htmlspecialchars を使用すると XSS を防止できるというのは正しいですか? この場合、HTML は HTML ドキュメントに表示されますか? 他に考慮すべきことはありますか?他にどのような場合に XSS に対して脆弱になる可能性がありますか?

はい、それはある程度正しいです。見落とされがちな全体像の 1 つの部分は、文字エンコーディングです。デフォルトではこれはかなりうまく機能しますが、通過するデータで使用するエンコーディングが関数自体にも通知されていることを確認しなかった場合、問題が発生する可能性があります。htmlspecialchars

たとえば、PHP 5.3 を使用していて、データベースに UTF-8 でエンコードされた文字列があり、そのようにクエリを実行し、HTML 内で UTF-8 を使用している場合は、次のようにも伝える必要がありますhtmlspecialchars

$flags    = ENT_COMPAT | ENT_HTML401;
$encoding = 'UTF-8'

htmlspecialchars($string, $flags, $encoding);

PHP 5.4 を使用している場合でも、UTF-8 がデフォルトのエンコーディングであるため、指定する必要はありません。

htmlspecialchars($string);
于 2013-01-06T23:19:20.917 に答える