Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Jak W Prosty Sposób Zabezpieczyć Się Przed Botami Spamującymi Reje


XaviPrawdziwy

Rekomendowane odpowiedzi

Opublikowano

Cześć.

Jak wiecie, lub też nie, niezabepieczona rejestracja stanowi spory problem.

Nie będę się tutaj rozpisywał o validowaniu wprowadzonych danych - bo to chyba powinna umieć zrobić każda osoba biorącą się za rejestracje.

Generalnie Wam powinna do walidacji wystarczyć instrukcja if, powiedzmy

if(strlen($_POST['name']) < 4 OR strlen($_POST['name']) > 12){
echo 'Podales nick nie mieszczacy sie w dopuszczalnym przedziale znakow!';
exit();
}

Jest to czysto teoretyczny przykład, mało rozbudowany, ale pokazujący mniej więcej o co chodzi.(przydatna strona: php.net)

Ale przechodząc do tematu - rejestracja bez sprawdzenia czy po drugiej stronie siedzi człowiek jest bardzo złą rzeczą ;-)

Dlaczego? Otóż dlatego, że krótki skrypt, mieszczący się w 20linijkach, jest w stanie stworzyć w ciągu dnia, kilkadziesiąt tysięcy kont przez taką rejestrację, no chyba, że Wam serwer padnie po drodze ;-)

Co zrobić? Sprawa jest prosta jak drut.

Rejestrujemy się tutaj:

https://admin.recaptcha.net/accounts/signup/?next=%2Frecaptcha%2Fcreatesite%2F

Następnie w formularzu podajemy adres swojej strony rejestracyjnej(z hamachi będziecie mieli problemy, hehe)

Zahaczamy Enable this key on all domains (global key)

Dostajemy coś w tym stylu:

Public Key:  	XXXvNwwAAAAAALZTElXXXvAMjbTqVuAfoR0M_XXX

Use this in the JavaScript code that is served to your users
Private Key:  XXXNwwAAAAAABXXXHgxlsyqd96ekdWCntee_XXX 

(nie kopiujcie tych kluczy - Wam nie zadziałają, ocenzurowałem je troszkę)

Następnie pobieramy biblioteke stąd:

http://code.google.com/p/recaptcha/downloads/list?q=label:phplib-Latest

(odnośnik ze strony projektu:

http://recaptcha.net/plugins/php/

więc skan chyba zbędny, ale jeżeli trzeba to powiedzcie - wrzucę i skana)

Rozpakowujemy, tworzymy w folderze strony folder libs, wrzucamy tam recaptchalib.php

Następnie, na naszej stronie rejestracyjnej - w formularzu wstawiamy taki kod:

Przepisz kod:<?php require_once('libs/recaptchalib.php');
$publickey = "Nasz publiczny kod uzyskany wcześniej"; // you got this from the signup page
echo recaptcha_get_html($publickey);

(wrzucając oczywiście nasz publiczny klucz, który uzyskaliśmy przy rejestracji)

Co dalej?

Przechodzimy do fragmentu naszej rejestracji odpowiedzialnej za walidację i rejestrację użytkownika(przed zapytaniami mysql_query tworzącymi rekord)

Wklejamy tam:

require_once('libs/recaptchalib.php');
$privatekey = "NASZ PRYWATNY KLUCZ UZYSKANY PRZY REJESTRACJI";
$resp = recaptcha_check_answer ($privatekey,
                               $_SERVER["REMOTE_ADDR"],
                               $_POST["recaptcha_challenge_field"],
                               $_POST["recaptcha_response_field"]);

if (!$resp->is_valid) {
 echo "Niepoprawnie przepisales kod z obrazka!.";

 exit();
}

(oczywiście wrzucając swój klucz PRYWATNY uzyskany przy rejestracji)

Jeżeli niczego nie zepsuliście to wszystko powinno być okej.

Tutaj macie fragment mojej starej rejestracji, tak czy siak powinno działać, aczkolwiek nie jest ona jakoś specjalnie dobrze napisana:

