Jump to content
php.lv forumi

Cepumi


Gacha

Recommended Posts

Nu man jau bail paliek te kaut ko prasīt, ka atkal nebļauj virsū par stulbiem jautājumiem.

 

Nu tā es taisu login scriptu ar 3 līmeņiem, itkā tas viss strādā, bet problema ir tā, ka nevaru ievietot tos cepumus. Man met ārā tādus errorus

Warning: Cannot modify header information - headers already sent by (output started at d:\usr\www\test\admin\chek.php:1) in d:\usr\www\test\admin\chek.php on line 31

 

Un te ir mans scripts:

<?php

 $user = $_POST['user']; 
 $pass = $_POST['pass'];
 $login_page = "login.htm"; 
 $table = "admin";
 include("../../protected/mysql_config.php");
 $link = mysql_connect($hostname,$dbuser,$dbpass);
         mysql_select_db("$dbname");
 if (!mysql_connect($hostname,$dbuser,$dbpass))
      {echo "Nevar pievienoties DB";}
  
 $result = mysql_query("select * from $table where pass='$pass' and user='$user'");
 if ($row = mysql_fetch_array ($result)) {
   $limenis = "".$row["level"]."";
$parole = "".$row["pass"]."";
$lietotajs = "".$row["user"]."";

setcookie ('user', $parole);
setcookie ('pass', $lietotajs);
//shiis rindas tikai testam
if ($limenis == 3) {
echo "Administratoram";
}
if ($limenis == 2) {
echo "Moderatoram";
}
if ($limenis == 1) {
echo "Parastam lietotajam";
}   
   //
 ?>
 <?
}
else
	 echo "<div align='center'><span class='style1'>Nepareiza parole vai lietotajs!!!</span>
</div><br><meta http-equiv=\"Refresh\" content=\"1;url=./$login_page\">";

?>

Nu es tos cepumus liku iekšā, tā kā manuālī teikts un vēl dažās adresēs, bet neiet.

 

 

jb4 Klausiju tev un sāku vairāk lasīt manuāli un visu citu informaciju un šis skripts ir pirmā lieta, kas uz php man ir sanācis pašam :D :D :D (ja neskaita problemu ar cepumiem)

Link to comment
Share on other sites

Rečku Tev ir sanākuse vajadzība pēc "Output buffering". Tev gan nav nepieciešamības par to zināt vairāk kā tikai to, ka skriptu sākumā ieliec rindiņu: ob_start();

 

Ja Tev faili (index.php - tie, kurus address laukā raksta un nevis tie, kurus tu pats "inklūdē") sākas ar HTML ( un nevis <?php ), tad pirms HTML ieliec:

<?php

ob_start();

?>

Un tad turpini rakstīt HTML.

 

Šī kļūda rodas, jo tu pirms setcookie() esi jau nosūtījis lietotājam "outputu" jeb skripta izpildes rezultātus - tekstu, ko tu palaid ar echo() vai arī ko vienkārši php neparsē - piemēram, to, kas nav iezīmēts pa vidu php atdalītājiem: <?php un ?>

 

PHP nevar nosūtīt kukijus lietotājam pēc outputa nosūtīšanas. Kukijs ir neliels strings, ko, saskaņā ar HTTP protokolu, var nosūtīt lietotājam pirms outputa, lai iestādītu viņa vidē (pārkūkā) kaut kādus mainīgos, kas nepieciešami lietotāja personifikācijai servera pusē (PHP var atšķirt lapas apmeklētājus savā starpā ar unikāliem identifikatoriem, kurus glabā apmeklētāja kukijā, piemēram) un klienta pusē (Javascript vēršas pie kukija, lai uzzinātu vai lietotājs ir darījis to un to, piemēram). Kad ir nosūtīta kaut viena atstarpe outputa, lietotāja klients jau vairs negaida kukijus, jo ir sācis jau lapas attēlošanu, tāpēc kukijiem jābūt nosūtītiem pirms outputa. To var panākt rūpīgi rakstot programmas un skatoties lai pirms setcookie() nekas neaizietu pie lietotāja, bet ne vienmēr tas ir iespējams, tāpēc izmanto ob_start(), kas ielasa visu outputu un nosūta lietotājam tikai tad kad programmētājs to grib (tad programmētājs izsauc citas īpašas ob_ funkcijas) vai arī skripta beigās. Tev der variants ar to, ka tu vienkārši sākumā ieliec to ob_start() un tad skripta beigās PHP automātiski outputu nosūtīs klientam (vispirms nosūtot kukijus).

