Kezdőoldal » Számítástechnika » Programozás » Mi lehet a hiba a következő...

Mi lehet a hiba a következő PHP feldolgozó kódban?

Figyelt kérdés

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!



2019. júl. 29. 13:33
 1/5 anonim ***** válasza:

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:~$

2019. júl. 29. 17:18
Hasznos számodra ez a válasz?
 2/5 anonim ***** válasza:

CodePad link:


[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.

2019. júl. 29. 17:31
Hasznos számodra ez a válasz?
 3/5 anonim ***** válasza:

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.

2019. júl. 29. 17:36
Hasznos számodra ez a válasz?
 4/5 anonim ***** válasza:

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.

2019. júl. 29. 17:44
Hasznos számodra ez a válasz?
 5/5 anonim ***** válasza:

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;

2019. júl. 29. 17:48
Hasznos számodra ez a válasz?

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!