ugrás a tartalomhoz

Form ellenőrzés: mennyire biztonságos?

Anonymous · 2006. Jún. 15. (Cs), 11.32
Sziasztok!

Elkezdtem megírni egy függvényt, ami a form-mal elküldött adatokat ellenőrzi. Még csak az elején vagyok, azonban rögtön kérdeznék, mert nem akarok tévútra menni. Szóval, csak annyi lenne, hogy az alábbi kódrészlet biztonságos vagy sem azért, mert globalis-sá teszek változókat.

<?php
function regdata_check($_POST) {

	$hossz = strlen($_POST[username]);
		global $error, $alt_error, $user_error;
		$alt_error = "Kitöltendő adat.";
	if($_POST[username] == '' || strlen($_POST[username]) < 4) {
		$user_error = "Túl rövid nevet választottál.";
		$error = 1;
	}
}
 
1

És ha nincs hiba?

janoszen · 2006. Jún. 15. (Cs), 14.13
Üdv!

Nem értem, hogy ennek mi a lényege. Egyébként meg az $error-nak nincs default értéke. Egyáltalán, mi értelme van a függvénynek, ha nagyrészt úgyis csak globális változókkal operálsz?

Egyébként ez meg: regdata_check($_POST) mit akar tenni?

Sztem sürgősen tedd rendbe a függvényekről alkotott fogalmaidat.

:)
2

Túlbonyolítottad.

Anonymous · 2006. Jún. 15. (Cs), 14.16
Túlbonyolítottad.

Miért használsz globális változókat hibaellenőrzésre? A megoldásoddal ráadásul egyszerre csak egy hibát tudsz tárolni, és nem biztos, hogy a hibásan kitöltött formnál jó lépésenként reklamálni.

Javaslom, hogy a regdata_check függvényen belül hozz létre egy tömböt, és ha valami problémát találsz a form adatoknál, egyszerűen csak ebbe a tömbbe gyűjtsd a hibaüzeneteket és az ezekkel kapcsolatos adatokat (pl. melyik form elemnél volt gond), aztán az így összeállított tömbbel térhet vissza a függvény.

Ha a visszatérő tömb üres, tudod, hogy nem találtál hibát az ellenőrző kóddal. Ha nem üres, akkor könnyen ki tudod listázni az összes megtalált hibát.
4

Gondoltam, hogy ez igy nem teljesen tiszta

Anonymous · 2006. Jún. 15. (Cs), 14.35
Éreztem a dolgot. Abszolút kezdő vagyok, épp ezért szívesen veszek minden segítséget.
Amúgy, még ha hülyeséget is írtam, az első függvény működik... :) De nemcsak az a lényeg, hogy működjön, hanem szeretném úgy megtanulni a dolgokat, ahogy az helyes!

Az ellenörző függvény valahogy így néz ki most (szintén működik):

function regdata_check() {

	global $error, $alt_error, $user_error;

	if(strlen($_POST[username]) == 0) {
		$user_error = "Kitöltendő adat.";	
		$error = 1;
	}
	if (strlen($_POST[username]) < 4 && strlen($_POST[username]) > 0) {
		$user_error = "Túl rövid nevet választottál.";
		$error = 1;
	}
}
Azt szeretném elérni, hogy egy regisztrációs form-nál kötelezően várt adatokat megvizsgálja ez a függvény.
3

Nem szerencsés a global használata

Török Gábor · 2006. Jún. 15. (Cs), 14.27
A $_POST-ot nem kell átadnod paraméterként, mert szuperglobális változó. Amikor $_POST kulcsaira hivatkozol, használj idézőjelet körülöttük. A $_POST[username] a username konstanst keresné kulcsként, míg a $_POST['username'] a username nevű kulcshoz tartozó értéket keresi. Globalozás helyett javasolt inkább szerintem visszatérési értékek megadása, a szöveges hibaüzenetet pedig a függvényen kívül megadni.

Vázlatos példa:

<?php
// Ellenőrízi a nevet, akár bonyolultabb feltételek is
function isValidName() {
  if(isset($_POST['username']) &&  strlen($_POST['username']) < 4) {
    return FALSE;
  }
  return TRUE;
}

// Folyó kódlogika
if (!isValidName()) {
  $alt_error = "Kitöltendő adat.";
  $user_error = "Túl rövid nevet választottál.";
  myErrorHandler($user_error, $alt_error); // Csinálsz valami hibakezelést
}
U.i.: a feltételed logikája nem volt teljesen korrekt, te akkor jeleztél hibát, ha a felhasználónév üres vagy négy karakternél kevesebb, de ez utóbbi magában foglalja az előbbit.
5

Köszönöm

Anonymous · 2006. Jún. 15. (Cs), 14.38
Köszi szépen a választ.
Ez már kicsit szimpatikusabb, mint az én megoldásom.
Dolgozom rajta! :)
9

a feltétel nem az igazi

Anonymous · 2006. Jún. 15. (Cs), 20.46
ha a felhasználónév üres vagy négy karakternél kevesebb, de ez utóbbi magában foglalja az előbbit.


a Te függvényeddel, ha nincs $_POST['username'], akkor az isset(...) nem teljesül, így nem ad vissza hamisat:

<?php
unset($_POST['username']); // $_POST['username'] törlése
if (!isValidName()) {
  // ...
}
else {
  // erre az ágra fogunk futni...
}
?>
szerintem inkább ez legyen a függvényben:

<?php
function isValidName() {
  if(!isset($_POST['username']) ||  strlen($_POST['username']) < 4) {
    return false;
  }
  return true;
}
?>
gex
10

OR kapcsolat kell

Török Gábor · 2006. Jún. 15. (Cs), 21.11
Teljesen igazad van, valóban OR kapcsolat kell, pontatlan kódot írtam.
6