Link to comment
Share on other sites

Nu kārtējo reizi tev paldies!

 

Bet gribēju zināt vai tā kā man tur ir uztaisīts, tas kas pārbauda vai paroles ir derīgas vai nē ir pietiekami droši? Vai ir jēga ievietojot DB tās paroles un lietotāju aizkodēt?

 

Nu un kā kopumā izskatās? Vai tā ideja par leveliem ir laba, vai vajag taisīt, kā savādāk?

 

Ja ir vēl kādas kļudas, vai vajag ko pielabot, tad pasaki!!!

Link to comment
Share on other sites

es redzēju, ka tu liec cepumiņu ar lietotāja paroli. tas ir negudri. tāpēc, ka kukijus var apskatīt jebkurš, kas ir pie datora. un tas nav arī programmai nepieciešams. zemāk paskaidroju kāpēc.

 

drošības lietas nav mana stiprā puse, bet es daru tā:

 

lietotāju tabula:

user_id

user_login

user_pass (ar MD5)

user_level

 

sesiju tabula:

sess_id tips šim lauciņam ir: VARCHAR(32) un tas ir PRIMARY KEY

sess_login

sess_level

sess_data

sess_time

 

Sesiju tabulā glabājas informācija par tiem lietotājiem, kas konkrētajā brīdī ir autorizēti darbam sistēmā. Kad tiek ielādēta kāda lapa, vispirms ir jāizsauc sesiju tabulas tīrītājs, kas izdzēsīs no tabulas vecās sesijas (tās, kuras lietotājs nav atjaunojis ilgāk nekā noteikts sistēmas noteikumos).

 

Piemēram, šis izdzēsīs piecpadsmit minūtes vecas sesijas:

$niceTime = time()-(15*60);

DELETE FROM sessions WHERE UNIX_TIMESTAMP(sess_time)>$niceTime

 

Kad lietotājs autorizējas, tad pārbaudu šādīgi:

$login = trim($_GET['user_login']); // trim() apgriež atstarpes sākumā un beigās

$pass = trim($_GET['user_pass']);

SELECT user_id, user_login, user_level FROM users WHERE user_login='{$login}' AND user_pass=MD5('{$pass}');

 

ja šis SELECT atgriež tieši vienu rindu, pārbaudu vai lietotājs jau nav autorizēts sistēmā:

SELECT COUNT(*) FROM sessions WHERE sess_login='$login';

 

Ja neviens jau nav autorizējies, tad veicam autorizāciju - ja ne, tad liekam lietotājam pagaidīt kamēr autorizētais lietotājs beidz darbu vai arī viņam izbeidzas sesija. Šis ir domāts, lai sistēmu nelietotu vairāki lietotāji ar vienu login, jo parasti tas sistēmu lietošanas noteikumos ir aizliegts.

 

tad es ievietoju sesijas informāciju sesiju tabulā:

$level - tas ir tas, kādu līmeni tu atradi users tabulā ar pirmo SELECT.

session_start();

$sess_id = session_id();

