はじめに
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"]);