OW Debug - Notice
Message: Trying to access array offset on value of type null
File: /home/romarekl/public_html/sosyallift.com/ow_plugins/forum/controllers/topic.php
Line: 136
Form alanlarında spam içeren konuları önleme [ÇÖZÜLDÜ] Forum | Sosy...
Loading...
 
tr
Bilişim ve Teknoloji
Bilişim ve Teknoloji Ocak 21 '18

Spam içermeyen erişilebilir formlar

Son zamanlarda spam botların web sitelerinde form göndermesini önleme konusunda çok tartışma oldu . Birçoğu web sayfasının kullanılabilirliğini ve erişilebilirliğini etkileyen birçok çözüm sunulmuştur. CAPTCHA , kullanıcının ve erişilebilirliğin doğrudan etkilendiği klasik bir durum.

Geçen yıl boyunca, web formlarında spam göndermeyi engellemek için aşağıdaki temel teknikleri derledim. Bunlardan sadece birkaçını uyguladım ve günlüğe kaydetme yoluyla, formların kullanılabilirliği veya erişilebilirliği üzerinde hiçbir etkiye sahip değilken spam bot gönderimlerinin yaklaşık% 99'unu etkili bir şekilde azalttığını keşfettim. Bu teknikler neredeyse tümü sunucu tarafında PHP kullanılarak gerçekleştirilir ve ilgili PHP kodu aşağıda gösterilmiştir, ancak testler neredeyse tüm sunucu tarafında betik dili ile kolayca uygulanabilir.

Sorumluluk Reddi 1:

Bu spam önleme teknikleri, spam göndericilerin formları özel olarak hedefleyebilecekleri kurumsal düzeyde uygulama için uygun olmayabilir. Spam göndericilerinin spesifik spam önleme mekanizmalarınızı denemek ve atlamak için daha az vakit harcadıkları genel iletişim, yorum veya kayıt formları için tasarlanmıştır.

Sorumluluk Reddi 2:

Bu teknikler botları ve otomatik spam gönderme programlarını öncelikli olarak durdurur. Ayrıca belirli içeriği filtreleyebilirler. Bununla birlikte, muhtemelen gerçek bir adamın web sitenize spam gönderilmesini engellemeyeceklerdir.

Teknikler şunlardır:

  • Gönderilen form öğelerindeki spam benzeri içeriği tespit etme
  • Gizli bir form öğesinde içeriği bulma
  • Gönderilen form değerlerini doğrulama
  • Aynı içeriği birden çok form öğesinde arayın
  • Formun belirli bir zaman aralığında gönderildiğinden veya aynı kullanıcı tarafından gönderildiğinden emin olmak için dinamik içerik oluşturun
  • Çok aşamalı bir form veya form doğrulama sayfası oluşturun
  • Formun sunucunuzdan gönderildiğinden emin olun

Gönderilen form öğelerindeki spam benzeri içeriği tespit etme

Bu teknik muhtemelen en güçlü spam önleme tekniğidir. Çoğu spam botu, trafiği artırmak ya da arama motoru sıralamasını artırmak için URL'lerin web sitelerinin URL'sine gönderildiğinde ya da formunuzu size ya da başkalarına spam mesaj göndermek için kaçırmaya çalışıyorlar. Sık kullanılan spam içeriğini veya e-posta üstbilgisi enjeksiyonlarını tespit etmek, neredeyse tüm spam botların ölü olarak durdurulmasını sağlar.

Aşağıdaki PHP kodu, form işleme sayfanıza (formun gönderildiği yer) yerleştirildiğinde, en yaygın başlık enjeksiyonlarına ve posta işlemcinizi kandırarak başka kimlik belgeleri gönderene kadar tüm form öğelerini arayacaktır. Kör karbon kopyalarını başkalarına gör. Ayrıca "[url" dizesini içeren herhangi bir içeriği algılar; bu, bağlantıları belirtmek için çoğu forum yazılım tarafından kullanılır. Herhangi biri bulunursa, $ spam değişkenini true olarak ayarlar.

if (preg_match( "/bcc:|cc:|multipart|\[url|Content-Type:/i", implode($_POST))) { $spam=true; }

NOT: Internet Explorer 6, önceden biçimlendirilmiş metnin düzgün taşmasına izin vermeyecek bir hataya sahiptir. Bu tarayıcıyı kullanmaya devam ediyorsanız, PHP kod satırlarını bu sayfadan düzgün şekilde yeniden akıtmanız gerekecektir.

Ayrıca, form öğeleri içinde bağlantıları ve URL'leri algılayabilirsiniz. Aşağıdaki, "<a" veya "http:" öğesinin 3'ten fazla örneği formun herhangi bir yerinde görünüyorsa $ spam değişkenini ayarlar.

if (preg_match_all("/<a|http:/i", implode($_POST), $out) > 3) { $spam=true; }

