【脆弱性】猿でもできる!PHPのセキュリティ対策!part1【XSS】

スポンサーリンク

PHP初心者の方に向けた基本的なセキュリティ対策のPART1です。

何かあればコメントで

  • Part1 ここ
  • Part2 まだ
  • Part3 まだ

スポンサーリンク

初めに

皆さんは、XSS(クロスサイトスクリプティング)という言葉を聞いたことがあるでしょうか。

簡単に言えば、サイトに不正なHTMLタグ等を仕込む攻撃です

XSSを受けると

  • cookieの漏洩
  • セッションハイジャック
  • 機能の不正利用
  • webページ改ざん

等の被害が考えられます

かなり深刻度が高いですね。

では、どのようにすればこの攻撃を防げるのかを解説します。

※追記(2023年8月14日)

投稿から1年弱が立ってSQLファイルのダウンロードができない状況に気が付きましたので直しておきました。

まずXSSをやってみる

はい、まずはやってみないことにはどのような攻撃かわかりにくいと思うので

私のXAMPPで実行していきたいと思います。

参考までに私のPCスペックとXAMPP環境を下に掲載しておきますね

  • PC:Windows10
  • CPU:Corei7 8700
  • PHP: PHP8.0.13
  • MySQL(MariaDB):10.4.22-MariaDB

あと、今回の実験では以下のプログラムを使います

PDOも使うのでMySQLの用意も忘れずに

(ただしこのプログラムを使わないのなら必要ありません。)

プログラム

※変数$dbには以下のように入力してください。

$db = [
     "user" => "DBのユーザー名",
     "pass" => "DBのパスワード",
     "user" => "DBのIPやドメイン",
     "user" => "データベースの名前",
]

==コード==

<?php
    //変数類
    $db = [
        "user" => "",
        "pass" => "",
        "host" => "",
        "name" => "",
    ];
    $dsn  = "mysql:dbname={$db['name']}; host={$db['host']};";
    $pdo  = new PDO($dsn, $db['user'], $db['pass']);
    $text = filter_input(INPUT_POST, 'text');
    //投稿
    if(isset($_POST['submit'])){
        $post = $pdo->query("INSERT INTO board(text)VALUES('".$text."');");
    }
    //投稿を取得
    $stmt = $pdo->query("SELECT * FROM board");
?>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>掲示板</title>
</head>
<body>
    <form method="POST">
        <h1>投稿</h1>
        <textarea name="text" rows="10" cols="50"></textarea><br>
        <input type="submit" name="submit">
    </form>
    <h1>過去の投稿</h1>
    <?php
        foreach($stmt->fetchAll() as $row){
            echo $row['no'].":".$row['text']."<br>";
        }
    ?>
</body>
</html>

SQL

board.sql (board.sql) ダウンロード | うすしおのアップローダー | uploader.jp
ブログのためのやつが設定ミスでパスワードないとダウンロードできなかったので上げなおし

では、まずこんな感じの掲示板があるとします(上の奴です)

んで、ここにこんな感じのコードをでかいテキストボックスに入れて投稿します

<script> alert("XSS"); </script>

そうするとなんと…

不正なスクリプトが実行されてしまいましたー!

今回はテストのためにただのalertですが、これがセッション情報を抜き出したりする

JavaScriptとか、不正にデータを取得するphpタグだったりしたら恐ろしいですね

では、次は対策方法について解説します。

対策方法

じつは簡単です

まず以下のコードをプログラムの一番上(<?phpの下)

に入力します。

function xss($text){
    return htmlspecialchars($text, ENT_QUOTES);
}

そして次に、XSSされそうなとこに以下の要素を追加します

(例)
echo xss($xss_text);

今回のプログラムで言えば、14行目の

$text = filter_input(INPUT_POST, 'text');

ですね

ではこのコードを以下のように修正します

$text = xss(filter_input(INPUT_POST, 'text'));

これだけで対策は終了です。

(ただこの手段だと、過去に書き込まれたものは対策されないので表示するところに対策したほうがいいかもです。)

んで、このコードを加えたうえで

<script> alert("XSS"); </script>

をかきこむと…

この通り、無事対策されましたね!

あ、仕組みを解説し忘れてたので今ここで書くと

<を &lt;

“を &quot

のように変えています

まとめ

今回はXSS(クロスサイトスクリプティング)の対策方法について解説しました!

次回はSQLインジェクションをやろうと思います。

ここまで読んでいただきありがとうございます。

コメント

タイトルとURLをコピーしました