初めに
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; ?>
不正な入力でテスト
入力値にを入力します。
確認画面にが表示され、javascriptの構文は実行されません。
参考サイト
https://www.kagoya.jp/howto/network/xss/
https://www.php.net/manual/ja/function.htmlspecialchars.php
https://www.flatflag.nir87.com/htmlspecialchars-555