PHP Doğrulama Kodları CAPTCHA

2 Cevap php

Ben bu yüzden birçok kullanıcı giriş yapmış ve bir kez her iki dakikada bazı şeyleri bir oyun sitesi çalıştırmak.

Ben yerlerde bir CAPTCHA sistemi var, ve bazı şeyler için her zaman bir kod isteyecektir, ve diğer şeyler için, bu kez her 10 dakikada soracaktır.

Bazı oyuncuların oto Opera özelliğini göndermek kullanmak vardı, ve benim CAPTCHA sistem onları durdurmak yapar.

Benim soru nasıl ben bir kod için soruyorum kez miktarını en aza indirebilirsiniz, ama yine de bu otomatik teslim kullanarak insanları durdurmak olduğunu?

2 Cevap

If I understand correctly this task doesn't require a captcha. I assume You want to see if the user did click himself, sitting in front of his PC.

new idea

Sizin formda birden fazla görüntü gönderimleri koyun:

<input type="image" name="send1" src="buttons.php?i=1" />
...
<input type="image" name="send8" src="buttons.php?i=8" />

when generating a form get a random number between 1 and 8 and save it in $_SESSION['submitnumber']. create two same size images - one empty filled with Your default background in form, the other looking like a submit button. create buttons.php that will output images with this code:

header("Content-Type: image/jpeg");
flush();
readfile($filename);

$_GET[i]!=$_SESSION['submitnumber'] else teslim görüntüyü dönerseniz ve boş resim döndürür.

Doğru imagesubmit tıklandığında ise formu kabul (tarayıcı kullanıcı düğmeye tıkladığında Hemde send1X gibi coords göndereceğiz)

Bu captcha bir türü bulunuyor, ama insanlar bilmeyecek ;)

old idea

Iki şey gerekir:

1 oldukça benzersiz formlar için belirteçleri oluşturun.

put <input type="hidden" name="timertoken" value="someweirdstring" /> and generate the "someweirdstring" to be a md5 hash of some (username and time)-dependant thing. I can elaborate on this, but this is a basic form token for safety and CSRF attacks blocking. The token is verified after posting.

Örnek:

Bu belirteç mekanizmasının not tipik bir uygulamasıdır, ancak bu yeterli olacaktır.

$token=generatesomerandomtext();
$_SESSION['token']=$token; 

//... somewhere later when outputing forms:    
echo '<input type="hidden" name="token" value="'.$token.'" />';

//and when it comes back:
if($_POST['token']==$_SESSION['token']) {
   //it's ok
   }

and that's all You need. this simple example creates a unique token for every page and puts in forms. It's not time dependant and doesnt use md5, but stores the token in session. To automatically send a form that would be accepted the person has to use the form You generated or copy the token.

The real form token example would be more like this: $token=md5($username.'some secret text'.$date.$timeRoundedTo10Minutes);

//... somewhere later when outputing forms:    
echo '<input type="hidden" name="token" value="'.$token.'" />';

//and when it comes back:
if(
 ($_POST['token']==md5($username.'some secret text'.$date.$timeRoundedTo10Minutes)) ||
 ($_POST['token']==md5($username.'some secret text'.$date.$timeRoundedTo10Minutes-10minutes)) ) {
   //it's ok
   }

Why usernames? Because it removes the possibility to use one user's tokens to hack another user Why secret text (called 'salt')? Because somebody could stick together other user's name with time and do md5, but without guessing the salt he can't. Why the two comparisons? Because if now is 22:44:59 - the token is generated with 22:40 and if user sends it it's 22:45:30 so it gets rounded to 22:50 and it matches the token only if You take it back 10 minutes.

Bu temel bir örnek bu. Referans için bakınız this soru.

Bu düğme tıklandığında nerede ve x ve y koordinatlarını nakleder gibi 2 <input type="image" ... içine Sizin gönderme düğmesi değiştirin. Ben şartnamede bu geldi hiçbir fikrim yok, ama o kullanılabilecek ilk defa! :)

Kullanıcı Sadece bu da oyuncunun oturumunda son x ve y hatırlamak ve karşılaştırabilirsiniz koordinatlar (klasik Submiting onları göndermek olmaz) mevcut olup olmadığını görmek için ve basit hack engellemek zorunda kendini tıklandığında ise şimdi görmek için. Farklı COORDS her zaman göndermek için kesmek çok zordur.

Form belirteçleri tıklama koordinatları simüle edilecek rasgele alanları İle formunun bir kopyasının hazırlanması engellemek için vardır. Belirteç her zaman değişir eğer form alanları geçersiz kılmak zor.

Bu hala userscript işlevselliği ile kırılabilir, ama çok zor bulunuyor. Ve bir saat içinde kimse kez bir captcha ekledi ise sadece bir saat için yardım ve bundan sonra kıracak yazma komut rahatsız (ve biraz çaba ve bilgi gerektiren) olacaktır.

Verilere bağlı olarak size arayan bir kullanıcı olduğunu evidents toplayabilir alırsınız. Arayan bir bot gibi görünüyor eğer, sadece, CAPTCHA isteyin.

Evidents olabilir:

  • kullanıcı aracısı (güvenilir değildir, çünkü Opera can fake bu)
  • teslim aralık tetiklenir (daha doğrusu çağrı, yani her 2 dakikada daha çok vurur bir bot)
  • veri desenleri döndürmek için kontrol izin verirse, çok belirgin olabilir,
  • ...