PHP form validation koncepcio

Turtam a net-et, es a php manualt, de ami nekem kell az nem igazan talatam meg, pedig valoszinuleg az orrom elott van.

Adoott pl. login form
- js kliensoldali ellenorzes, ha ok akkor tovabb a
- login_ell.php szerveroldali ellenorzes,
- ha minden ok tovabb header("location:kezdolap")
- hiba eseten vissza header("location:form") form-ra, ez esetben hogyan adjam vissza az ediig beirt adatokat?
$_GET eleg tragyan nez ki, foleg megjegyzes tipusu mezonel.
Session valtozo?
$_POST ez tetszene, csak nem jottem ra azt hogyan lehet megvalositani.
Avagy hogyan kell ezt kulturaltan megcsinalni?

Hozzászólások

Én így oldanám meg:

-----login.php
<!--Ide kerül az űrlap illetve a hibaüzenet-->
<html>
<body>
<!-- form method jellemző post-ra állítása, alapesetben ez get.
Ekkor a böngésző post adatként küldi el az űrlap tartalmát, a böngésző fejlécében nem fog megjelenni -->
<form method="post" action="login_ell.php">
<input type="text" name="user" />
<input type="password" name="pass" />
<input type="submit" value="bejelentkezés" />
</form>
</body>
</html>

-----login_ell.php
<?php
/* Ebben a fájlban hiba esetén nem headerrel irányítanám vissza, hanem újra kiiratnám vele a login.php tartalmát.
A $_POST helyett használhatod a $_REQUEST tömböt is, az tartalamzza a $_POST, $_GET, $_COOKIE tömb összes elemét. */

//Ellenőrzés - példa
$felhasznalonev="jozsi";
$jelszo="1982";

$hiba = false;
$hiba_tomb = array();

if(!$hiba && $_REQUEST["user"]!=$felhasznalonev) {
$hiba = true;
$hiba_tomb["user"] = "Helytelen felhasználó";
}
if(!$hiba && $_REQUEST["pass"]!=$jelszo) {
$hiba = true;
$hiba_tomb["pass"] = "Helytelen jelszó";
}

/* A $hiba változó igaz hamis érték, ha true, akkor történt hiba, ha hamis, akkor nem. $hiba_tomb változótömbben bennevannak a hiba okai. */

//Végkimenetel
if($hiba) {
//ha történt hiba
include("login.php");
} else {
//ha a felhasználónév és jelszó helyes is.
header("Location: http://hup.hu/");
}
?>

Ezután módosítanám a login.php -t a következőképpen:
-----login.php
<html>
<body>
<form method="post" action="login_ell.php">
<input type="text" name="user" />
<?php if(isset($hiba) && array_key_exists("user",$hiba_tomb)) {echo $hiba_tomb["user"];} ?>
<input type="password" name="pass" />
<?php if(isset($hiba) && array_key_exists("user",$hiba_tomb)) {echo $hiba_tomb["user"];} ?>
<input type="submit" value="bejelentkezés" />
</form>
</body>
</html>
<!-- Így ki fogja írni a hibáit a bejelentkezésnek -->

Ha valami hibát vétettem benne, akkor bocsánat, majd később utáta nézek és még kipótolom, amivel tudom.

Bocsánat kedves kolléga, de a $_REQUEST tömb használatát elég sok helyen megkérdőjelezik, és nem tanácsolják, erről már a huppon is többször volt szó. itt vagy itt de egész biztos a google részletesebb magyarázatot is ad. A másik dolog ami eszembe jutott, hogy ennyi erővel miért van 2 külön állomány miért nem csak egy van, ami előszőr megjeleníti az oldalt, majd saját magára postol, ellenőriz, majd ha hiba van ismét megjeleníti az oldalt, ha pedig nincs elirányít?

Pl. a $_REQUEST-ben a jelszo post-olt erteket felulirhatod az URL-bol... login.php?password=ize meghivasaval. Ez nem biztos hogy egeszseges.

Itt az en megoldasom roviden:


<?php

if (isset($_POST['username']) $username=$_POST['username'] else $username='';
// beallitjuk a $username erteket a formhoz
$hiba='';
// hiba valtozo inicializalasa

if ($_POST['submit'])
{
// submitalva volt a form, itt johet a feldolgozasa, ellenorzese
if (jojelszo($_POST['username'],$_POST['password']))
{
// jo az jelszo, username
header("Location: kezdolap.php"); die();
}
else
{
// nem jo a jelszo, ballitjuk a hiba valtozot
$hiba='hiba leirasa';
}
}

?>
<?php if ($hiba) { ?>
hibauzenet kiiratasa
<?php } else { ?>
Ide jon a html oldal maga a login formmal;
<? } ?>

+1 sok szívatástól megkímélheted magad egy jó keretrendszer használatával. Vannak egész nagyok, meg egész kicsik is, attól függően válassz mire szeretnéd használni. A lentebb említett Schlossnagle, George: PHP fejlesztés felsőfokon mindenképpen olvasd el, ha komolyabban akarsz php-vel foglalkozni, sok trükk van benne, és rávezet az oop használatára is, mertugye egy keretrendszert elég nehéz használni, ha nem vagy tisztába pár alapfogaommal.

Ha komolyabb oldalhoz kell és mondjuk lesz még alatta egy adatbázis is, akkor én a symfony-t ajánlom. _NAGYON_ sok mindent tud. Részletes dokumentáció, könyv, API referencia és többféle tutorial is van hozzá. Kísérletezgetéshez, próbálgatáshoz letöltheted a "sandbox"-ukat is. Erősen objektumorientált PHP5. Különböző mélységekben állhatsz neki. Már egyszerűbb konfigurálással is sok mindent meg lehet vele csinálni. A login problémádra van külön beléptető/hitelesítő pluginja (sfGuard) is, ami jócskán túlmutat azon, amiket szeretnél. Sőt, általában bármilyen form ellenőrzéshez, újrakitöltéshez, hibakezeléshez és -kiíráshoz pedig nem kell egy sor új PHP kódot sem írnod. A symfony ezt is mind tudja. Ja, és az egész nyílt forrású! ;)