Bu, öncelikli olarak bağlantı gönderme veya posta komut dosyanızın ele geçirilmesine odaklandığı için çoğu spambotu yener. Bunun ötesinde, bazı çok basit kelime filtreleme, genellikle yoluna giren spam'ı yakalayabilir.

$spamwords = "/(list|of|naughty|spam|words|here)/i"; if (preg_match($spamwords, implode($_POST))) { $spam=true; }

Ayrıca, dış spam algılama servislerini güncel spam içeriği kalıplarıyla kullanabilirsiniz. Benim en sevdiğim Akismet . Akismet, blog yorumlarında spam filtrelemek için sıklıkla kullanılır (son 9 ayda bu bloga yaklaşık 14.000 spam yorum yapmıştır!), Ancak hemen hemen her web formu için başarılı bir şekilde kullanılabilir.

Gizli bir form öğesinde içeriği bulma

Çoğu spam bot, formunuzu bulur, form öğelerinin adlarını belirler ve formun gönderildiği URL'yi bulur. Yazılım daha sonra, bu form öğelerini değiştirilmiş, spam uygulanmış değerlerle form gönderme URL'sine geri gönderir. Tipik olarak, bot, gönderilmesinde başarılı olmasını en iyi şekilde sağlamak için her form öğesini bir miktar değerlendirecektir. Böylece, formunuza standart bir metin girdi elemanı eklerseniz, ancak kullanıcı bu alana herhangi bir şey giremeyecek şekilde görsel olarak gizlerseniz, spambot'un bu form öğesi için hala bazı değerler yayınlayacağı muhtemeldir. Form öğesinin bir değerle gönderildiğini tespit ederseniz, o zaman neredeyse kesinlikle bir spambot olur.

Örneğin, form öğeniz şu şekilde eklenebilir:

<span style="display:none;visibility:hidden;">

<label for="email"> Spam göndericilerini tespit etmek için kullanılır. Bu metin kutusuna bir şey girerseniz, mesajınız gönderilmez. </label>

<input type="text" name="email" size="1" value="" />

</span>

CSS'nin, metin girdisini ve etiketini görünüşünden gizlemek için kullanıldığına dikkat edin. Bu kod, bu içeriği modern ekran okuyucularından da gizleyecektir. Bununla birlikte, CSS devre dışı bırakıldıysa, girdi hala görüntülenir. Bu nedenle, kullanıcıyı metin kutusuna girmemesi konusunda bilgilendiren açıklayıcı bir etiket sağlanmıştır. Ayrıca, girdiyi güzel, sulu, cezbedici bir "e-posta" adı verdim - spambotları bir değer girmesi neredeyse kesin.

Form öğesinin boş olup olmadığını basitçe tespit edersiniz. Değilse, ya bir spambot ya da CSS'nin devre dışı bırakılmış ve etiket talimatlarını takip etmeyen bir kullanıcı .

if(!empty($_POST['email'])) $spam=true;

Bu taktik, burada listelenenlerin hepsi gibi, kullanıcı bir şekilde spam algılama bayrağı tetiklemesi durumunda yararlı ve bilgilendirici bir hata mesajı sunmalıdır.

Gönderilen form değerlerini doğrulama

Bu belki de söz etmeden geçer, ancak bazı form öğelerinin gerekli olmasını istiyorsanız, bilgilerin bu form alanlarına girilip girilmediğini algılamak için bir sunucu tarafı komut dosyası kullandığınızdan emin olun. Form bilgilerine gereksinim duyarsanız (geçerli bir e-posta adresi gerektirmesi gibi) belirli bir formatta doğrulayın. Birçok bot, yalnızca tanınmayan alanlar için boş bilgi gönderecek veya belirli form alanları için rasgele bilgi gönderecektir. Standart form doğrulama mekanizmaları birçok spambotu durdurabilir.

// Mesaj boşsa, bir hata gönder

if(empty($_POST['message']))

$error=true; // E-posta düzgün biçimde biçimlendirilmemişse, hata mesajını göster

if(!eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $_POST['email'])))

{

echo "Please enter a valid email address.";

}

Aynı içeriği birden çok form öğesinde arayın

Bazı spambotlar, aynı metni tüm tanınmayan form alanlarına göndereceklerdir. Asla aynı bilgiyi içermemesi gereken iki form alanınız varsa, değerlerinin gerçekten aynı olup olmadığını tespit edebilirsiniz ve öyle ise bir hata işaretleyebilirsiniz. Forum kayıt formunda, ilk ve soyadların bot kayıtlarında yaklaşık% 80 oranında kesintiye uğrarsa, yalnızca bir hata attığını tespit ettik . Bu mükemmel bir teknik değil ve analiz ettiğiniz alanların her zaman benzersiz olmasını sağlamalısınız (sanırım hala bir kişinin soyadı ve soyadı olması ihtimali var, ha?).

if($_POST['firstname'] == $_POST['lastname']) $spam=true;

Formun belirli bir zaman aralığında gönderildiğinden veya aynı kullanıcı tarafından gönderildiğinden emin olmak için dinamik içerik oluşturun