INSERT INTO sessions (sess_id,sess_login,sess_level,sess_data,sess_time) VALUES ('$sess_id','$login',$level','',NOW());

 

Pēc tam uzlieku uz lietotāja datora kukiju ar sessijas id, bet šo var arī nelikt, jo PHP jau automātiski viņu ieliek kā $_COOKIE['PHPSESSID'];

60*15 nozīmē, ka uzlieku kukiju darboties 15 minūtes

setcookie('manskukijs',$sess_id,time()+(60*15),'/');

 

Kad lietotājs iet sistēmas iekšējās lapās, tad ir jānolasa viņa sessijas id no kukija (vai arī no URLa, bet par to man tagad nav laika stāstīt) un jāpārbauda vai viņam ir aktīva sesija sesiju tabulā:

session_start();

$sess_id = session_id(); // <- šajā gadījienā PHP izmantos $_COOKIE['PHPSESSID'] vai arī caur URL nodoto sessijas id. Jā, laikam šis variants ir pareizākais

$sess_id = $_COOKIE['manskukijs']; // <- šajā gadījienā PHP izmantos tevis paša uzstādīto kukiju.

SELECT * FROM sessions WHERE sess_id='$sess_id'

 

es izmantoju savu kukiju, jo man dažreiz uz viena domēna ir vairākas autorizācijas sistēmas un tad es lieku tur katrai savu kukiju.

 

Ja šis selekts atgriež tieši vienu rindu, tad var kaut kur izmantot pēc vajadzības sess_data lauciņā glabāto informāciju, var arī to neizmantot. Tagad vajag atjaunot sesiju datubāzē, lai tā skaitās aktīva arī pēc 15 minūtēm:

 

UPDATE sessions SET sess_time=NOW() WHERE sess_id='$sess_id'

un neaizmirsti kukiju apdeitot, lai arī tas ir derīgs pēc 15 minūtēm:

setcookie('manskukijs',$sess_id,time()+(60*15), '/');

 

Kaut ko noteikti aizmirsu, bet tāpēc Tev pašam ir galva uz pleciem un php.net arī nav offlainā.

Link to comment
Share on other sites

Man šķiet, ka šis rakstiņš, būs jasaglabā pie turtoriāliem! Un jaatstāj uz vēlāku laiku, jo

 

Es nutik sāku strādāt ar parastiem "if" un "else", man no sākuma vajadzētu tos no visām pusēm nopētīt.

 

Es jau to sapratu, ka paroli likt cepumos nav laba lieta, bet mana lapā pietiktu, ja es cepumā ierakstītu aizkodētu paroli uz 20 minūtēm. Un ar logout tos cepumus smuki izdzēstu.

 

Bet man ir problēma ar cepumu salīdzināšanu ar datiem no DB:

 

Te ir chek.php ar to parbauda vai parole pareiza un uzstāda cepumu, ja ir pareiza:

<?php
ob_start();
?>
<?php

 $user = $_POST['user']; 
 $pass = $_POST['pass'];
 $login_page = "login.htm"; 
 $table = "admin";
 include("../../protected/mysql_config.php");
 $link = mysql_connect($hostname,$dbuser,$dbpass);
         mysql_select_db("$dbname");
 if (!mysql_connect($hostname,$dbuser,$dbpass))
      {echo "Nevar pievienoties DB";}
  
 $result = mysql_query("select * from $table where pass='$pass' and user='$user'");
 if ($row = mysql_fetch_array ($result)) {
   $limenis = "".$row["level"]."";
$parole = "".$row["pass"]."";
$lietotajs = "".$row["user"]."";

if (!isset($_COOKIE['user'])&&!isset($_COOKIE['pass'])){
setcookie ('user', $parole);
setcookie ('pass', $lietotajs);
}
echo "<meta http-equiv=\"Refresh\" content=\"0;url=./admin.php\">";
//shiis rindas tikai testam
if ($limenis == 3) {
echo "Administratoram";
}
if ($limenis == 2) {
echo "Moderatoram";
}
if ($limenis == 1) {
echo "Parastam lietotajam";
}   
   //
mysql_close();
 ?>
 <?
}
else
	 echo "<div align='center'><span class='style1'>Nepareiza parole vai lietotajs!!!</span>
</div><br><meta http-equiv=\"Refresh\" content=\"1;url=./$login_page\">";

?>

Nu cik pārbaudiju tad šis fails strādā pareizi.

Un te ir fails uz kuru tad pectam tas viss aiziet, bet nekas nenotiek viņš mani aizmet atpakaļ uz to login lapu?

<?php
ob_start();
$table = "admin";
$cep1 = $_COOKIE['user'];
$cep2 = $_COOKIE['pass'];

 include("../../protected/mysql_config.php");
 $link = mysql_connect($hostname,$dbuser,$dbpass);
         mysql_select_db("$dbname");
 if (!mysql_connect($hostname,$dbuser,$dbpass))
      {echo "Nevar pievienoties DB";}
  
 $result = mysql_query("select * from $table where pass='$cep3' and user='$cep1'");
 if ($row = mysql_fetch_array ($result)) {
$pass == "".$row["pass"]."";
$user == "".$row["user"].""; 
 if ($pass == $cep2) {
 
 
     
 
?>  


<head>
</head>
<body>
Kaa ir? 
</body>


<?
}
}
else echo "<meta http-equiv=\"Refresh\" content=\"0;url=./logout.php\">";
?>

Link to comment
Share on other sites

Nu kļuvu gudrāks un izdomāju cepumos neluikt paroli, bet gan random skaitlīti.

 

Tad kad staigā pa admin lapām un kopis salīdzina tavu IP un cepuma saturu ar to kas atrodas DB un ja viss ir pareizi tad viņš arī parāda to lapu, bet ja cepumam beidzas derīguma termiņš tad viņš parāda baltu lapu, kuras vietā būtu jaizmet atpakaļ uz login lapu. Kapēc tā?

Te kods:

//te parbauda vai viss ir kaartiibaa
$cepums = "".$row["random"]."";
$kukijs = $_COOKIE['cepums'];
if ($ip == $ipp && $kukijs == $cepums) {
//
//un ja ir tad te vinjsh raada lapu
//
//bet ja nav tad butu jaiziet uz login.htm
<? 
}}
else echo "<meta http-equiv=\"Refresh\" content=\"0;url=./login.htm\">";
?>

