"Gönder" ne zaman bir form web sitesi bağlantıları ve e-posta adreslerini önleme

8 Cevap php

Dostlarım,

Ben bir e-posta olarak form verileri gönderen bir html formu var. Ne yazık ki spam botlara karşı içinde formu doldurarak formun mesaj bölümüne web sitesi bağlantıları ve e-posta adresleri göndermek olmuştur.

Bir e-posta adresi olarak gönderilmeden önce "Gönder" butonuna basıldığında ben web sitesi bağlantıları ve e-posta adreslerini silebilirsiniz bir yolu var mı? Ben aslında bir e-posta mesajı olarak form verileri gönderme yapmak için PHP kullanabilirsiniz.

Teşekkür ve saygılarımla,

Tony

8 Cevap

Bir hidden form via css (display: none) sahip denedi ama HTML düzenli bir form gibi, ve e-posta ya da ortak bir şey aramak ve bu form veri varsa, o zaman bir bot olmalı.

Nasıl boş bir dize bir web bağlantısını veya e-posta adresiyle eşleşen bir şey değiştirmek için normal ifadeler kullanma hakkında.

Bu web üzerinde düzenli ifade örnek tonlarını bulabilirsiniz, sadece google

Bunu Javascript ile yapabilirsiniz. Sorun Javascript ki bu söz konusu olduğunda bu yüzden Spambots kooperatif olacak oran hayal edebiliyorum gerçekleşmesi için etkin olması gerekiyor.

Eğer sunucu üzerinde filtrelemek zorunda gidiyoruz. Şahsen ben sadece doğrudan bağlantıları veya e-posta adreslerini içeren herhangi bir mesaj reddederdi. Kullanıcıya bir hata geri tükürmek ama bile tasarruf yok.

PHP spam tespiti üzerine bazı ipuçları okumak Spam-free accessible forms. For

Ayrıca CAPTCHA kullanımını dikkate almak isteyebilirsiniz.

Sen $ _POST dizi (Eğer e-posta veya bağlantıları var istemiyorsanız en azından olanlar) her alanda üzerinde yineleme ve regexes bir çift karşı kontrol etmesi gerekir.

CAPTCHA kullanmak için öneri de iyi biridir.

Her neyse, burada denetleme berbat bir uygulaması var:

class ValidationHelper
{
	// regex taken from http://code.google.com/p/prado3/source/browse/branches/3.2/framework/Web/UI/WebControls/TEmailAddressValidator.php?spec=svn2583&r=2583
	const EMAIL_REGEX = "#\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*#";

	// hacked up regex that I just cooked up - could be hugely improved i'm sure.
	const LINK_REGEX = "#(h\s*t\s*t\s*p\s*s?|f\s*t\s*p)\s*:\s*/\s*/#";

	public static function containsEmail($value)
	{
		if (preg_match(self::EMAIL_REGEX, $value))
			return true;

		return false;
	}

	public static function containsLink($value)
	{
		if (preg_match(self::LINK_REGEX, $value))
			return true;

		return false;
	}
}

$errors = array();
foreach ($_POST as $key=>$value) {
	// presumably you want at least one email field, yeah?
	if ($key != 'email') {
		// perhaps you should be running strip_tags over everything if you don't want html and such...
		// see http://php.net/strip_tags for more info. without it (or something similar), there's nothing 
		// to stop people from putting <script type="text/javascript" src="http://notyourdomain.com/~1337skriptkiddy/haxxors.js"></script>
		// into your form. even if you might not necessarily ever be displaying this in a scenario
		// where it can cause trouble, it's never a bad idea to stop this stuff *before* it gets into your db
		$_POST[$key] = $value = strip_tags($value);
		if (ValidationHelper::containsEmail($value) || ValidationHelper::containsLink($value))
			$errors[] = 'Please ensure the value you entered for '.$fieldNames[$key].' does not contain any links or email addresses';
	}
}

if (!empty($errors)) {
	// failed - show errors.
}
else {
	// success!
}

Sizin gerçekten spam mücadele etmek istiyorsan, bu adımlar için gidin:

  1. Olmayan insanlar bile formunu teslim etmeyen böylece şeklinde bir CAPTCHA koydu. Bir çok popüler CAPTCHA uygulamasıdır reCAPTCHA.

  2. Birisi elle URL'leri koyar bile, bir strip_tags alanları silinecektir böylece.

  3. E-posta adresleri için normal ifade denetimi yapmak ve de bunları kaldırmak. Çoğu e-posta biçimleri bulacaktır web iyi bir regex ifadesini almak.

Umarım bu yardımcı olur. Şerefe!

Muhtemelen, HTML her türlü, sadece düz metin kabul etmek istemiyor musun? Bu durumda strip_tags senin arkadaşın. strip_tags da kabul edilebilir bazı etiketleri belirlemenizi sağlar.

Ben de yürekten bir header-injection defence script içeren öneririz.

Dostlarım,

"Mailto:" Ben kesinlikle etiketleri kaldırır ama kaldırmaz sayisinda strip_tags kullanarak çalıştı ne de "http://" metin, böylece bağlantıları hala bağlantıları vardır.

Bir dize tarama ve sadece yerine kolay bir PHP komut veya rutin var mı "mailto:" dizesi bu bölümlerde zararsız bir boş dize "" ve / veya "http://"?

Çok Googling ama buldum şeylerin çoğunu vb beyaz boşluk kırparak üzereydi çalıştı

Bunun için üzgünüm, ben PHP biraz yeniyim.

Teşekkürler ve Saygılar,

Tony

Bu çok basit, ama eminim üzerine inşa edilebilir ...

Üç harfli gösterilen hayvanın adını ... ya da benzer bir şey girmek için onları soran sonra, bir kedi veya köpek bir resim eklemeyi deneyin. Bir doğrulama denetimi yapmak, sonra ... oradan ucuz ve kolay Captcha gidin. Bu şekilde sadece insan giriş dışarı gidiyor ...