HTML、JavaScript、および DOM を使用してクロスサイト スクリプティングを防止する方法
XSS として広く知られているクロスサイト スクリプティングは、サイバー犯罪者が使用する最も危険な攻撃方法の 1 つであるため、すべての開発者とセキュリティ研究者がそれが何であるか、および攻撃を防ぐ方法を知っていることが重要です。では、XSS の脆弱性に対してどのように対処できるでしょうか? HTML、JavaScript、または DOM を使用して、Web サイトがユーザーから受け取るデータを表示します。これら 3 つの異なる領域の 1 つまたは複数を連携させることができます。
HTML を使用して XSS を防止する方法
XSS を使用すると、攻撃者は悪意のあるコードやスクリプトを Web ページに挿入し、サイトにアクセスする無防備なユーザーを標的にすることができます。これにより、個人データが盗まれたり、訪問者がサイバー犯罪者によって設定された別のサイトにリダイレクトされたり、Web ページの外観が改ざんされる可能性があります。ただし、これを防ぐことはできます。たとえば、HTML の挿入を停止します。
ゲストブックを含む Web サイトがあるとします。このゲストブックを使用している訪問者は、ここに自分の名前とメッセージを書き込むことができ、そのメッセージは公開されているとします。ゲストブックで XSS テストを実行しようとする攻撃者は、メッセージを書き込むために割り当てられた領域を使用します。そのサイバー犯罪者は、ここで JavaScript コードを実行します。たとえば、攻撃者は次のような JavaScript コードを使用する可能性があります。
<script>alert("The XSS!")</script>
これを成功させるには、攻撃者はスクリプト タグを使用する必要があります。そうでない場合、JavaScript コードは機能しません。ユーザーが HTML タグを使用できないように、< ステートメントをエンコードする必要があります。これにより、攻撃者が HTML タグを操作することが困難になります。
JavaScript を使用して XSS を防止する方法
HTML のロジックは JavaScript でも有効です。一部のアプリケーションでは、Web サイトがユーザーから受け取ったデータを JavaScript コードで印刷することができます。
次のコーディングを検討してください。
<p id="print"></p>
<script>
document.getElementById("test").innerHTML = "";
</script>
上記のようなコード ブロックを使用する Web サイトを想像してみてください。開発者はここで「print」という「p」タグを使用しました。コードからわかるように、値は「search」パラメーターから取得され、開発者はこの受信値を「p」タグに表示したいと考えています。この操作を行った開発者は、JavaScript の innerHTML 機能を使用したいと考えていました。
次に、サイバー攻撃者の観点から状況を見てみましょう。このような場合、攻撃者は「script」タグ内で XSS テストを実行します。このために、攻撃者はタグを再起動する必要はありません。これは、「スクリプト」タグが既に使用されているためです。次に、攻撃者は次のようなテストを作成できます。
filename.php?search=a" alert("The XSS!"); f= "
このコードは Web サイトに次のように表示されます。
document.getElementById("test").innerHTML = " a" alert("The XSS!"); f=" ";
その攻撃は成功するでしょう。この問題をよりよく理解するために、攻撃者が使用できる手法の例をもう 1 つ見てみましょう。ハッカーは、次のような XSS テストを適用した可能性があります。
filename.php?search=";</script><em>Fatih</em>
Web サイトから表示すると、次のようになります。
document.getElementById("test").innerHTML = " ";</script><em>Fatih</em> ";
これは、攻撃者が最初の「script」タグを「/script」のような構造で閉じているため、少し奇妙に思えるかもしれません。そのため、攻撃者は任意の JavaScript および HTML コードを再起動できます。
これら 2 つの異なる例について考えると、XSS からの保護は非常に単純に思えます。必要な予防策は、最初の例に見られる「」と「」の文字をエンコードすることです。2 番目の例では、文字<および>をエンコードします。
DOM を使用して XSS を防止する方法
XSS のこの亜種では、Web サイトがユーザーから受け取るデータが DOM 要素のプロパティに干渉する可能性があります。たとえば、サイトがユーザーから受け取る色情報は、テーブルの背景色やページの背景全体に影響を与える可能性があります。そのため、ユーザーは無意識のうちに body と table のスタイル レイアウトに干渉してしまいます。次のコードは、この良い例です。
<body bgcolor="<?php echo $_GET['color'];? >"/>
これにより、Web サイトは、ユーザーから直接受け取った「color」パラメーターを「body」要素の「bgcolor」プロパティで使用します。では、この時点で攻撃者は何ができるでしょうか? 彼らは次の悪意のあるコードを実行する可能性があります。
filename.php?color=red" onload="alert('The XSS!')
これを Web サイトから見ると次のようになります。
<body bgcolor=" red" onload="alert('The XSS!') "/>
これを防ぐには、開発者は“文字をエンコードする必要があります。
ただし、JavaScript には注意すべき重要な要素がもう 1 つあります。次のコード スニペットは、この例です。
<a href="javascript:alert('The XSS!')">
これは、一部の JavaScript コードを直接実行できることを意味します。最善の予防策の 1 つは、Web サイトがユーザーから受け取るデータが実際の URL であるかどうかを確認することです。最も簡単な方法は、接続に「HTTP」や「HTTPS」(HTTP の安全なバージョン) などの表現があることを確認することです。
PHP で XSS を防止する関数の例
アプリや Web サイトを XSS 攻撃から保護する方法の例をいくつか見てきました。次の表のコード スニペットを PHP で使用できます。
これらは単なる例であり、使用しているソフトウェア言語によって異なることに注意してください。
PHP で Web アプリケーションを作成し、上記のコードを試してテキスト出力することができます。これらすべてのメソッドを使用する方法を知りたい場合は、以下の PHP コード ブロックからいくつかのアイデアを得ることができます。これは、別の言語を使用している場合でも役立つはずです。
<?php
$data = $_GET['data'];
function in_attribute($str){
return htmlspecialchars($str, ENT_COMPAT);
// ENT_COMPAT will encode the double quote (") character.
}
function in_html($str){
$link = '/^(((https?)|(\/\/))).*/';
if(!preg_match($link, $str))
{
return "/";
}
return $str;
}
$data = in_attribute($data);
$data = in_html($data);
$data = real_url(data);
?>
Web サイトを XSS などから保護する
XSS は、ハッカーが使用する一般的な攻撃ベクトルです。通常、URL のパス値、つまりデータを入力できる Web サイトの任意のフィールド (フォームやコメント フィールドなど) を使用して、XSS 脆弱性をテストできます。しかしもちろん、サイバー犯罪者がサイトを攻撃するために使用できるさまざまな方法があります。特に、多くのユーザーがいて、その情報を隠している Web サイトがある場合はなおさらです。
コメントを残す