前回の続きです。今回は、サーバーがデータを受け取った後のPHPの処理についてです。PHPの関数や条件を使います。またこのままのコードでは、セキュリティ的にやばいので、対策をします。
それでは、はじめます。
前回は、HTMLで入力フォームを作り、サーバーへメッセージを送りました。
HTMLフォームからPHPで受け取ったデータのチェックをして、投稿内容を表示するところまで解説します。
PHPの練習です。
PHPには最初からいろいろ便利な関数があります。
使い方も簡単です。
カタカナを全角カナから半角カナに変換してくれる関数を使って、実際に全角カナから半角カナに変わるか見ていきます。
<?php
$title = $_POST['title'];
$title = str_replace("楽しい", "面白い", $title);
#全角カナから半角カナに変える
$title = mb_convert_kana($title, "k");
echo $title;
?>
ブラウザーを開いて、localhost:8000 にアクセスして「楽しい!ブログ製作!」と入力して送信してみましょう。
「面白い!ブログ製作!」になりましたね。
mb_convert_kana ( string
https://www.php.net/manual/ja/function.mb-convert-kana.php$string
, string$mode
= “KV” , string|null$encoding
=null
) : string
PHP関数は、まず関数の名前を書きます。 次にかっこ( )を書きます。かっこ( )の中に書いているのは、引数という関数に送る値です。
具体的に解説すると、mb_convert_kanaが関数の名前です。引数は、(変換したい文字、変換するモード、変換する文字コード)です。
string $string
: 変換したい文字はstring(文字)で書いてね
string $mode
= “KV” : 変換オプションもstring(文字)で書いてね
PHP: mb_convert_kana – Manualに、オプションの表があります。半角の英字を全角に変換したり、全角の数字を半角にしたりあります。
string|null $encoding
= null
: 文字コードも、string(文字)か、なければnull(なくて)OK
最後の :string は関数の結果は、文字で返すねということ。今回は、「面白い!ブログ製作!」という文字が返ってきました。
index.htmlをカテゴリーと記事内容を付け加えてみましょう。
<html>
<head>
<title>blog</title>
</head>
<body>
<h1>はじめまして!ブログ!</h1>
<form action="./blog.php" method="post">
タイトル:<br>
<input type="text" name="title"><br>
カテゴリー:<br>
<input type="text" name="category"><br>
記事:<br>
<textarea name="comment" cols=50 rows=8></textarea >
<br><br>
<input type="submit" value="送信">
<input type="reset" value="クリア">
</form>
</body>
</html>
どうでしょうか。よりブログらしくなったと思います。
PHPで受け取れるようにコードを書き換えましょう。
<?php
$title = $_POST['title'];
$category = $_POST['category'];
$comment = $_POST['comment'];
$title = str_replace("楽しい", "面白い", $title);
#全角カナから半角カナに変える
$title = mb_convert_kana($title, "k");
echo $title;
echo $category;
echo $comment;
?>
もしPHPでデータを受け取った時、タイトルやブログ記事がなかった場合どうしましょうか。その場合は記事として登録できないですよね。
空で送られてきた場合は、処理を止めてもう一度入力フォームに書いてもらう仕組みに変えましょう。
<?php
$title = $_POST['title'];
$category = $_POST['category'];
$comment = $_POST['comment'];
#タイトルと記事の内容がなかった場合
if( empty($title) || empty($comment) ){
header('Location: index.html');
exit;
}
$title = str_replace("楽しい", "面白い", $title);
#全角カナから半角カナに変える
$title = mb_convert_kana($title, "k");
echo $title;
echo $category;
echo $comment;
?>
localhost:8000にアクセスをして、タイトルや記事内容を書かないで、「送信」を押してもリダイレクトがかかり進めなくなりました。
if文をつくりました。書き方はこんな感じです。
if ( 条件式 ){ 条件式が真ならここの処理 }
今回は、
#もしタイトルか記事内容どちらかなかったら if ( empty($title) || empty($comment) ){ # indexページに飛ばします。 header('Location: index.html'); #処理を終えます。 exit; }
条件式の中にある || はなんでしょうか。
これは論理演算の論理和です。簡単にいうと英語のORです。
左辺 | 右辺 | 条件式 |
○ | × | ○ |
○ | ○ | ○ |
× | ○ | ○ |
× | × | × |
empty()は、 変数が空であるかどうかを検査して、空の場合は真(○)を返してくれます。 PHP: empty - Manual
empty($title)タイトルがなければ真になります。empty($comment)は、記事内容がなければ真になります。
どちらもある場合にしか次の処理に進めない条件式を書きました。
このプログラム欠点がありまして、すごくセキュリティ的に危ないです。
悪意のスクリプトを埋め込まれて実行できる危険性があるからです。
もしこれが悪意のあるスクリプトだと相当危険です。
クロスサイトスクリプティングと言われるwebの脆弱性を利用した攻撃方法です。
セキュリティ対策をしましょう。
<?php
$title = htmlentities($_POST['title'], ENT_QUOTES);
$category = htmlentities($_POST['category'], ENT_QUOTES);
$comment = htmlentities($_POST['comment'], ENT_QUOTES);
#タイトルと記事の内容がなかった場合
if( empty($title) || empty($comment) ){
header('Location: index.html');
exit;
}
$title = str_replace("楽しい", "面白い", $title);
#全角カナから半角カナに変える
$title = mb_convert_kana($title, "k");
echo $title;
echo $category;
echo $comment;
?>
サニタイジング(エスケープ)という対策を行います。Javascriptのコードにある 「<」 、「>」、「&」、「’」、「”」の文字を別の文字に置き換えるようにしました。
HTMLエンティティという文字の集まりがあり、それに変換することで、Javascriptのコードは実行されなくなり、入力された文字が表示できるようになりました。
htmlentitiesという関数を使用し、サニタイジング(エスケープ)をしました。
無事セキュリティ対策ができました。
今回はここまでです。
本格的にPHP学びたいという場合は、スクール受講おすすめします。今回解説したあたりでしたら、はじめてのプログラミングコース とかです。 webセキュリティにもっと興味がある場合は、UdemyのWeb開発初心者向けセキュリティ入門 – SQLインジェクションとXSSを試す あたりです。無料なので受講してみて損はないです。
Q1)「全角」英字を「半角」に変換するのはどうしたらいいでしょうか。「楽しい!BLOG製作!」を入力すると「面白い!BLOG製作!」になるように試してみてください。
$title = mb_convert_kana($title, "r");
Q2)もうひとつ「楽しい!ブログ製作!」を「面白い!ぶろぐ製作!」にするにはどうしたいいでしょうか。
$title = mb_convert_kana($title, "c");
mb_convert_kanaは、いろいろ変換できるんですね。
HTMLフォームからPHPがデータを受け取った後の処理について解説しました。
関数や式をはじめて使いましたが、これを組み合わせることで高度な処理もできるようになります。
例えば、今日が晴れなら明日が晴れる確率は?とか。
if($today = "晴れ"){ $tomorrow_percent = forcast_weather("晴れ"); }
次回は、サーバー側でブログ内容を保存する話をします。
Mysqlなどのデータベースを使いますが、JSONファイルにブログ内容を保存してみます。
最後までお読みいただきありがとうございました!
Photo by Background vector created by pikisuperstar – www.freepik.com