キーポイント
クロスサイトスクリプト攻撃は、インターネット上で毎日発生する5つの主要なセキュリティ攻撃の1つであり、PHPスクリプトが免れない場合があります。 XSSとも呼ばれるこの攻撃は、基本的に、ユーザーデータの誤った検証のために可能なコードインジェクション攻撃です。これは通常、Webフォームを介してページに挿入されるか、変更されたハイパーリンクを使用しています。挿入されたコードは、JavaScript、VBScript、HTML、CSS、Flashなどの悪意のあるクライアントコードです。このコードは、サーバー上に有害なデータを保存するか、ユーザーのブラウザで悪意のあるアクションを実行するために使用されます。残念ながら、開発者が安全なコードを提供できないため、クロスサイトのスクリプト攻撃が主に発生します。すべてのPHPプログラマーにとって、可能なセキュリティの脆弱性を活用してPHPスクリプトを攻撃する方法を理解することは責任です。この記事を読むと、クロスサイトのスクリプト攻撃とコードでそれらを防ぐ方法について詳しく知ります。
例から学ぶ
次のコードスニペットを見てみましょう。
<form action="post.php" method="post"> <input type="text" name="comment" value=""> <input type="submit" name="submit" value="Submit"> </form>
ここには、データ入力用のテキストボックスと送信ボタンを備えたシンプルなフォームがあります。フォームを送信した後、処理のためにデータをpost.phpに送信します。以下に示すように、post.phpがデータのみを出力すると仮定します:
<?php echo $_POST["comment"]; ?>
フィルタリングなしでは、ハッカーはフォームから以下を送信できます。これにより、メッセージ「Hacked」というメッセージが記載されたブラウザにポップアップが生成されます。
alert("hacked")
この例は、本質的には悪意がありますが、それほど害を及ぼすわけではないようです。ただし、JavaScriptコードがユーザーのCookieを盗み、そこから機密情報を抽出するために書き込まれた場合はどうなりますか? Simple Alert()呼び出しよりも悪いXSS攻撃があります。
クロスサイトスクリプト攻撃は、悪意のあるペイロードの提供方法に基づいて2つのカテゴリに分割できます。各タイプについて詳しく話し合ってください。
は、悪意のあるコードが実際にサーバーに保存されるのではなく、渡されて被害者に提示されることを意味します。これは、2つの配信方法の中でより一般的なXSS戦略です。攻撃は、電子メールやサードパーティのWebサイトなどの外部ソースから開始されます。これが簡単な検索結果スクリプトの一部です:
<form action="post.php" method="post"> <input type="text" name="comment" value=""> <input type="submit" name="submit" value="Submit"> </form>
この例は、検索クエリがユーザーに表示される非常に安全でない結果ページかもしれません。ここでの問題は、$_GET["query"]
変数が検証または逃げられないため、攻撃者は次のリンクを被害者に送信できることです。
<?php echo $_POST["comment"]; ?>
永続性xss
alert("hacked")
他の場所、comments.txtの内容が訪問者に表示されます:
<?php // 根据查询获取搜索结果 echo "You searched for: " . $_GET["query"]; // 列出搜索结果 ...
ユーザーがコメントを送信すると、データファイルに保存されます。ファイル全体(したがってコメントシリーズ全体)が読者に表示されます。悪意のあるコードが送信された場合、検証や脱出なしに保存および表示されます。
http://example.com/search.php?query=alert("hacked")
クロスサイトスクリプト攻撃を防止
幸いなことに、XSSが保護されていないサイトで攻撃するのと同じくらい簡単で、それらを防ぐのも簡単です。ただし、コードを書く前であっても、予防は常に留意する必要があります。 Web環境(開発、ステージング、または生産)を「強制」する必要があるという最初のルールは、ユーザーまたは他のサードパーティのソースからのデータを決して信頼しないことです。これはあまり強調することはできません。データ入力の各ビットは、出力時に検証し、脱出する必要があります。これはXSSを防ぐための黄金律です。 XSS攻撃を防ぐための信頼できるセキュリティ対策を実装するには、データ検証、データクリーニング、および出力の逃亡に注意する必要があります。
データ検証データ検証とは、アプリケーションが正しいデータで実行されることを保証するプロセスです。 PHPスクリプトがユーザーが整数を入力することを期待している場合、他のタイプのデータが破棄されます。受信したユーザーデータの各部分は、検証プロセスに失敗した場合にそのタイプが正しく、破棄されるように検証する必要があります。たとえば、電話番号を確認する場合は、電話番号に番号のみが含まれている必要があるため、文字を含む文字列を破棄します。文字列の長さも考慮する必要があります。少しゆるくしたい場合は、プラスサイン、ブラケット、ダッシュなどの限られた特殊文字のセットを許可できます。これらは、ターゲットロケールに固有の電話番号をフォーマットするためによく使用されます。
<form action="post.php" method="post"> <input type="text" name="comment" value=""> <input type="submit" name="submit" value="Submit"> </form>
データクリーニングは、データから不要なビットを削除し、それを正しい形式に正規化することにより、データを操作することに焦点を当てています。たとえば、プレーンテキスト文字列がユーザー入力として予想される場合は、HTMLタグを削除することをお勧めします。
<?php echo $_POST["comment"]; ?>
時々、データの検証とクリーニング/正規化を同時に実行することができます。
alert("hacked")
ディスプレイ/出力データの整合性を保護するには、データがユーザーに表示されるときにデータをエスケープする必要があります。これにより、ブラウザが発見される可能性のある特別な文字シーケンスに予期しない意味を適用することができなくなります。
<?php // 根据查询获取搜索结果 echo "You searched for: " . $_GET["query"]; // 列出搜索结果 ...
一緒に!
データ処理の3つの側面をよりよく理解するには、以前のファイルベースのコメントシステムをもう一度見て、セキュリティを確保するために変更しましょう。コードの潜在的な脆弱性は、$_POST["comment"]
がcomments.txtファイルに盲目的に添付され、ユーザーに直接表示されるという事実に起因します。安全であることを確認するには、ファイルに追加する前に$_POST["comment"]
値を検証およびクリーニングする必要があり、ファイルコンテンツがユーザーに表示されるときに逃げる必要があります。
http://example.com/search.php?query=alert("hacked")
スクリプトは、最初に着信コメントを検証して、ユーザーがゼロ以外の文字列を提供していることを確認します。結局のところ、空白のコメントはあまり面白くありません。データ検証は明確に定義されたコンテキストで実行する必要があります。つまり、ユーザーから整数を取得すると予想される場合は、データを整数に変換して整数として処理して検証します。これにより、データが無効な場合は、廃棄してユーザーに知らせてください。次に、このスクリプトは、含まれる可能性のあるHTMLタグを削除することにより、コメントをクリーンアップします。最後に、コメントを取得、フィルター、および表示します。通常、ブラウザで表示することを目的とした出力をフィルタリングするには、htmlspecialchars()
関数で十分です。ただし、Webページで使用しているエンコードをエンコードする文字がISO-8859-1またはUTF-8ではない場合は、htmlentities()
を使用する必要がある場合があります。これら2つの機能の詳細については、公式のPHPドキュメントのそれぞれの説明をお読みください。 Webのような進化する媒体で100%安全な単一のソリューションはないことを忘れないでください。最新のXSSテストベクトルで検証コードを徹底的にテストします。次のソースからのテストデータを使用すると、コードが依然としてXSS攻撃に対して脆弱かどうかが明らかになります。
概要
この記事で、クロスサイトのスクリプト攻撃が何であるか、そしてコードでそれらが発生しないようにする方法を非常によく説明してくれることを願っています。ユーザーやその他のサードパーティのソースからのデータを決して信用しないでください。明確に定義されたコンテキストでの受信値を検証し、データをクリーンアップしてコードを保護し、ユーザーを保護するために出力を逃れることで自分自身を保護できます。コードを作成した後、コードをできるだけ徹底的にテストして、適切に動作することを確認してください。
(Inge Schepers / Shutterstockの写真)
この投稿が気に入ったら、学習可能な場所を学ぶことができます。メンバーは、すべてのSetePointの電子書籍と、ジャンプ開始PHPなどのインタラクティブなオンラインコースに即座にアクセスできます。この記事のコメントは閉じられています。 PHPについて質問がありますか?フォーラムで質問してみませんか?
PHPセキュリティおよびクロスサイトスクリプト攻撃(XSS)に関する
FAQ(FAQ)PHPアプリケーションに対するクロスサイトスクリプト(XSS)攻撃の影響は何ですか? クロスサイトスクリプト(XSS)攻撃は、PHPアプリケーションに大きな影響を与える可能性があります。彼らは、データの盗難、セッションのハイジャック、ウェブサイトの腐敗、さらにはユーザーへの悪意のあるコードの配布につながる可能性があります。 XSS攻撃Webアプリケーションの脆弱性を活用して、悪意のあるスクリプトを挿入し、ユーザーのブラウザで実行します。これにより、アプリケーションとのユーザーの相互作用を危険にさらす可能性があり、機密情報を開示する場合があります。
PHPアプリケーションで潜在的なXSSの脆弱性を特定するには、手動コードレビューと自動テストの組み合わせが必要です。適切なクリーニングや検証なしに、ユーザー入力が出力に直接含まれるコード内の領域を見つけます。 XSSスキャナーなどの自動化ツールは、さまざまなXSS攻撃ベクトルをテストすることにより、潜在的な脆弱性を特定するのにも役立ちます。
XSS攻撃には、通常、他のユーザーが閲覧したWebページに悪意のあるスクリプトを注入することが含まれます。これは、スクリプトをURLパラメーター、フォーム入力、さらにはCookieに埋め込むなど、さまざまな方法で実行できます。悪意のあるスクリプトは、セッションCookieを盗んだり、Webページのコンテンツを操作するなど、ユーザーに代わってアクションを実行できます。
コンテンツセキュリティポリシー(CSP)HTTPヘッダーは、XSS攻撃の防止に重要な役割を果たします。これにより、ブラウザが実行可能なスクリプトの有効なソースであると考えるべきドメインを指定できます。これは、攻撃者がスクリプトをWebページに挿入できる場合でも、スクリプトのソースがCSPでホワイトリストに登録されていない限り、ブラウザはそれを実行しないことを意味します。
ストレージXSS攻撃には、ターゲットサーバーに永続的に保存されている悪意のあるスクリプトを注入することが含まれます。次に、ユーザーが特定のページを表示すると、スクリプトがユーザーに提供されます。一方、反射性XSS攻撃には、URLまたはフォーム入力を介してスクリプトを注入することが含まれます。これは、サーバーが直ちに応答で戻り、ユーザーのブラウザによって実行されます。
PHPは、XSS攻撃の防止に役立ついくつかの組み込み関数を提供します。たとえば、htmlspecialchars()
関数を使用して、ユーザー入力で特殊文字をエンコードして、潜在的なスクリプトを無害にすることができます。 filter_input()
関数を使用して、ユーザー入力をクリーンアップ、削除、またはエンコードすることができます。
httponly cookieは、クライアントスクリプトを介してアクセスできないCookieです。これは、攻撃者がスクリプトをWebページに挿入できる場合でも、スクリプトを使用してHTTPonly Cookieを読み取ったり変更したりできないことを意味します。これは、XSS攻撃によって盗まれないように、機密情報(セッション識別子など)を保護するのに役立ちます。
はい、XSS攻撃は、クロスサイトリクエスト偽造(CSRF)保護をバイパスするために使用できます。攻撃者があなたのWebページにスクリプトを挿入できる場合、それを使用してユーザーに代わってアクションを実行し、実装したCSRF保護をバイパスする可能性があります。これが、XSSとCSRF攻撃の両方から保護することが重要である理由です。
はい、多くのPHPフレームワークは、XSS攻撃に対する組み込みの保護を提供します。たとえば、LaravelはXSS攻撃を防ぐために出力を自動的にエンコードします。 SymfonyやCodeIgniterなどの他のフレームワークは、ユーザー入力とエンコードされた出力をクリーニングする機能も提供します。ただし、完全な保護を提供できるフレームワークはないことを覚えておく必要がありますが、XSS攻撃を防ぐためのベストプラクティスに従う必要があります。
以上がクロスサイトスクリプト攻撃(XSS)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。