phpのFormを作る時のセキュリティについて!!😳😳😳😳

こんにちわ!おーかいです。


最近、PHPの復習をしています。

本題

いつも自分はlaravelを使って、formを作成していたのですが、

laravelでは@csrfとやるだけで、laravelがよしなにその対策をしてくれて、今までそれに対して疑問を持つことがありませんでした。


スクリーンショット 2020-10-09 19.30.39

そこで今回自分でコードを書いてみることに!!

有名なやり方なのですが、エスケープ処理というものがあるらしいです。

ベタがきで書いていきます。

<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"]?>ですね。

ここへ飛びます。

では実行してみましょう。

スクリーンショット 2020-10-09 19.54.28

スクリーンショット 2020-10-09 19.54.34

はい!きちんと送信と表示ができました💪💪💪

これでひとまずformは終わりですが、本題はXSSの対策!!エスケープ処理

では、入力画面でスクリプトタグを入れてみます。

スクリーンショット 2020-10-09 19.51.02

送信ボタンクリック 

スクリーンショット 2020-10-09 19.52.38

あらららららら、、、。本来jsのalertはコード側からできるのにまさかのユーザー画面からできてしまった!!!

この対策を今回やりたいと思います。名前はエスケープ処理

エスケープ処理

では、公式よりコードの確認

スクリーンショット 2020-10-09 19.58.52

ふむふむ!!!!

まずはエスケープ処理とはなんだよですよね。

自分の解釈では、スクリプトタグなど、意味を持ったコード(開発者が意図しないもの)が入力欄に書かれた時、全ての入力をいったん文字列にしてから処理するってやつです。

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"])?>

このように書き換えます。

そうすると、、、、

スクリーンショット 2020-10-09 19.51.02

スクリーンショット 2020-10-09 19.51.09

スクリプトタグが入力されても、文字列として扱うので、アラートで出ることはなく無事表示できました。👏

終わりに

今回、セキュリティに少し触れて楽しすぎて興奮気味で勉強したので、アウトプットが雑な感じがしますが。

XSSなどを勉強した時にちゃんとまとめます。

どんどんプログラミングが楽しくなってきています。

もっともっと上に行く。負けません。💪💪💪💪💪💪

頑張ります🙇🏻‍♂️🙇🏻‍♂️🙇🏻‍♂️🙇🏻‍♂️🙇🏻‍♂️🙇🏻‍♂️

応援よろしくお願いします。自分のモチベーションになります🙇🏻‍♂️🙇🏻‍♂️🙇🏻‍♂️🙇🏻‍♂️

いいなと思ったら応援しよう!