ugrás a tartalomhoz

Szerver-oldali Form validálás

Creative · 2010. Ápr. 8. (Cs), 13.54
Üdv

Eme cikk a formos kérdésem folytatása. A kliens-oldali ellenőrzés rendben, ám adódott gond frissítés után a szerver-oldalon is. Sajnos.... a lényeg, elején deklarálok egy változót, ami itt még üres, de hiba esetén ehhez adódik a 3 hiba egyike. A gondom kétoldali.

Első gondom : Ellenőrzéskor, nem tudom úgy elelnőrízni, hogy létezik-e a változó (tehát adódott-e hozzá a 3-ból már vmelyik), mivel alapból létrehoztam egy üres értékkel. Így akárhogy ellenőrzöm, mégha helyes is, hibás értékkel tér vissza.
Itt van hozzá az érintett kódrészlet, összevágva:
  1. if(isset($_POST['Submit'])) {  
  2.   $hiba = '';    
  3.   $nev     = ($_POST['name']);    
  4.   $mail    = ($_POST['email']);  
  5.   $comment = ($_POST['comment']);  
  6.   
  7. function checkName($nev) {    
  8.     if(strlen($nev) < 3) {   // elég hosszú a név mező értéke?  
  9.         return false;     
  10.     }  
  11.     else { return true; }  
  12.     if(strlen($nev) > 20) {  // nem túl hosszú a név mező értéke?  
  13.         return false;     
  14.     }  
  15.     else { return true; }    
  16. }  
  17. function checkMail($mail) {   
  18.   if($mail == (eregi("^[_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,6}$"$mail))) {  
  19. // az e-mail mező értéke szabványos?  
  20.     return false;    
  21.   }  
  22.     else { return true;}   
  23. }  
  24. function checkComment($comment) {    
  25.     if(strlen($comment) < 6) {   // elég hosszú az üzenet?  
  26.         return false;     
  27.     }  
  28.     else { return true; }     
  29.     if(strlen($comment) > 280) { // nem túl hosszú az üzenet?  
  30.         return false;     
  31.     }  
  32.     else { return true; }     
  33. }  
  34.   
  35. if(!checkName($_POST['name'])) {  
  36.     $hiba .= '<li>Hiba a névvel!</li>';  
  37. }  
  38. if(!checkMail($_POST['email'])) {  
  39.     $hiba .= '<li>Hiba az e-maillel!</li>';  
  40. }  
  41. if(!checkComment($_POST['comment'])) {  
  42.     $hiba .= '<li>Hiba az üzenettel!</li>';  
  43. }  
  44.   
  45. if(!isset($hiba) || count($hiba) <1) {   // nincs hiba, feldolgozás behívása  
  46.     echo("Gratula ;)");  
  47. }  
  48. else {  // hiba esetén kilistázza a hibákat  
  49.  echo '  
  50.  <div id="thx_frame">  
  51.     <div id="thx_input">  
  52.      <div>  
  53.      <H2>Hiba!</H2>  
  54.      A hozzászólása nem került mentésre !<br />  
  55.      Ennek lehetséges okai:<br /><br /><ul>  
  56.      <color=#a43b35>'.$hiba.'</color>  
  57.      </ul><br />  
  58.      Kérem próbálja újra.<br />  
  59.      </div><br />     
  60.      <div>  
  61.      >> <a href="'.$_SERVER['HTTP_REFERER'].'">Vissza a vendégkönyvhöz</a> <<  
  62.      </div>  
  63.     </div>          
  64.  </div>   
  65.  ';  
  66. }  
  67. }  