Link to comment
Share on other sites

Nu tad taa:

<?
ob_start();
?>
<?
$user = $_POST['user']; 
 $pass = $_POST['pass'];
 $login_page = "login.htm"; 
 $table = "admin";
 $table2 = "temp";
 $user_ip = $_SERVER['REMOTE_ADDR'];
 include("../protected/mysql_config.php");       
if (!mysql_connect($hostname,$dbuser,$dbpass))
      {echo "Nevar pievienoties DB";}
   mysql_select_db("$dbname");
 $result = mysql_query("select * from $table where pass='$pass' and user='$user'");
if ($row = mysql_fetch_array ($result)) {
 $random = rand(200, 20000);
 $limenis = "".$row["level"]."";
 $lietotajs = "".$row["user"]."";
 setcookie('cepums',$random,time()+(60*1),'/');
mysql_query("insert into $table2 set ip='$user_ip', user='$lietotajs', level='$limenis', random='$random'"); 
echo "<meta http-equiv=\"Refresh\" content=\"0;url=./admin.php\">";
mysql_close();

shis fails parbauda vai paroles sakriit un ja jaa tad uztaisa random skaitli un to ieraksta cepumaa un DB.

 

Un shis ir tas kas nolasa :

<?php
 include("../protected/mysql_config.php");
 $link = mysql_connect($hostname,$dbuser,$dbpass);
         mysql_select_db("$dbname");
 $table2 = "temp";
 $ip = $_SERVER['REMOTE_ADDR'];
 $result = mysql_query("select * from $table2 where ip='$ip'");
if ($row = mysql_fetch_assoc($result)) {
 $ipp = "".$row["ip"]."";
 $level = "".$row["level"]."";
 $vards = "".$row["user"]."";
 $cepums = "".$row["random"]."";
 $kukijs = $_COOKIE['cepums'];
if ($ip == $ipp && $kukijs == $cepums) {


?>

tad te ir lapas saturs kursh jaraadaas tikai lietotājiem

<? 
}}
else echo "<meta http-equiv=\"Refresh\" content=\"0;url=./login.htm\">";
?>
un te ir ja nesanaak

Bet problēma ir tā, ka nevis atmet atpakaļ uz login lapu, bet parāda baltu bildi.

 

Kad meģinaju bez cepuma, tad viss strādā, bet ar nestrādā.

Link to comment
Share on other sites

Kapec man kukijs neizdzeeshas tad kad aiztaisa brouseri?
setcookie('cepums',$sess_id,time()+(60*20),'/');

 

Vai tapeec ka vinjam uzlikts deriguma terminjsh?

tam jau viš arī i' cūkijs - lai saglabātos pēc brūzera slēgšanas

un, - jā, - laiciņš traucē

Link to comment
Share on other sites

×
×
  • Create New...