2018/12/30にGoogle日本語版で『PHP メールフォーム』を検索した結果です。
日によって変動する可能性があります。
1位 PHP工房 https://www.php-factory.net/mail/01.php
PHP4.3.9~PHP7
やめろ。
努力はわかるのだが、努力の方向性が全力で間違っているというか。
クラスすら使えない時代の古のPHPに対応するため、今から見ると「とてもひどい」としか言いようのない構造です。
しかもそのままの状態で進化し続けてしまったため、もはや手の出しようがない混沌になっています。
そんな有様でありながら、脆弱性対策もしっかり行っており、CSRF対策やレスポンシブ対応までしっかりされています。
惜しくも$mail_check=0
にした場合にメールヘッダインジェクションできますが、これはメアド形式チェックをしないというフラグで、デフォルトもチェックするとなっているので、まあ仕方ないところでしょう。
それ以外はざっと見たかんじではstripslashes
の位置がおかしいくらいで、なんというか、ここまでよくやったなあと逆に感心するくらいです。
ただし、今さらPHP5.1の環境にフォームを作れと言われたなどという頭のおかしい案件以外では使うべきフォームではありません。
そういう案件にとってはまさに救世主と言っていいものではあるのですが、でも検索結果の一番上に出すようなものではないですね。
2位 侍エンジニア塾 https://www.sejuku.net/blog/38594
巷で大人気の侍エンジニア塾による記事です。
これは期待が持てますね!
<td><?php echo $_POST["name"]; ?></td>
せやな。
3位 ウェブデザインラボ https://www.webdlab.com/labs/form-mail/
個人的駄目サイトの判定条件として『マークアップが崩れているサイトは駄目』というものがあるので、これを適用するとよいと思います。
$email = htmlspecialchars($_POST['email']);
$header = 'From: '.$email."\r\n";
mb_send_mail($to, $subject, $message, $header);
4位 WebCamp https://web-camp.io/magazine/archives/5181
if (!mb_send_mail("example@example.com",
$_POST["subject"],
$message,
"From:" . $_POST["mail"])
) {
exit("error");
}
3位よりひでーや。
5位 HPcode https://haniwaman.com/responsive-mailform/
FIRSTSTEPのResponsive Mailformを紹介している記事です。
Responsive Mailformは、フォームの見た目はいいかんじで、中身もぱっと見では脆弱性はなさそうです。
惜しいところでは、ありがちな『入力時htmlspecialchars』をしているせいでメールが文字化けしますが、脆弱にはなっていないようです。
あとは、やたらめったらaddonディレクトリをfile_exists/includeしてるあたりはどうにかならないのだろうか。
6位 Qiita https://qiita.com/seihowlow24/items/debfd42a611c13664d57
MicroEngine Mailform、PHP工房、Creasty form-phpを紹介している記事です。
PHP工房は1位のやつです。
form-phpはただのバリデーションライブラリなので一般人が使うのは難しそうです。
脆弱性はなさそうですが、気になる書き方が色々あってあまり自力で使う気にはならないかな。
MicroEngineは、なんというか、こいつだけ明らかにレベルが違うね。
7位 TECHACADEMY https://techacademy.jp/magazine/11629
ちょっと問題があるけど、関数を書くだけで送信できるんだ。
$to = $_POST['to'];
$title = $_POST['title'];
$content = $_POST['content'];
mb_send_mail($to, $title, $content);
ちょっとどころじゃなかった。
普通に送ると、迷惑メールとして認識されてしまうことが多いんだよ。
問題を認識してすらいなかった。
8位 吉川ウェブ https://yoshikawaweb.com/free-php-mailform.html
PHP工房、TransmitMail、Responsive Mailformを紹介している記事です。
TransmitMailはメール送信にQdmailを使っているので、脆弱性の問題はないでしょう(見てない)
PHP工房は1位のやつ、Responsive Mailformは5位で紹介されているやつです。
9位 PHPプログラミング https://gray-code.com/php/make-the-form-vol1/
このページには入力画面しかなかった。
続きを見てみると、だいたい予想通りでした。
<?php echo $_POST['email']; ?>
mb_send_mail( $_POST['email'], $auto_reply_subject, $auto_reply_text);
10位 神田ITSchool http://www.kanda-it-school.com/sample/php/seminar/php_seminar_sample_code/ch04_2.php
$email = $_POST["email"];
<input type="hidden" name="email" value="<?php echo $email; ?>">
mb_send_mail($email, $subject, $body, $header);
いつもの。
感想
ちゃんとしたところとアウトのところのレベル差がどうしようもなく隔たってますね。
まず2位、3位、4位、7位、9位、10位は論外で、『絶対に参照してはいけない』です。
むしろ有害サイトとして通報すべき案件。
5位、6位、8位は紹介ページです。
使ってもいいメールフォームを公開しているのは1位だけとかいう非常に残念な結果に。
紹介ページで妥当なものを含めたとしても打率40%で、半分以上がゴミというのはひどい話です。
紹介されたフォームを含め、自分で使いたいものを比べてみたらこんな感じですかね。
MicroEngine Mailform > Responsive Mailform > TransmitMail > PHP工房 > Creasty form-php
この中から選べと言われたらMicroEngine Mailformを選びます。
それ以外でといわれたら自作します。
そもそも最近はフレームワークでフォームもメール送信もできるので、そちらを使う方がよいでしょう。
まあフレームワークはフォームだけのものではないので、静的ページにフォームだけ突っ込んでとか言われたときはオーバースペック過ぎてむしろ困ったりしますが。
おまけ:11-20位
11位 HTMLクイックリファレンス http://www.htmq.com/tutorial/30_11.shtml
$mailaddress = $_POST["mailaddress"]; //メールアドレス
$mailaddress = htmlspecialchars($mailaddress, ENT_QUOTES);
$mail_header = "from:".$mailaddress; //送信元として表示されるメールアドレス
mb_send_mail($mail_to, $mail_subject, $mail_body, $mail_header);
12位 ITかあさん http://www.kaasan.info/archives/2151
//-fって何か意味あったんだけど忘れました -fすると迷惑メールになりにくいとか、そんなことだったと思う。
13位 3日で作るホームページ http://www.homepage-4u.com/middle/6.html
PHP工房の中の人のようだ。問題なさそう。
14位 MicroEngine Mailform https://microengine.jp/mailform/
5位で紹介されているやつの本家。
検索結果は本家を先に出すようにすべき。
15位 webico https://blog.webico.work/php-mailform
少し触れてみて、phpはセキュリティ面も同時に抑えていかないとお仕事で使うには不安が多いなと感じました。
今回はクロスサイトスクリプティング対策として、内容確認画面の出力時にHTMLエンティティ化してます。
ですが「php セキュリティ対策」のキーワードで出てくる他の攻撃については今いち理解ができず…
セキュリティについて言及しているだけ他のゴミより100億倍マシではあるのですが、残念ながら考慮が足りておらずindex.php
にXSS、send.php
にメールヘッダインジェクションがあります。がんばれ。
16位 思考の葉 https://noumenon-th.net/programming/2016/02/21/mail_form/
惜しい!
<input type="hidden" name="token" value="<?=$_POST['token']?>">
ここ以外はたぶん完璧なのに。
17位 PHP入門サンプル置き場 https://ifep.jp/php_sample/mailform/index.html
$headers ="From: ".$_POST['mailadd']."\r\n";
18位 DETAIL NOTE http://idd.tokyo/blog/?p=369
<input type="hidden" name="email" value="<?php echo $_POST['email']; ?>">
メールヘッダは固定なのでメールヘッダインジェクションはありません。
これが最も安全な対策ですね。
19位 web制作の覚え書き http://www.radia.jp/utf-8-mailform/
PHP、Perlの6フォームを紹介している記事。
20位 ジューベー株式会社 https://jubei.co.jp/formmail/
難読化されておりリバエン禁止のため詳細不明。
感想
ライブラリでは14位、やってみた記事では16位が一番できがいいです。
やってみた系記事は勉強のアウトプットという意味もあるので、穴があるのはまあ仕方ないところもあります。
しかし、ITスクールとかいう肩書きを出しつつなにひとつエスケープしてない、概念すら語っていないというのはちょっと、いや全くどうしようもないですね。