Második gondom: Igyekeztem normális e-mail ellenőrzést összehozni, de ahogy olvastam is néhány oldalon, egyetemes elelnőrzőt összehozni szinte lehetetlen. Próbálkoztam wordpress-szerű elelnőrzéssel is, és végülis erre jutottam(lejjebb). A gondom, hogy erre unexpected-et ír egy { -re. Hátha valaki meglátja a hibát benne, amit én nem veszek észre...
  1. function checkMail($mail) {   
  2.  if($mail == (eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$"$mail)) {  
  3.   return false;    
  4.  }  
  5.   else { return true;}   
  6. }  
C.
 
1

probald igy

jepisti · 2010. Ápr. 8. (Cs), 15.27
Szia!

if(!isset($hiba) || count($hiba) <1) {

helyett

if ($hiba===''){
2

Zárójelek

bugadani · 2010. Ápr. 8. (Cs), 15.48
Az e-mail ellenőrzős kódrészlet 2. sorában kimaradt az ifet záró zárójeled. Vagy épp van egy fölösleges, ahogyan tetszik...
  1. function checkMail($mail) {     
  2.     if($mail == eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$"$mail)) {    
  3.         return false;      
  4.     }    
  5.     else { return true;}     
  6. }  
PHP 5.2 vagy afölött viszont ajánlom a filter_var használatát, kicsit kevésbé körülményes elrontani
  1. function checkMail($mail){  
  2.     return (filter_var($mail, FILTER_VALIDATE_EMAIL) !== false);  
  3. }  
3

Remélem nem gond, ha nem

mahoo · 2010. Ápr. 8. (Cs), 16.19
Remélem nem gond, ha nem nyitok új témát, mert a kérdésem ide is beillene. Amit már szerintem nagyon sokszor megvitattak, mégsem vagyok biztos a dolgomban.
Azt szeretném tudni, hogy adatbazásiba mentés előtt elég e ennyit tenni a voltozóval:

function safe($value)
{
$this->db_connect();
$value = trim($value);
if(get_magic_quotes_gpc()) $value = stripslashes($value);
$value = mysql_real_escape_string($value);
return $value;
}

Jelenleg én ezt használom, de megannyi topik szól arról, hogy szükséges a htmlentities, htmlspecialchars is. Illetve arról is hogy nem, mert ezek kimeneti szűrők és tehát használatuk az SQL-injection ellen nem véd (sőt!), ezért kiolvasás után kell hasznalni őket XSS ellen!

Nem véletlenül kérdezem, mert mint mondtam 1000 helyen hol cáfolják, hol erősítik ezt az állítást.

Ha mysql_real_escape_string-et (mres) használok, kell a trim is, egyébként?

Találtam egy osztályt a phpclasses.org-on és ha jól értelmeztem, ott is csak mres van és strip ha szükséges.

Kiváncsi lennék a tapasztalt programozók véleményere (is).
4

^^

Creative · 2010. Ápr. 8. (Cs), 17.43
Hálás köszönetem a gyors váalszért jepisti és bugadani. A feltételnél tényleg megoldódott a gondom. Az e-mail checknél tényleg összefolytak a zárójelek a szemem előtt... Most már mind a szerver-oldalon, mind a kliens-oldalon frankóón működik a rendszer. Sajnos a tárhelyet, amit bérlek, egy régebbi php-motor fut, uh maradok a hajtépős kódnál :)
Mahoo, én bár nem vagyok tapasztalt programozó még, és ezt a biztonságot se igen használom, lévén hogy nem hatalmas adatbázisokkal s portálokkal dolgozom, de azért hozzászólok énis, ha nem gond :) Én ezt utoljára a diplomamunkámban használtam, kicsit más formában. Ott minden változókkal való művelethez odarendeltem az én kis kódom, ami be kell valljam, még a tiedénél is rövidebb volt :)
  1. if(get_magic_quotes_gpc())  
  2.  {$ertek = stripslashes($ertek);}  
  3. if(!is_numeric($ertek) && $ertek!='null')  
  4.  {$ertek = '"' . mysql_real_escape_string($ertek) . '"';}   
Enélkül voltak érdekes bejegyzéseim az adatbázisban... De mint mondtam ,azóta nem használtam még máshol, s nem adódtak gondok. Remélem nem gond, hogy hozzászóltam azért ehhez is :)

C.
5

Nem!! Sőt! Látom, hogy

mahoo · 2010. Ápr. 8. (Cs), 20.01
Nem!! Sőt! Látom, hogy mindketten szinte ua-t használtuk.
Bár részemről a htmlspecial és a htmlentities még mindig kérdéses!

Sok sikert a magunkfajta, még gyakorló php-seknek! :)
6

Nem a méret a lényeg

Poetro · 2010. Ápr. 8. (Cs), 20.26
Amennyiben sikerül találni egy lyukat a rendszeredben azt a rosszindulatú cracker saját céljaira tudja felhasználni, például spam leveleket küld, vagy más illegális tevékenységhez, vírusok terjesztésére, phising oldalakra tudja használni azt a tárhelyet, amiről te azt hiszed jelentéktelen.