Oprire comentarii spam

Discutii despre script-uri si coduri PHP-MySQL, precum si lucru cu XML in PHP.
Avatar utilizator
steell
Mesaje:190

Oprire comentarii spam

Salut.
Am un script cu ajutorul caruia se posteaza comentarii in pagina. Scriptul salveaza comentariile fiecarei pagini intr-un fisier cu numele paginii respective. Problema este ca cineva tot posteaza mesaje spam cu tot felul de nebunii, in limba engleza ce nu au nicio legatura cu site-ul. Apar zeci de comentarii zilnic de lungimi foarte mari. Am securizat formularul cu javascript, astfel incat sa raspunzi la niste intrebari (in limba romana bineinteles).
Este securizat si cu php astfel incat daca opreste javascript din browser se verifica si cu php intrebarile. Nu inteleg cum reuseste sa posteze mesajele astea.
Am scos scriptul din pagina respectiva si am sters fisierul cu comentarii insa acesta se creaza mereu si culmea in el mesajele sunt structurate exact ca si cand ar fi postate de scriptul meu. Asta se intampla la o singura pagina din tot site-ul, la celelalte care au si ele scriptul de comentarii nu se intampla lucrul asta.
Care ar fi explicatia?

MarPlo Mesaje:4343
Salut
Ca banuiala, bot-ul respectiv acceseaza direct fisierul php care salveaza comentariile, trimitand prin POST datele care trebuie ca si din formular, de exemplu poate face asta prin cURL.
Chiar daca ai sters script-ul din poagina, bot-ul respectiv are memorat structura formularului ce trebuie transmis, si acceseaza direct fisierul php.
Solutia de rezolvare ar fi acestea:
1. Daca script-ul tau nu acceseaza acel fisier php direct prin browser (de exemplu prin Ajax), ci printr-un include() in alt fisier php, poti bloca din ".htaccess" accesul extern la respectivul fisier php, care face salvarea datelor. Astfel, fisierul nu mai poate fii accesat direct din browser sau din exterior, ci doar prin alt fisier php.
Pentru asta, se adauga in directorul cu fisierul php un ".htaccess" cu acest cod:

Cod: Selectaţi tot

# Blocks the external access to file_name.php
<files file_name.php>
 order allow,deny
 deny from all
</files>
2. Ar trebui sa folosesti un sistem de Captcha cu un cod /raspuns care sa se schmbe (aleator) si sa fie salvat si verificat din $_SESSION.
Inainte de a genera pagina html, se defineste in php raspunsul /codul la intrebarea anti-spam, se salveaza in SESSION, apoi, dupa ce se trimite formularul, se verifica daca acea sesiune exista si este la fel cu raspunsul adaugat in formular.
- De exemplu, o functie pentru creare intrebare anti-sppam cu suma a doua numere:

Cod: Selectaţi tot

<?php
if(!isset($_SESSION)) session_start();

// creates a Captcha with the sum of two numbers. Receives the session name
function setCaptcha($ses_name) {
  $nrs = array(mt_rand(1, 50), rand(1, 50));      // array with 2 random numbers, between 1 and 50

  // if session exists, delete it, sets session with the sum of $nrs[0] and $nrs[1]
  if(isset($_SESSION[$ses_name])) { unset($_SESSION[$ses_name]); }
  $_SESSION[$ses_name] = $nrs[0] + $nrs[1];

  return $nrs;        // returns the array with the numbers
}

// sets the captcha answer in $_SESSION['captcha'], and gets the numbers
$nrs = setCaptcha('captcha');

// outputs the anti-spam question
echo 'Cat face: <span style="font-weight:800; color:#0001e8;">'. $nrs[0] .' + '. $nrs[1] .'</span><br/>';

// Just to test /aee the answer
echo $_SESSION['captcha'];