Benzersiz form öğeleri oluşturarak veya oturum değişkenleri oluşturarak, form sayfanızı ziyaret eden kişinin form göndereniyle aynı olduğundan emin olabilirsiniz. Örneğin, bir forma erişildiğinde, şu an gizli bir form öğesine yazmak için sunucu komut dosyası kullanabilirsin. Form gönderildiğinde, gizli form değerini geçerli saatle karşılaştırabilir ve bir saatten daha uzun süre geçmediğinden emin olabilirsiniz. Zaman form değeri için doğru değeri üreten bir spambot olasılığı çok düşüktür. Tarayıcı çerezlerini ayarlayabilir veya form oturum sayfası ile gönderme sayfası arasında bir kullanıcı oturumunun kurulduğundan ve sürdürüldüğünden emin olmak için diğer istemci oturum sistemi kullanabilirsiniz.

Aşağıdakiler, UNIX saat biçimindeki geçerli saati gizli bir form girişine yazacaktır.

<input type="text" name="formtime" value="<?php echo time(); ?>" />

Form gönderildiğinde, geçerli saat ile form içinde depolanan değer arasındaki farkı ölçebilirsiniz. Zaman farkı belirtilen bir değerden fazla ise, spam olarak işaretleyebilirsiniz. Bu örnekte, formun görüntülendiği andan gönderilme saati arasında bir saatten (3600 saniye) fazla süre geçtiyse, spam değişkeni ayarlanır. Bu kod, form saati değeri bir URL veya bir e-posta adresi gibi başka bir değere değiştirilirse iletiyi spam olarak işaretleyecektir.

if($_POST['formtime'] < time()-3600) { $spam=true; }

Çok aşamalı bir form veya form doğrulama sayfası oluşturun

Çok aşamalı bir form işlemi oluşturarak çoğu spambot, son form verilerini işleyen gerçek komut dosyasını bulamaz. Bu, kullanıcının formunu gönderdikten sonra doğrulamasını sağlamak ve ardından işleme için form öğelerini göndermek için ikinci bir düğme seçmek kadar kolay olabilir. Orijinal form ve doğrulama sayfası aynı URL'de işlenirse, bu daha da kusursuz yapılabilir. Form öğesi verileri son doğrulama adımından önce sunucu tarafında depolandıysa (spambot tarafından gönderilebilecek gizli form öğelerinden ziyade) otomatik bir sistemin formu göndermesi çok zor olur.

if($formsubmitted == true)

{ // form öğelerini bir araya getirin ve doğrulama sayfasını görüntüleyin.

// Kullanıcı form bilgilerini doğrularsa, veritabanı verilerini işleyin.

}

else {

// display the empty form

}

Formun sunucunuzdan gönderildiğinden emin olun

Çoğu spambot, form bilgisine uzaktaki bir bilgisayardan gönderildiğinden form bilgisinin kendi web sitenizden gönderilip gönderilmediğini saptayarak birçok spambotun formunu işleme komut dosyanıza göndermesini durdurabilirsiniz. Çoğu komut dosyası programı, sayfa yönlendirenini veya geçerli sayfaya ulaşmak için kullanılan sayfayı kontrol edebilir. Spam botların, yönlendirme bilgilerini, web sunucunuzdan geliyormuş gibi görünmesi için döşemek oldukça kolaydır. Ayrıca, bazı tarayıcılar ve güvenlik duvarları yönlendiren üstbilgisini hiç göndermez.

Aşağıdaki kod, sayfa yönlendireninin (yanlışlıkla HTTP spesifikasyonunda ve PHP'de 'referer' yazıldığını) ve varsa, yönlendiren sayfanın form işleme komut dosyasıyla aynı web sitesinde olduğunu doğrulamak için kontrol edecektir. Yönlendiren bilgi göndermeyen tarayıcılar veya spambotlar için, mesaj hiçbir zaman spam olarak işaretlenmez.

if((isset($_SERVER['HTTP_REFERER']) && stristr($_SERVER['HTTP_REFERER'],$_SERVER['HTTP_HOST'])))

{ $spam=true; }

Sonuç

Web formlarına spam gönderilerini önlemek zor bir iştir. Bununla birlikte, Mümkün olduğunda CAPTCHA veya başka testler yoluyla spam önleme yükünü son kullanıcıya yerleştirmemeliyiz. Herhangi bir zamanda insan olarak bir insan olduklarını elle ispatlamak kullanıcının sorumluluğu haline geldiğinde, erişilebilirlik azaltılacaktır. Bu teknikler, son kullanıcıya herhangi bir yük bindirmeden spambotları en çok filtrelemek için çeşitli yöntemler sunar.

Eminim bunların hepsi mümkün değildir ve yukarıdaki tekniklerimde kusurlar olması muhtemeldir. Yorumlarınız veya daha iyi teknikleriniz varsa, lütfen bunları aşağıda yayınlayın.

Düzenlendi... Bilişim ve Teknoloji (Ocak 21 '18)