こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

メールフォーム セキュリティについての質問

メールフォーム セキュリティについての質問

はじめまして。

現在PHPを勉強中で、とりあえずメールフォームを
サンプル本を参考にして作ろうとしているのですが、
不明なところが出てきたので質問させていただきました。

セキュリティのために入力された文字を htmlspecialchars を使って
エスケープをするのですが、それをメールで受信するときには
正常に戻した状態(デコード?)で表示したいと思い
送信するためのスクリプトの前で html_entity_decode を使って再変換しようと
考えているのですが、これはセキュリティ上良くないのでしょうか?

以下は入力画面から確認画面で送信ボタンを
押した後に読み込む送信用のPHPファイルです。

環境はPHP 5.2となります。

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
foreach($_POST as $k => $v){
if (get_magic_quotes_gpc()) {
$v = stripslashes($v);
}
$v = htmlspecialchars($v);
$$k = $v;
}
}
else {
exit();
}
// 文字化け対応
mb_language("Japanese");
mb_internal_encoding("UTF-8");
$to = "xx@xx.ne.jp";
$contact = "お名前:$name\nメールアドレス:$from\nタイトル:$title\n内容:$naiyou\n";
$contact = html_entity_decode($contact);
if (mb_send_mail($to,$title,$contact,"From:$from")) {
echo "メールを送信しました";
}
else {
echo "メール送信失敗です";
}
?>

以上
初心者のため質問に不備があるかもしれず
申し訳ありませんが、宜しくお願いします。

投稿日時 - 2010-02-05 01:01:01

QNo.5650212

困ってます

質問者が選んだベストアンサー

> 単にデータをそのままメール送信する場合は必要ないとの理解で
> 良ろしいでしょうか?

そゆことです。

htmlspecialchars は 雑に言ってしまえば フォームに入力された文字などに、
HTMLタグに使用されている特殊文字(「<」とか「>」とか)が入っていた場合、
タグとして誤認識させないために入れておくものです。

試しに、以下のスクリプトで htmlspecialchars がある場合と、ない場合で
挙動を 比べてみてください。
htmlspecialchars の意味が分かると思います。

<?php

$str = "'><script>alert('hogeeeeee')</script><'";

// ない時
//print "<input type=text name=title value='" . $str . "'>";

// ある時
print "<input type=text name=title value='" . htmlspecialchars($str , ENT_QUOTES) . "'>";

?>

投稿日時 - 2010-02-05 23:41:42

ANo.2

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

度々すみません。

ふと思ったのですが、HTMLメールの場合は、htmlspecialcharsしないとまずいのかもしれません。
これに関しては、俺も よく分かりませんので、ご注意ください。

投稿日時 - 2010-02-05 23:45:33

お礼

bm_hiro様
ご回答ありがとうございます。
また、サンプルまで表記していただきありがとうございました。
htmlspecialcharsの使いどころについて少し理解できました。

HTMLメールの場合は確かにそうですね。
念頭にありませんでしたが、調べてみます。
ありがとうございました。

投稿日時 - 2010-02-06 01:54:41

ANo.1

んーとですね、大雑把に言ってしまうと、
POSTされてきたものを、いきなりhtmlspecialcharsしてやる必要はないんです。

ブラウザに表示する時にhtmlspecialcharsしてやればいいんです。

↓みたいな感じに。
print "<input type=text name=title value='" . htmlspecialchars($_POST[title]) . "'>";

内部で扱っているだけの部分までhtmlspecialcharsしてしまうから、
メール送信の時に 再度 逆変換かけないといけないという状況に。。

投稿日時 - 2010-02-05 13:28:35

補足

bm_hiro様
ご回答ありがとうございます。

html_entity_decodeの一行以外は
ほぼサンプル本の記事そのままだったのですが、
必要なかったんですね。

ということは、送信前の確認画面などで入力されたデータを
ブラウザ上に表示する場合にはエスケープが必要で、
単にデータをそのままメール送信する場合は必要ないとの理解で
良ろしいでしょうか?

投稿日時 - 2010-02-05 18:40:31

あなたにオススメの質問