Mi lehet a hiba a következő PHP feldolgozó kódban?
Sziasztok!
Egy regisztrációs / bejelentkezős oldalt próbálok készíteni. A regisztráció tökéletesen működik. De a bejelentkezés egyszerűen nem akar. Nem tudok rájönni, de akárhányszor a validálás azon szakaszába érek, hogy adok meg adatokat (de azok mondjuk nem léteznek) akkor is beléptet a rendszer.
[a bejelentkezést feldolgozó php oldalak kódja]
(login.php):
<?php if(!defined("WEB_INDEX")){ die("Rosszul megnyitott link. Térj vissza a főoldalra!"); } ?>
<?php include_once("functions/login/class_login.php"); ?>
<?php
if(isset($_POST["submit"])){
$login = new login();
$check_login = $login->check_login($_POST);
if($check_login==0){
$login->login_user($_POST["email"]);
print_note("Bejelentkezés...");
echo '
<script type="text/javascript">
setTimeout(function(){
window.location.replace("?page=main");
}, 100);
</script>
';
}else {
print_errors($check_login); //hibakiiratás
}
}
?>
(a class_login feldolgozó):
<?php if(!defined("WEB_INDEX")){ die("Rosszul megnyitott link. Térj vissza a főoldalra!"); } ?>
<?php
class login {
public function check_login($data) {
$this->log_error = 0;
// regular expressions
//$this->email_regex = '/^([A-z0-9\_\.\-]+)@([a-z0-9\_\-\.]+).([a-z]{2,})$/';
$this->password_regex = '/^([óÓöÖüÜőŐúÚéÉáÁűŰA-z0-9\_\-\(\)\!\?\:\.\*\-\/]){6,100}$/';
//Google reCAPTCHA
$url = ' [link]
$privatekey = "";
$response = file_get_contents($url."?secret=".$privatekey."&response=".$_POST['g-recaptcha-response']."&remoteip=".$_SERVER['REMOTE_ADDR']);
$captchadata = json_decode($response);
// validating user data and create error declarations
//Google reCAPTCHA
if(isset($captchadata->success) AND $captchadata->success==true) {
date_default_timezone_set('Europe/Budapest');
protectinputdata($data["email"]);
if(!isset($data["email"]) || $data["email"] == "") {
$errors[] = "Add meg az e-mail címedet!";
$this->log_error=1;
}else{
if(!filter_var($data["email"], FILTER_VALIDATE_EMAIL)){
$errors[] = "Hibás e-mail cím!";
$this->log_error=1;
}else{
if(!isset_mail($data["email"])){
$this->log_error=1;
}else{
$salt = get_salt($data['email']);
}
}
}
protectinputdata($data["password"]);
if(!isset($data["password"]) || $data["password"] == "") {
$errors[] = "Add meg a jelszavadat!";
$this->log_error=1;
}else{
if(!preg_match($this->password_regex, $data["password"])){
$errors[] = "A megadott jelszó hibás! (A jelszónak minimum 6 karakterből kell állnia!)";
$this->reg_error = 1;
}else{
if(!user_pass($data["email"], encryptdata($salt.$data["password"]))){
$this->log_error=1;
}
}
}
}else{
$errors[] = "Kérlek igazold emberi mivoltodat!";
$this->log_error = 1;
}
if($this->log_error==0){ return 0; } else { return $errors; }
}
public function login_user($email){
$_SESSION["LOGGED_IN"]=1;
$_SESSION["LOGGED_IN_EMAIL"]=$email;
}
}
?>
(Függvények):
function encryptdata($data){
return hash('sha512', $data);
}
function protectinputdata($data){
strip_tags($data);
return addslashes($data);
}
function isset_mail($data){
$connection = dbconnect();
$query = "SELECT * FROM dbname WHERE user_email='".$data."'";
$result = $connection->query($query) or die("Hiba történt az adatbázishoz való kapcsolódás során!");
if ($result->num_rows == 1) {
return 1;
}else{
return 0;
}
$connection->close();
}
function get_salt($data){
$connection = dbconnect();
$query = "SELECT user_salt FROM dbname WHERE user_email='".$data."'";
$result = $connection->query($query) or die("Hiba történt az adatbázishoz való kapcsolódás során!");
if ($result->num_rows == 1) {
while ($row = $result->fetch_assoc()) {
$salt = $row["user_salt"];
}
return $salt;
}else{
return 0;
}
$connection->close();
}
function user_pass($email, $password){
$connection = dbconnect();
$query = "SELECT * FROM dbname WHERE user_email='".$email."' AND user_password='".$password."'";
$result = $connection->query($query) or die("Hiba történt az adatbázishoz való kapcsolódás során!");
if ($result->num_rows == 1) {
return 1;
}else{
return 0;
}
$connection->close();
}
function print_errors($data){
$errors = "";
foreach($data as $data){
$errors .= "<div class='errormessagebox stylefatal'>" . $data . "</div>";
}
echo "" . $errors . "";
}
// Success message prints
function print_note($data){
echo "<div class='errormessagebox stylesuccess'>" . $data . "</div>";
}
(connect.php):
<?php if(!defined("WEB_INDEX")){ die("Rosszul megnyitott link. Térj vissza a főoldalra!"); } ?>
<?php
function dbconnect() {
$host = "";
$username = "";
$password = "";
$dbname = "";
static $connection;
if ($connection===NULL){
$connection = new mysqli($host,$username,$password,$dbname);
if($connection->connect_errno) {
die("Hiba! Az adatbázis jelenleg nem érhető el! Kérlek próbáld újra később.");
exit();
}
$query = "SET NAMES utf8";
$connection->query($query)or die("Hiba történt! Próbáld újra később...");
}
return $connection;
}
?>
Mi lehet a logikai hiba?
Előre is köszönöm a segítséget!
mark@mark-Inspiron-laptop:~$ php -a
Interactive mode enabled
php > function ez_a_függvény_nem_ad_vissza_semmiféle_visszatérési_értéket () {}
php > $visszatérési_érték = ez_a_függvény_nem_ad_vissza_semmiféle_visszatérési_értéket();
php > if ($visszatérési_érték == 0) echo 'Elfogadja!'; else echo 'Nem fogadja el!';
Elfogadja!
php > if (NULL == 0) echo 'Elfogadja!'; else echo 'Nem fogadja el!';
Elfogadja!
php > if (NULL === 0) echo 'Elfogadja!'; else echo 'Nem fogadja el!';
Nem fogadja el!
php > quit
mark@mark-Inspiron-laptop:~$
CodePad link:
A lényeg:
Amit a CodePad-ben meg az előző hozzászólásban mini példaprogramként linkeltem, abban van egy
ez_a_függvény_nem_ad_vissza_semmiféle_visszatérési_értéket
nevű függvény. Ez persze egy pici példafüggvény, a Te programodban szereplő check_login függvénynek a megfelelője. Fontos látni, hogy a check_login függvényben sincsen return sor, így a check_login függvény is egy tisztán void-os, semmiféle visszatérési értéket vissza nem adó függvény. A check_login függvény eredményét meg ugye a
$check_login = $login->check_login($_POST);
if($check_login==0){
...
...
...
}
programrészlet ellenőrzi a programodban. Mivel azonban a check_login függvény semmit (tiszta void-ot) add vissza, ezért ezt a PHP NULL-értékként fogja értelemezni. A NULL == 0 összehsonlítás pedig igaznak számít (!!!), ugyanis a sima == operátor előbb közös típusra konvertálja az összehasonlítandó értékeket, és a NULL és a 0 közös értékre konvertálódik, így azonosnak értékűnek számítanak.
Ahogy a kis példaprogram írja, az === operátor már képes megkülönböztetni a NULL-t a 0-tól, de nem ez rejlik igazán a hiba mélyén, hanem az, hogy a check_login (vagyis a példabeli ez_a_függvény_nem_ad_vissza_semmiféle_visszatérési_értéket föggvény) nem return-ol semmiféle eredmlnyt. A check_login függvénynek valószínűleg valamilyen boolean logikai értéket kéne return utasításban visszaadnia.
Bocsánat, most látom, tévedtem, a check_login végén igenis VAN egy
if($this->log_error==0){ return 0; } else { return $errors; }
sor, és ez gondoskodik a végső logikai érték visszaadásáról.
if(!user_pass($data["email"], encryptdata($salt.$data["password"]))){
. . . . . $this->log_error=1;
}
itt szerintem ki kellene egészíteni egy további sorral:
if(!user_pass($data["email"], encryptdata($salt.$data["password"]))){
. . . . . . $this->log_error=1;
. . . . . . $errors[] = "A belépési adatok nem egyeznek az adatbázisban megadott adatokkal"
}
Ugyanis ha ez a sor amit most beszúrtam, kimaradna, akkor hiába billen az $error_log változó 1-re, de az $errors tömb üres marad, márpedig a végső ellenőrzést végző összehasonlíto sor akkor egy üres tömböt fog a 0 értékkel összehasonlítani, ami szintén igaznak számít.
Egy másik lehetséges megoldás meg az, hogy a végső ellenőrzést égző sor ne az $errors tömböt, hanem az error_log értéként hasonlítsa össze 0-val. Ehhez nem magát az ellenőrzést végző sort kell javítani, hanem a check_login függvény utolsó sorát:
Ilyen volt:
if($this->log_error==0){ return 0; } else { return $errors; }
Ilyen lenne a javítása:
if($this->log_error==0){ return 0; } else { return $log_error; }
vagy akár egyszerűen
return log_error;
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!