Posta önce PHP kullanıcı girişi sanitze nasıl?

5 Cevap php

Ben POST ve bana posta yoluyla gönderilen onları bir formdan değerleri alan basit bir PHP mailler komut dosyası var:

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

Nasıl girdileri olabilir?

5 Cevap

mesajı sterilize

ile

filter_var

Burada örnek:

http://net.tutsplus.com/tutorials/php/sanitize-and-validate-data-with-php-filters/

gibi:

echo filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);

Burada bir SQL sorgusu ya da bir şey bina değil, çünkü ben bu girdilerin için görebilirsiniz sadece ilgili doğrulama ["email"] $ _POST için bir e-posta doğrulama, ve belki gerçekten diğer alanlarda bir alfanümerik filtre istiyorsanız Mesaj içerebilir ne kapsamını sınırlamak için.

E-posta adresini filtrelemek için, sadece kullanım filter_var:

$email = filter_var($email, FILTER_SANITIZE_EMAIL);

Frank Farmer öneri başı olarak, aynı zamanda e-posta konusunun satırsonu filtreleyebilirsiniz:

$subject = str_replace(array("\r","\n"),array(" "," "),$subject);

Diğerleri de belirtildiği gibi, filter_var harika. Mevcut değilse, sizin ToolChest bunu ekleyin.

$headers değişken güvenlik-bilge özellikle kötü. Bu eklenen ve sahte başlıklar eklenecek neden olabilir. Denilen bu mesaja Email Injection oldukça iyi anlatılır.

filter_var i s büyük, ama bu bir şey sağlamak için başka bir yol, bir e-posta adresi ve kötü bir şey olduğunu bir isMail() işlevini kullanmaktır. İşte biri:

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

Yani bu kullanmak için, bunu yapabilirsiniz:

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,
}

Manuel doğrulama, substr() , running strip_tags() kullanarak uzunluğunu sınırlayan ve aksi takdirde içeri konabilir ne sınırlayıcı açısından

Sen postayla iletilir $ başlıklarını, () (sizin durumunuzda $ email) kullanıcılar tarafından sağlanan girdi herhangi satırsonlarını kaldırmak gerekiyor! Bkz Email injection.

PHP konu ve $ $ sanitasyon özen, ancak PHP sürümleri hata vardır (Etkilenen PHP 4 <= 4.4.6 ve PHP 5 <= 5.2.1, bkz MOPB-34-2007) .

Size endişe gereken bir şey, sadece fikirler atma eğer emin değil.

Would it be an issue if the email message contained <script> tags? Maybe <img> or any other tag accessing an external server?

Ben sadece dikkate alıyorsun emin, yine de en posta istemcileri günümüzde bu çalışmasına izin vermez biliyorum ama.

Eğer mesajı fantezi bir şey beklemeyin etiketleri sıyırma dışarı kolay bir yoludur.