LoginSignup
0
0

More than 1 year has passed since last update.

【Php】Xss対策 ー学習ノート

Last updated at Posted at 2021-06-13

初めに

Xssの対策について学習した内容のoutput用記事です。

※内容に間違いなどがある場合はご指摘をよろしくお願いします。
※こちらの記事はあくまでも個人で学習した内容のoutputとしての記事になります。

Xss(cross site scripting)とは

攻撃対象者のWebサイトのユーザーが入力するフォームなどからjavascriptなどで不正な入力値を送り込み、悪質なサイトへの誘導や情報漏洩などの被害を与える攻撃手法。

htmlspecialchars()

フォームなどの不正な入力値を安全な入力値に変換してくれる関数。第1引数に変換対象の文字列、第2,3引数にはoptionとしてフラグ、文字エンコードを指定します。

htmlspecialchars (変換対象の文字列, フラグ, エンコード)

フラグにはENT_COMPAT、ENT_NOQUOTES、ENT_QUOTESなどがあり、一般的にシングルクォーテーションとダブルクォーテーションを変換の対象にするENT_QUOTESを指定する。変換する文字エンコードはutf-8などを指定します。

$str = 'hoge';
htmlspecialchars ($str, ENT_QUOTES, 'UTF-8')

htmlspecialchars()関数は長いので、sp_charsという関数を作成し呼び出すようにします。

function sp_chars($str)
{
  return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
}

入力画面,確認画面,表示画面を作成

入力フォームを用意します。画面の構成は入力/確認/表示にします。それぞれのファイルを用意するのではなく、一つのファイルでflagを作り、\$_POSTの値が入っているか否かによって表示するformの表示を切り替えます。

$page_flag = 0;

if (!empty($_POST["btn_submit"])) {
    $page_flag = 1;      //確認画面
}

if (!empty($_POST["btn_confirm"])) {
    $page_flag = 2;      //完了画面
}

if文で条件分岐させます。\$page_flagが0は入力画面、1は確認、2は送信完了にします。

    <?php if ($page_flag === 0) : ?>
        入力画面

    <?php endif; ?>

    <?php if ($page_flag === 1) : ?>
        確認画面

    <?php endif; ?>

    <?php if ($page_flag === 2) : ?>
        送信完了。

    <?php endif; ?>

formを用意します。確認画面には入力された値を表示します。表示される内容は作成したsp_chars関数で消毒します。

  <?php if ($page_flag === 0) : ?>
        入力画面
        <form method="POST" action="xss.php">
            名前
            <input type="text" name="input_name">
            <br>

            <input type="submit" name="btn_submit" value="submit">
        </form>
    <?php endif; ?>

    <?php if ($page_flag === 1) : ?>

        確認画面
        <form method="POST" action="xss.php">
            名前
            <?php echo sp_chars($_POST["input_name"]); ?>
            <br>

            <input type="submit" name="btn_confirm" value="confirm">
            <input type="hidden" name="input_name" 
            value="<?php echo sp_chars($_POST['your_name']); ?>">
        </form>
    <?php endif; ?>

    <?php if ($page_flag === 2) : ?>
        送信完了。
    <?php endif; ?>

不正な入力でテスト

入力値にを入力します。
スクリーンショット 2021-06-13 14.04.12.png
確認画面にが表示され、javascriptの構文は実行されません。
スクリーンショット 2021-06-13 14.06.09.png

参考サイト

https://www.kagoya.jp/howto/network/xss/
https://www.php.net/manual/ja/function.htmlspecialchars.php
https://www.flatflag.nir87.com/htmlspecialchars-555

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0