phpのFormを作る時のセキュリティについて!!😳😳😳😳
こんにちわ!おーかいです。
最近、PHPの復習をしています。
本題
いつも自分はlaravelを使って、formを作成していたのですが、
laravelでは@csrfとやるだけで、laravelがよしなにその対策をしてくれて、今までそれに対して疑問を持つことがありませんでした。
そこで今回自分でコードを書いてみることに!!
有名なやり方なのですが、エスケープ処理というものがあるらしいです。
ベタがきで書いていきます。
<form action="index2.php" method="POST">
<label for="name">名前:</label>
<input id="name" type="text" name="name" size="70">
<br>
<label for="email">メールアドレス:</label>
<input id="email" type="email" name="email" size="70">
<br>
<input type="submit" value="送信">
</form>
このような感じで書いていきました.
次にこの画面で送信すると
こんにちわ、<?=$_POST["name"]?>さん
<br>
あなたのアドレスは<?=$_POST["email"]?>ですね。
ここへ飛びます。
では実行してみましょう。
はい!きちんと送信と表示ができました💪💪💪
これでひとまずformは終わりですが、本題はXSSの対策!!エスケープ処理
では、入力画面でスクリプトタグを入れてみます。
送信ボタンクリック
あらららららら、、、。本来jsのalertはコード側からできるのにまさかのユーザー画面からできてしまった!!!
この対策を今回やりたいと思います。名前はエスケープ処理
エスケープ処理
では、公式よりコードの確認
ふむふむ!!!!
まずはエスケープ処理とはなんだよですよね。
自分の解釈では、スクリプトタグなど、意味を持ったコード(開発者が意図しないもの)が入力欄に書かれた時、全ての入力をいったん文字列にしてから処理するってやつです。
returnで入力値をstringに変えるのでみてください
では、
<?php
function e(string $str, string $charset = 'UTF-8') : string
{
return htmlspecialchars($str, ENT_QUOTES | ENT_HTML5, $charset);
}
別ファイルを用意して、htmlspecialchars関数を使い文字列に変換します。
<?php require_once './encord.php';?>
こんにちわ、<?=e($_POST["name"])?>さん
<br>
あなたのアドレスは<?=e($_POST["email"])?>ですね。
まず、さっきの表示するファイルにエスケープをしてくれるファイルをインポート。
次に、関数を通して表示したいので
<?=$_POST["name"]?>
<?=$_POST["email"]?>
↓
<?=e($_POST["name"])?>
<?=e($_POST["email"])?>
このように書き換えます。
そうすると、、、、
スクリプトタグが入力されても、文字列として扱うので、アラートで出ることはなく無事表示できました。👏
終わりに
今回、セキュリティに少し触れて楽しすぎて興奮気味で勉強したので、アウトプットが雑な感じがしますが。
XSSなどを勉強した時にちゃんとまとめます。
どんどんプログラミングが楽しくなってきています。
もっともっと上に行く。負けません。💪💪💪💪💪💪
頑張ります🙇🏻♂️🙇🏻♂️🙇🏻♂️🙇🏻♂️🙇🏻♂️🙇🏻♂️
応援よろしくお願いします。自分のモチベーションになります🙇🏻♂️🙇🏻♂️🙇🏻♂️🙇🏻♂️