Itt az oldaluk.

Sok sikert!

- waiter -

Abból legalább a "Tanuljuk meg a PHP5 használatát 24 óra alatt", vagy a PHP4-es? Mert a PHP4-es ismeret bizonyos fokig frissítésre szorul.
PHP-t tanulni vagy új alkalmazást írni már PHP5-ben célszerű.
--
не закурить! (Ne gyújts rá!) не куриться! (Ne dohányozz! Ne füstölögj!)

Loginnál minek visszaírni az elrontott adatokat??

Én az input mezöbe irtam bele hogy mit vár a felh.tol
a php elején ellenörzés.

< input type="password" name="g_pass" class='btn'
onFocus="if(this.value=='Jelszó')this.value='';"
onBlur="if(this.value=='')this.value='Jelszó';" value='Jelszó'>

a post ugyanugy a index.php-t hívja meg. és mivel az elején ellenöriz (nálam mysql-be van tárolva az user) ha minden stimmel beenged, ha nem akkor megint megy a login formhoz.

pch

Lol, srácok, ennyi hülyeséget régen olvastam együtt, jót mulattam!!! :-) :-) :-)

A legelső megoldás kapcsán: bármelyik user bármelyik jelszavával beenged! (pl bélát a pista jelszavával)
REQUEST: sorrend megadható, a get-el való felülbírálás meg kifejezetten kívánatos, pl: login.php?username=valaki. Nem jutott eszedbe, he?
mellesleg mindenki jót vitatkozik azon, hogy HOGYAN adj át a paramétert, mikor a biztonság szempontjából az a fontos, hogy MIT ad át, ezt meg mindenki elfelejti leellenőrizni...
Behelyettesítés: teljesen rossz, js nélkül nem is megy. Ja, és jelszót NEM küldünk vissza cleartext formában!
Mindenkinél hiba volt: jean d'arc nem tud belépni! :-D
Ja, és alapszabály: a feldolgozó php-t és a megjelenítést SOSEM keverjük! Először szépen mindent lekezelünk, és ha minden megvan, akkor a legeslegvégén tesszük ki a html-t.

minta login.php:
<!--form kiértékelés -->
<?
//alapból nincs hiba
$error="";
//ha a belép-re nyomtak, csak akkor ellenőrzünk!!!!
if($_REQUEST['loginbtn']){
 if(CheckPassword($_REQUEST['username'],$_POST['password'])) {
  //beállítunk valami letöltések között is megmaradó cuccot
  //setcookie, session_start stb.
  header("location:loggedin.php");
  exit;
 } else {
  $error="Nincs ilyen felhasználó vagy hibás jelszó!\n";
}
?>
<!-- ...html kirakás... -->
<?=($error?"<font color='red'>".nl2br($error)."</font>":"")?>
<!-- önmagára küldjük -->
<form action='login.php' method='post'>
<!-- visszaírjuk a usernevet SZERVER oldalon -->
<input type='text' name='username' value='<?=htmlspecialchars($_REQUEST['username'])?>'>
<!-- jelszót SOSEM írunk vissza!!!!!!!!! -->
<input type='password' name='password'>
<input type='submit' name='loginbtn' value='Belépés'>
</FORM>
<!-- ...html kirakás... -->

"REQUEST: sorrend megadható, a get-el való felülbírálás meg kifejezetten kívánatos, pl: login.php?username=valaki. Nem jutott eszedbe, he?"

Ez gondolom nekem szolt... En meg nem lattam arra peldat hogy az usernevet valamiert get-tel felul akarnad irni. Persze ettol meg nincs kizarva, a te dolgod.

"Mindenkinél hiba volt: jean d'arc nem tud belépni! :-D"

Nyilvan egyik pelda sem 100%-os kidolgozottsagu, legalabbis nekem nem ez volt a celom.

Abban egyetertek hogy jelszot soha nem irunk vissza.

Ha adatmódosító formról van szó, akkor a GET alapból kiesett, mert az mindenféle vicces dologra ad lehetőséget. Namost hogy a POST jól működjön, azt úgy kell megcsinálni, hogy a POSTot feldolgozó oldalnak legyen egy külön URL-je, ami nem szolgál ki semmit, hanem csak visszadobja Location-nel a felhasználót a form oldalára, ha valami nem sikerült (mondjuk beleírva sessionbe a hibát) vagy az eredményoldalra ha sikerült. A külön URL azért kell, mert ha önmagadra redirectelsz, akkor mindenféle érthetetlen szívásnak esel áldozatul.

adatmódosításnál valóban nem megfelelő a GET, márcsak azért sem, mert valószínűleg több adatot küldesz át 256-(base url hossza) karakternél.
A POST-ot feldolgozó oldalnak nem kell külön url-nek lennie, sőt, áttekinthetetlenebb kódot eredményez. Az önmagára küldött form semmilyen érthetetlen szívást nem okoz, ha jól van megtervezve a program. Nem véletlenül írtam, hogy feldolgozó engine legelőször, amiben NINCS html kimenet.
(Azt, hogy áttekinthetlenebb a kód, tapasztalatból tudom. Nemegyszer kaptam régebben olyan feladatot, hogy rázzak gatyába ilyen oldalakat, és elég macerás, mikor a könyvtárban 100ezer filet találsz. Igazodj el. Itt nem arról van szó, ha te csináltad, hanem ha másvalaki kódját kell módosítanod.)