見出し画像

【 PHP学習 #16 】 セキュリティ 「XSS対策」  FIREへの旅路 ♯466

問い合わせフォームは、攻撃の対象となりやすい機能です。

これらへの対策は必須になります。


こちらのフォームの続きです!
コードなど続いて使います。


【 XSS 】

クロスサイトスクリプティング(XSS)とは、攻撃対象のWebサイトの脆弱性を突き、攻撃者がそこに悪質なサイトへ誘導するスクリプトを仕掛けることで、サイトに訪れるユーザーの個人情報などを詐取する攻撃のことを指します

問い合わせのフォームの入力欄に、JavaScriptコードを入力してみます。

<script>alert('あなたのデバイスはウイルスに感染しました!')</script>

コードを入力して、確認するボタンをクリックすると・・・

このように、アラートが表示されました。


つまり、入力欄に書いたJavaScriptのコードが実行されてしまったということです。

この状態では、JavaScriptのコードを入力すれば、もっと複雑な処理も実行されてしまうということになります。


▶︎ 対策 サニタイズ

JavaScriptのコードの特徴として、< >や、' ' などの文字が含まれます。

このような文字を別の文字列に変換することで、コードが実行されないようにします。

これをSanitize(サニタイズ)するといいます。消毒という意味です。


▶︎ htmlspecialchars

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

PHPの専用のサニタイズの関数が、htmlspecialcharです。

この関数は、コードに含まれる、&・" ・'・<・>といった文字列を別の文字列に変換して無害化する関数です。

この関数は、名前が長いので、別の関数の格納して使うことが多いです。


h関数  に 格納します。

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

そして、サニタイズが必要な場所に、h関数を有効していきます。



▶︎ 全コード

<?php

//スーパーグローバル変数
//if ( !empty( $_POST ) ) {
//
//  echo '<pre>';
//
//  var_dump( $_POST );
//
//  echo '</pre>';
//
//}


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


//入力=0、確認=1、完了=2 
//表示する内容を切り替える条件を設定する

$pageFlag = 0;

if(!empty($_POST['btn_confirm'])){
	$pageFlag = 1;
}

if(!empty($_POST['btn_submit'])){
	$pageFlag = 2;
}


?>

<!DOCTYPE html>
<meta charset="utf-8">
<head>
</head>
<body>
	
	
<!--入力画面-->
<?php if($pageFlag === 0) : ?>
		
<form method="POST" action="input.php">
	氏名
	<input type="text" name="your_name" value="<?php if(!empty($_POST['your_name'])) {echo h($_POST['your_name']);} ?>">
	
	<br>
	
	メールアドレス
	<input type="text" name="email" value="<?php if(!empty($_POST['email'])) {echo h($_POST['email']);} ?>">	
	<br>
	
	<input type="submit" name="btn_confirm" value="確認する">
</form>
	
<?php endif; ?>
	
	
	
	
<!--確認画面-->
<?php if($pageFlag === 1) : ?>
	
<form method="POST" action="input.php">
	氏名
	<?php echo h($_POST['your_name']);?>

	<br>
	
	メールアドレス
	<?php echo h($_POST['email']);?>

	<br>
	
	<!--戻るボタン-->
	<input type="submit" name="back" value="戻る">
	
	<!--送信ボタン-->
	<input type="submit" name="btn_submit" value="送信する">
	<input type="hidden" name="your_name" value="<?php echo h($_POST['your_name']);?>" >
	<input type="hidden" name="email" value="<?php echo h($_POST['email']);?>" >
</form>
	
<?php endif; ?>
	
	
	
	
<!--完了画面-->
<?php if($pageFlag === 2) : ?>
	送信が完了しました
<?php endif; ?>
	
	

</body>
</html>



サニタイズ用のコードは、htmlの前のPHPの中に書きます。

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



h関数に格納したので、サニタイズする箇所を、h( )で囲んでいきます。

サニタイズする箇所は、
nameをechoした場所です。


① 入力画面

氏名
<input type="text" name="your_name" 
value="<?php if(!empty($_POST['your_name'])) {echo h($_POST['your_name']);} ?>">
	
<br>
	
メールアドレス
<input type="text" name="email" 
value="<?php if(!empty($_POST['email'])) {echo h($_POST['email']);} ?>">	

<br>

入力画面の、氏名と、メールアドレスのvalueの中のPHPのif文の中です。



② 確認画面

<!--送信ボタン-->
	<input type="submit" name="btn_submit" value="送信する">
	<input type="hidden" name="your_name" value="<?php echo h($_POST['your_name']);?>" >
	<input type="hidden" name="email" value="<?php echo h($_POST['email']);?>" >

確認画面の、input type = hidden としたところのPHPコード内です。


▶︎ 結果

JavaScriptのコードを形成する文字が、別の文字に変換されたので、コードとしては機能せずに、文字列として、氏名欄に入力されます。


【 まとめ 】

セキュリティは非常に重要なことですから、
しっかりと学んでおく必要があります!


この記事が気に入ったらサポートをしてみませんか?