【PHP】htmlspecialchars関数でXSS対策をしてみた

◆ Live配信スケジュール ◆
サイオステクノロジーでは、Microsoft MVPの武井による「わかりみの深いシリーズ」など、定期的なLive配信を行っています。
⇒ 詳細スケジュールはこちらから
⇒ 見逃してしまった方はYoutubeチャンネルをご覧ください
【6/19開催】Kong Community Japan Meetup #4
本イベントでは、Kong Inc. のVP of ProductであるReza Shafii氏もプレゼンターとして参加。当社からはアーキテクト マネージャーの槌野の登壇が決定!参加無料です!!
https://column.api-ecosystem.sios.jp/connect/kong/1081/

【6/21開催】開発者目線でのSBOMとの向き合い方
SBOMの導入から開発者がSBOMの作成・管理を自動で行っていくための方法(デモ)を紹介します。SBOMを全く知らない人から、開発との統合までを紹介するので様々なレベルの方に学びがあるライブとなる予定です!
https://tech-lab.connpass.com/event/321422/

【7/19開催】現場で役立つAzure神小技10+α 〜生成AI,RAG,コスト削減など旬な技術満載のLT大会〜
Azureの最新技術や実用的な小技を紹介する特別なライトニングトーク大会を開催します!
https://tech-lab.connpass.com/event/319077/

【7/26開催】最適なIaCツールを選ぼう
プロジェクトでのツール選びに困らないための重要な観点をご説明します!
https://tech-lab.connpass.com/event/319532/

こんにちは。サイオステクノロジーの川田です。
今回はWebアプリケーションの脆弱性のひとつ、クロスサイトスクリプティング(XSS)をご紹介致します。

クロスサイトスクリプティング(XSS)とは

クロスサイトスクリプティングとは攻撃者が悪意のあるスクリプトを埋め込み、ユーザーに実行させる攻撃手法。この攻撃により利用者はCookieのデータや個人情報等を攻撃者に送信してしまい、意図しない操作を実行させられてしまいます!

図にまとめてみました。

とある掲示板に攻撃者は悪意のあるスクリプトを埋め込む。
何も知らない利用者は罠が仕掛けられたリンクをクリック。
偽サイトのログイン画面にジャンプ!
Sサイト用のIDとPWを利用者は偽サイトで入力しログインを押す。
攻撃者は利用者が入力したIDとPW情報を取得することができてしまう。

 

PHPを使ってXSS攻撃を実際にしてみよう!

入力画面を用意しました。
こちらはXSS対策をされていない簡単なプログラムになります。

「確認」ボタンをクリックすると、入力した値が出力されます。

 

それでは入力フォームに「名前」+スクリプトを入力してみます。
※こちらはCookieから値を取得するためのスクリプトになります。

<script>alert(document.cookie)</script>

 

ご参考までに!

事前に入力画面のhtmlファイルにテスト用のCookieを書き込みました。(4行目~6行目)

<!DOCTYPE html>
<html lang="ja">
 <head>
   <script type="text/javascript">
       document.cookie = "test=HelloWorld";
   </script>
   <meta charset="utf-8">
   <title>XSSテスト-入力画面-</title>
</head>
<body>
  <h1>入力画面</h1>
    <form action="confirm.php" method="post">
        <label for="username">Name:</label>
        <input type="text" style="width:290px;" name="name"><br/><br/>
        <input type="submit" value="確認">
    </form>
</body>
</html>

 

「確認」ボタンをクリックすると。
確認画面に先ほど保存したCookieデータが表示されてしまいました((((;゚Д゚))))

では対策方法をみていきましょう。

基本的なXSS対策とは

サニタイジングで対策を行うことです。
先ほどのscriptタグは対策をしなければJavaScriptのスクリプトが実行されてしまいます。
これらの文字列を実行させないようにするのがサニタイジングというわけです。
ではどうやるか!?ということになりますが、PHPでは関数が用意されております。

htmlspecialchars関数について

■変換対象となる文字

変換前 変換後
& [アンパサンド]&amp;
”  [ダブルクォート]引数で「ENT_NOQUOTES」が指定されていない場合は&quot;
‘   [シングルクォート]引数で「ENT_NOQUOTES」が指定されている場合は&#039;あるいは&apos;
< [小なり]&lt;
> [大なり]&gt;

詳しくは公式ページをご覧ください!
参考☞htmlspecialchars

htmlspecialchars関数を使ってみよう!

先ほどのプログラムにhtmlspecialchars関数を使用して、動かしてみます。

■変更前

$name = $_POST['name'];

■変更後

$name = htmlspecialchars($_POST['name'], ENT_QUOTES, "UTF-8");

それではこちらのスクリプトを入力画面に入力します。

<script>alert(document.cookie)</script>

そうするとスクリプトが文字として扱われ、確認画面にそのまま表示されることができました!

ご参考までに!

先ほどの「<script>alert(document.cookie)</script>」はhtmlspecialchars関数を使用すると、
「&lt;script&gt;alert(document.cookie)&lt;/script&gt;」と変換されます!

※ブラウザのソースを表示してみると変換後の値が表示されております。

 

まとめ

今回はPHPの関数を使用して、ご紹介致しました。

■CakePHP
CakePHPは先ほど使用したhtmlspecialchars関数をh()に省略することができます。
viewの出力箇所に「<!–?= h($name) ?–>」をするとエスケープされます。
■Laravel
viewの出力箇所に「{{ $name }}」と実装することでXSS対策を行うことができます。
もし、タグをそのまま実行したいときは「{!! $name !!}」とするとタグをそのまま実行します。

 

簡単ではありましたが、最後までお読みいただきありがとうございましたm(__)m

アバター画像
About kawada 25 Articles
Webアプリケーション開発を行っており、プログラミング初心者向けの記事や動画編集に関する内容を中心とした記事を執筆しています。
ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

1人がこの投稿は役に立ったと言っています。


ご覧いただきありがとうございます。
ブログの最新情報はSNSでも発信しております。
ぜひTwitterのフォロー&Facebookページにいいねをお願い致します!



>> 雑誌等の執筆依頼を受付しております。
   ご希望の方はお気軽にお問い合わせください!

Be the first to comment

Leave a Reply

Your email address will not be published.


*


質問はこちら 閉じる