Egyetlen hibaellenörző függvény

Anonymous · 2006. Jún. 15. (Cs), 14.57
Igazából ott akadtam el a dologgal, hogy azt szeretném elérni, hogy egyetlen egy függvény végigellenőrizzen minden, a felhasználó által küldött adatot.

Tehát van pl. egy regisztrációs form, ahol bekérek mondjuk 4 adatot:
  • felhasználónév
  • jelszó
  • név
  • e-mail


Amikor ezek beérkeznek a felhasználótól, akkor ráengedném a függvényt, ami megvizsgálja őket szépen sorban. Igaz itt akad el a gondolatmenetem egy csöppet, hiszen mondjuk a felhasználónévnél szeretném megnézetni azt, hogy:
  • nem üres a mező?
  • hosszabb, mint pl 4 karakter?
  • létezik-e már ilyen az adatbázisban vagy sem?

Míg mondjuk az e-mail címnél csak azt nézném meg, hogy megfelelő a megadott cím formátuma.

Minden vizsgálandó változóra kéne írnom egy ilyen függvényt? Vagy pedig meg lehet ezt oldani sokkal egyszerűbben is?
8

Kiegészítés

Anonymous · 2006. Jún. 15. (Cs), 15.06
Ahogy már írták előbb, nem kell megnézni hogy üres-e és hogy hosszab-e mint 4 karakter. Elég ha csak azt nézed meg, hogy hosszab-e mint 4 karakter.

Valamint azt is érdemes megnézni hogy az adott e-mail címmel regisztáltak-e már.
11

meg lehet egyszerubben

Anonymous · 2006. Jún. 16. (P), 09.18
Amig kezdo vagy erdemes ezeket magadnak is kidolgoznod, hogy tanulj belole, de ezt mar masok 1000x megcsinaltak pl: formsgeneration
7

ez is egy jó megoldás

breakline · 2006. Jún. 15. (Cs), 14.58
Szia

A legjobb, ha sok adatot ellenőrzöl, h írsz rá egy burkolóosztályt,ami egyrészt ugye könnyen bővíthető, másrészt úgyis mindig szükséged lesz hasonlóra. Én valami hasonlót használok, a php 5-ben sokkal szebbre is meg lehetne írni (kivételek, konstruktor), de hát általában én csak php4.x-el találkozom.

<?php
class form_check 
 {
 var $form_value; //A változó tartalma
 var $error_numbers; //Hibák száma

 function construct ($form_value) //Konstruktor
  {
   $this->form_value=$form_value; 
   $this->error_numbers=0;
  }

 function empty_check ()  //Üres mező ellenőrzésére
  {
   if (empty($this->form_value)) 
    {
     return false;
     $this->error_numbers++;
    }
  return true;
  }

function lenght_check ($min,$max) //Hossz ellenőrző
function numeric_check() //H az érték numerikus adat-e
function value_check ($min,$max) // Szám h a két érték között van-e
function in_array_check ($array) //Hogy az érték bent van-e egy tömbben
function in_db_check ($sql) //Adatbázis ellenőrzéshez 
//További függvények, pl. külön e-mail ellenörző, stb..

}

//A használat
$hibak=array();

$check= new form_check;
$check->construct($_POST['mezo']);
if (!$check->empty_check) {$hibak[]="A mező nem lehet üres";}
if (!$check->lenght_check(2,6)) {$hibak[]="A mező értéke 2 és 6 közé eshet";}

//Többi függvény ami kell
if ($check->error_numbers>0) 
 {
 //Ekkor nem csinálnuk semmit,hanem kiírjuk a hibákat
}
else 
{
 //Ekkor minden ok volt.
}
?>
Persze ez kicsit le lett egyszerüsítve, lehetne belső hibakezelés is, meg hasonlók, de egyébként egy hasonló "osztály" jelentősen meggyorsítja a munkát, mondjuk nem 1 inputnál, hanem 20-nál:)
12

Függvény probléma

Anonymous · 2006. Jún. 16. (P), 15.03
Neki alltam a kódod alapjan dolgozni, azonban elakadtam megint.

function empty_check ()  //Üres mező ellenőrzésére
  {
   if (empty($this->form_value)) 
    {
     return false;
     $this->error_numbers++;
    }
  return true;
  }
Hiába küldöm el üresen a formot, az error_numbers változó értéke nulla marad. Mi lehet a hiba?
13

próbáld meg ezt

breakline · 2006. Jún. 16. (P), 21.59
Szia


Szerintem nézz körül, biztos jól hívtad-e meg az osztályt (nem maradt ki a konstruktro, ami sajnos csak php5-től lehet automatikus), v. valamit nem írtál-e el. Megnézheted, h a fv eljut-e egyáltalán ebbe az ágba. Ha nem, akkor máshol van a hiba:

<?php
function empty_check ()  //Üres mező ellenőrzésére
  {
   if (empty($this->form_value)) 
    {
     echo "Üres mező";
     return false;
     $this->error_numbers++;
    }
  return true;
  }
?>
üdv
BL
14

Így tökéletes

Anonymous · 2006. Jún. 16. (P), 22.32

<?php
function empty_check ()  //Üres mező ellenőrzésére
  {
   if (empty($this->form_value)) 
    {
       $this->error_numbers++;
    }
  return true;
  }
?>
15

Jaj bocs

breakline · 2006. Jún. 16. (P), 22.48
bocs, ezt elrontottam, ott akkor cseréld fel a sorokat:

ez nem lesz jó:

return false;
$this->error_numbers++;

ilyenkor ugyanis a fv. már "visszatért" false-al, tehát ami utána van, végre sem hajtódik.
ÍGy működni fog, csak én sem figyeltem:)

$this->error_numbers++;
return false;


üdv
BL