コード
エスケープするための関数があるので紹介する。
$_POST["username"]
本来このようになっているところをhtmlspecialchars関数を用いて以下のように記述する。
htmlspecialchars($_POST["username"], ENT_QUOTES, 'UTF-8')
&, “, <, >がエスケープされるが、第2引数のENT_QUOTESを加えることで’もエスケープされる。 第3引数は文字セットである。
実際のミス
mysqli_real_escape_stringを使ってしまった。
これはSQL文でエスケープされる関数なので、今回はHTMLの時点でXSSが起きているので意味がなかった。
PHP内だけでhtmlspecialcharsを使ってしまった。
今回はHTML内でJavaScriptとして認識されてしまったので意味がなかった。