htmlspecialchars関数でXSS対策をする

はじめに

POSTを使うときにHTMLのエスケープ対策を行なっていなく、以下の入力があるとjavascriptなどとの干渉によりXSSが発生する

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

そこで、htmlspecialchars関数を使用することでHTML特殊文字をエスケープする

htmlspecialchars関数の使い方

・基本形

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

基本形は上記の通りだがhtmlspecialcharsをいちいち入力するのは面倒なので、関数を作る

function h($str)
    {   
    echo htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
    }   

・実例

次のコードはXSS対策がされていない

index.php

01<?php header("X-XSS-Protection: 0");?>
02<?php
03    $logged_in = false;
04
05    // ログインボタンが押された場合      
06    if (isset($_POST["login"])) {
07        $username = $_POST["username"];
08        $password = $_POST["password"];
09        try {
10            $dbh = new PDO('mysql:dbname=form;host=localhost', 'root', '');
11        } catch (PDOException $e) {
12            exit('データベースに接続できませんでした'.$e->getMessage());
13        }   
14        $sql = "SELECT * FROM user_info WHERE name= ? AND password= ?";
15        $stmt = $dbh->prepare($sql);
16        $data=$stmt->execute(array($username,$password));

略
?>

04行に基本形の項目で作ったhtmlspecialcharsの関数を入れ、07行と08行を次のように変更することでXSS対策ができる

07        $username = h($_POST["username"]);
08        $password = h($_POST["password"]);