<h1>Rejestracja</h1>
<?php 
if($_POST){
require_once('libs/recaptchalib.php');
function koniec(){
echo '</p>



	<!--/TRESC-->
	</div>
	</div>
	<div id="STOPKA"><!--STOPKA-->© FXMT2<!--/STOPKA--></div>
</div>
</div>
</body>
</html>';
exit;



}
$privatekey = "WKLEJ TUTAJ SWOJ PRYWATNY KLUCZ";
$resp = recaptcha_check_answer ($privatekey,
                               $_SERVER["REMOTE_ADDR"],
                               $_POST["recaptcha_challenge_field"],
                               $_POST["recaptcha_response_field"]);

if (!$resp->is_valid) {
 echo "Niepoprawnie przepisales kod z obrazka!.";
 echo "<a href=register.php>wróć</a>";
 koniec();    
}
if (!$_POST['id'] or !$_POST['pass'] or !$_POST['pass2'] or !$_POST['socialid']){
 echo "Wypelnij wszystkie pola!";
 echo "<a href=register.php>wróć</a>";
 koniec();

}
if (strlen($_POST['id']) < 4 or strlen($_POST['id']) > 12){
 echo "ID nie miesci sie w okreslonym limicie znakow!";
 echo "<a href=register.php>wróć</a>";
 koniec();

}
if (strlen($_POST['pass']) < 4 or strlen($_POST['pass']) > 12){
 echo "Haslo nie miesci sie w okreslonym limicie znakow!";
 echo "<a href=register.php>wróć</a>";
 koniec();

}
if ($_POST['pass'] != $_POST['pass2']){
echo "Podane hasla nie sa identyczne!";
 echo "<a href=register.php>wróć</a>";
 koniec();

}
if (!is_numeric($_POST['socialid'])){
echo "Kod usuniecia postaci musi sie skladac z samych cyfr!";
 echo "<a href=register.php>wróć</a>";
 koniec();


}
if (strlen($_POST['socialid']) != 7){
echo "Kod usuniecia postaci <b>MUSI</b> miec 7 cyfr!";
 echo "<a href=register.php>wróć</a>";
 koniec();

}
$id = mysql_escape_string($_POST['id']);
$pass = mysql_escape_string($_POST['pass']);
$socialid = mysql_escape_string($_POST['socialid']);
$connect = mysql_connect("HOST BAZY DANYCH", "USER BAZY DANYCH", "HASLO DO USERA BAZY DANYCH");
$db = mysql_select_db("account");
$mq = mysql_query("INSERT INTO account SET login = '$id', social_id = '$socialid', password = PASSWORD('$pass'), cash = '999999', silver_expire = '2012-01-01 18:00:00', gold_expire = '2012-01-01 18:00:00', autoloot_expire = '2012-01-01 18:00:00', money_drop_rate_expire = '2012-01-01 18:00:00', safebox_expire = '2012-01-01 18:00:00'");
if ($mq){
echo "Wszystko ok! Zapraszamy do gry";
 echo "<a href=register.php>wróć</a>";
 koniec();


}else{

echo "Ktos juz wybral takie ID!";
   echo "<a href=register.php>wróć</a>";
 koniec();
}







}else{
?>
<p>Uwaga! Prosimy o dokladne wypelnienie wszystkich pol formularza.<br />
<form action="register.php" method="POST">
ID: <input type="text" name="id" /> <font color="green">4-12 znaków</font><br />
Haslo: <input type="password" name="pass" /><font color="green">4-12 znaków</font><br />
Powtorzenie hasla: <input type="password" name="pass2" /><br />
Kod usuniecia postaci: <input type="text" name="socialid" /><font color="green">7 <b>CYFR</b></font><br />
Przepisz kod:<?php require_once('libs/recaptchalib.php');
$publickey = "WKLEJ TUTAJ SWOJ PUBLICZNY KLUCZ"; // you got this from the signup page
echo recaptcha_get_html($publickey);

?> 
<input type="submit" value="Zarejestruj!" />
</form>
    <?php 
    }
    ?>

Pozdr. Xavi, heh.

 

-----------------

Jakby ktoś chciał mogę się podzielić krótkim skryptem odpalanym z linii poleceń, który tworzy automatycznie konta w niezabezpieczonych rejestracjach.

  • 3 tygodnie później...
Opublikowano

Pobierz jakiś szablon z chińskiego serwa i tam będzie plik authcode.php i zrób rejestracje typu stare serwery, bo z tego co wiem re-captcha jest tylko w języku angielskim

 

 

 

a co do zabezpieczeń polecam jeszcze

 

 

Dynamiczne ukrywanie pól formularza

 

Samo blokowanie niepotrzebnych pól formularza w większości przypadku jest zupełnie wystarczające. Czasem jednak formularze są na tyle skomplikowane, że wyświetlanie wszystkich zablokowanych pól znacznie zaciemniłoby i bardzo utrudniło poprawne wypełnienie danych. W takiej sytuacji lepiej wyświetlić określona pola, dopiero gdy będą potrzebne, tzn. gdy użytkownik zaznaczy odpowiednią opcję wyboru:

 

Zaznacz kod

 

<input type="checkbox" name="nazwa" value="wartość" onclick="document.getElementById('identyfikator').style.display = this.checked ? 'block' : 'none'; this.form.elements['nazwa2'].disabled = this.form.elements['nazwa3'].disabled = !this.checked" />

<div id="identyfikator" style="display: none">

<input type="text" name="nazwa2" disabled="disabled" />

<input type="text" name="nazwa3" disabled="disabled" />

</div>

 

Przykład:

Po wybraniu tej opcji, zostaną wyświetlone dodatkowe pola tekstowe

 

Tym sposobem, razem z polami tekstowymi (lub innych typów), możemy ukrywać również dowolne inne treści, jak np. etykiety tekstowe itp.

 

Ukrywanie elementów po wybraniu opcji:

 

Zaznacz kod

 

<input type="checkbox" name="nazwa" value="wartość" onclick="document.getElementById('identyfikator').style.display = this.checked ? 'none' : 'block'; this.form.elements['nazwa2'].disabled = this.form.elements['nazwa3'].disabled = this.checked" />

<div id="identyfikator">

<input type="text" name="nazwa2" />

<input type="text" name="nazwa3" />

</div>

 

 

Użyłem to na triadicy i nie powiem działa tak jak powinno...

Opublikowano

Bot nie odwiedza nawet strony z formularzem - on wysyła już dane jako POST do samego skryptu rejestracyjnego(parametr action), więc takie chowanie pól jest półśrodkiem.

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...