Jump to content
php.lv forumi

Recommended Posts

Posted

Neesmu jau PHP guru, bet šo to uztaisīt māku. Nezinu kas par vainu manā primitīvajā login skriptā.

 

login.php:

<?
$login = $_POST['login'];
$password = $_POST['password'];
$pass = file("../passwords.txt");
$log = "0";
foreach($pass as $user) {
$case = explode(":|:", $user);
if($login == $case[0] && $password == $case[1]) {
$log = "1";
}}
if($log == "1") {
include('main.php');
} else {
die("Ievadītie dati nav pareizi!");
}
?>

 

passwords.txt - kreisajā pusē logini, labajā - paroles.

es:|:mans
tu:|:tavs

Problēma tāda, ka vienkārši neielogojās un izmet die() uzrakstu. Kādam ir kādi varianti?

Posted (edited)

Šo rindiņu:

$pass = file("../passwords.txt");

aizstāj ar

$pass = array_map('trim', file("../passwords.txt"));

Tas tāpēc, ka file atgriež faila saturu masīvā ar visiem enteriem rindiņu beigās. No manuāļa, kurā tev derēja pašam laikam ieskatīties:

Each element of the array corresponds to a line in the file, with the newline still attached.

Protams, šajā kodā logins un parole nevarēs saturēt atstarpes attiecīgi sākumā vai beigās. (korektāk būtu ifā salīdzinot paroli ņemt vērā enter simbolu: ... && $password == substr($case[1], 0, -1), un vispār - paroles glabāt plaintekstā nav sekjūri :)

Edited by bubu
Posted
$pass = file("../passwords.txt");

$log = "0";

foreach($pass as $user) {

$case = explode(":|:", $user);

 

eeemm

 

ejam un lasam:

http://lv.php.net/fopen

http://lv.php.net/fread

 

 

man domaat ka tur jābūt kautka tā:

 

$pass = fopen('../passwords.txt', 'r');
$saturs = fread($pass, 1024);

 

talaak ka cerams izraksies

 

PS nepretendeeju uz 100% perfektaako risinaajumu

Posted (edited)

Man radās vēl viens jautājums: Vai ir iespējams uzzināt, kurā passwords.txt rindiņā tika atrasts pareizais lietotājvārds un parole?

 

Es mēģināju pirms cikla ielikt $id=0; un pēc tam ciklā $id++; , bet paliek nemainīgi 1.

Edited by rudzis
Posted

Acīmredzot kautko nepareizi uzrakstīji. Rādi kodu. Vienkāršākajā gadījumā kautkam tādam taču ir jāstrādā:

$id = 1;
foreach (...) {
 if ($password = ...) {
   echo "Rinda ir: $id !";
 }
 $id++;
}

Posted

Brīnums gan ka tev strādā. $id pēc cikla tak vienmēr būs vienāds ar to rindiņu skaitu, kuriem tas ifs izpildās, tātad rindiņu, kurās ir ievadītais logins un parole.

Posted (edited)

bubu, reku jaunais, uzlabotais kods :) :

<?
error_reporting(0);
$login = $_POST['login'];
$password = $_POST['password'];
$pass = array_map('trim', file("../passwords.txt"));
$log = "0";
$id = 0;
foreach($pass as $user) {
$id++;
$case = explode(":|:", $user);
if($login == $case[0] && $password == $case[1]) {
$userid = $id;
$log = "1";
}}
if($log == "1") {
$pass_hash = md5($password);
$cookie_data = "$userid:|:$pass_hash";
setcookie("stats_login", $cookie_data);
echo '<script language="javascript">location="main.php"</script>';
} else {
die("Ievadītie dati nav pareizi!");
}
?>

Tikai nesaprotu, kaapeec kuukijs necepaas?

Edited by rudzis
Posted

Ak dies, kas tev tur par perversijām kodā ;) Tik dīvaini tu tai ciklā tu tos datus meklē!

Vai nav labāk šādi:

<?php
 error_reporting(E_ALL);
 $login = $_POST['login'];
 $password = $_POST['password'];
 $pass = array_map('trim', file('../passwords.txt'));
 $id = 0;
 foreach($pass as $user) {
   $id++;
   $case = explode(':|:', $user);
   if ($login == $case[0] && $password == $case[1]) {
     $pass_hash = md5($password);
     $cookie_data = "$userid:|:$pass_hash";
     setcookie('stats_login', $cookie_data);
     header('Location: main.php');
     // tagad $id satur rindiņas numuru
   }
 }
 die("Ievadītie dati nav pareizi!");
?>

×
×
  • Create New...