51

POST 経由で送信されたフォームから値を取得し、メールで送信する単純な PHP メーラー スクリプトがあります。

<?php
$to = "me@example.com";

$name = $_POST['name'];
$message = $_POST['message'];
$email = $_POST['email'];

$body  =  "Person $name submitted a message: $message";
$subject = "A message has been submitted";

$headers = 'From: ' . $email;

mail($to, $subject, $body, $headers);

header("Location: http://example.com/thanks");
?>

入力をサニタイズするにはどうすればよいですか?

4

5 に答える 5

53

post 変数を でサニタイズしますfilter_var()

例はこちら。お気に入り:

echo filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);   
于 2009-06-28T18:40:42.600 に答える
13

ここでは SQL クエリなどを構築していないため、これらの入力に関連する唯一の検証は、$_POST["email"] の電子メール検証と、本当に必要な場合は他のフィールドの英数字フィルターです。メッセージに含めることができる範囲を制限します。

メールアドレスをフィルタリングするには、単純にfilter_varを使用します:

$email = filter_var($email, FILTER_SANITIZE_EMAIL);

Frank Farmer の提案に従って、メールの件名の改行を除外することもできます。

$subject = str_replace(array("\r","\n"),array(" "," "),$subject);
于 2009-06-28T18:42:46.153 に答える
5

他の人が指摘したように、filter_var素晴らしいです。利用できない場合は、ツールチェストに追加してください。

$headers変数は、セキュリティ的に特に悪いです。追加されると、なりすましヘッダーが追加される可能性があります。メール インジェクションと呼ばれるこの投稿では、これについてかなり詳しく説明しています。

filter_var iこれは素晴らしいことですが、何かが電子メール アドレスであり、何か悪いものではないことを保証するもう 1 つの方法は、isMail()関数を使用することです。ここに1つあります:

function isEmail($email) {
    return preg_match('|^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]{2,})+$|i', $email);
};

したがって、これを使用するには、次のようにします。

if (isset($_POST['email']) && isEmail($_POST['email'])) {
    $email = $_POST['email'] ;
} else {
    // you could halt execution here, set $email to a default email address
    // display an error, redirect, or some combination here,
}

手動検証に関しては、 を使用して長さを制限しsubstr()、実行strip_tags()し、そうでなければ入れることができるものを制限します。

于 2009-06-28T19:09:20.330 に答える