Не сте регистриран! Регистрирайте се БЕЗПЛАТНО, за да използвате услугите на сайта!

 Сктипт за логин в админ панел(без sessions и cookies)
Автор  escapeboy (05.02.2005 15:14) съобщение до автора
Погледнат  1888 пъти добави към любими
Оценка добави коментар
Гласове  -- изпрати на приятел
Коментари  (4) абонирай се за PHP
     
escapeboy
     
 

Този урок е написан специално за it-place.net.
Всяко следващо разпространение без изричното съгласие на автора е забранено!!!този скрипт е писан от escapeboy. Всяко разпространение без неговото изрично съгласие е забранено!


Тъйкато ме мързеше да чета session функциите на php реших да си направя система за логване в админ панела. Малко е дълго, но пък за сметка на това е простичко за разбиране.
Тъкмо ще го тествате да кажете дали е достатъчно защитен ;)
Започваме:

в login.php
инклудваме конфиг файла и връзката ни с БДтози скрипт е писан от escapeboy. Всяко разпространение без неговото изрично съгласие е забранено!
CODE
1
2
3
<?
include ("./config.php");
include ("./dbconnect.php");

Проверяваме дали имаме въведени username и password. Ако нямаме извеждаме грешка...
CODE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$login = $_GET['login'];
//
if logged - begin to chek the fields
if (!empty($login)){
$password = $_POST['password'];
$username = $_POST['username'];
if (empty ($username) || empty($password)){
?>
<
br>
  <
table width="70%" cellspacing="2" border="0" align="center" cellpadding="2" class="forumline">
<
tr>
    <
td>
  <
center>     
 
    <
span class="nav">Не сте въвели потребителско име или парола</span>
    </
center>
    </
td>
</
tr>
    </
table>
</
html>
<?
}

... ако имаме въведени потребителско име и парола извеждаме информацията за този потребител... този скрипт е писан от escapeboy. Всяко разпространение без неговото изрично съгласие е забранено!
CODE
1
2
3
4
5
else{
$query = "SELECT ID, username, password, status FROM users WHERE username='$username'";
$result = mysql_query($query) or die("Query failed : " . mysql_error());
$num_type = mysql_num_rows($result);
while (list ( $id, $dbusername, $dbpassword, $status )= mysql_fetch_array ($result)) {

... след което проверяваме дали паролата отговаря на потребителското име. Ако не отговаря извеждаме грешка. Ако имате повече от един потребител с различни статуси, можете да промените <? if ($password != $dbpassword) ?> с <? if (($password != $dbpassword) || $status != "admin") ?> По този начин ще провери и статус на потребителя...
CODE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if ($password != $dbpassword){
?>
<
br>
  <
table width="70%" cellspacing="2" border="0" align="center" cellpadding="2" class="forumline">
<
tr>
    <
td>
  <
center>     
 
    <
span class="nav">Въвели сте невалидна парола за потребител <b><? echo "$username"; ?></b></span>
    </
center>
    </
td>
</
tr>
    </
table>
</
html>
<?
}

... ако паролата съответства на потребителя (и неговия статус е админ) тогава взимаме датата, часът(тук има някои особености, но няма да ви тормозя ;) ), генерираме някаква произволна цифра, която ще игра ролята на session_id, взимаме IP-то на потребителя и това цялото го вкарваме в базата данни. След което поздравяваме потребителя и го пращаме към началната страница на админ панела ...този скрипт е писан от escapeboy. Всяко разпространение без неговото изрично съгласие е забранено!
CODE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
else{
$date=date("d.m.Y");
$time=date("H");
$sid= rand(8277288737235162378,92893842875428346786);
$ip = $_SERVER['REMOTE_ADDR'];

$query = "INSERT INTO sessions (start_at, ip, user, session_id, time) values ('$date', '$ip', '$username', '$sid', '$time')"
or die ("Could not insert new data:" . mysql_error());
$result = mysql_query($query) or die ("Could not insert new data:" . mysql_error());

?>
<
br>
  <
table width="70%" cellspacing="2" border="0" align="center" cellpadding="2" class="forumline">
<
tr>
    <
td>
  <
center>     
  <
form action="index.php?sid=<? echo "$sid"; ?>" method="post">
  <
input type="hidden" name="username" value="<? echo "$username"; ?>">
  <
input type="hidden" name="password" value="<? echo "$password"; ?>">
    <
span class="nav">Здравей, <b><? echo "$username"; ?></b>, радвам се да те видя отново ;)<br>За да продължиш натисни <input type="submit" name="enter" class="mainoption" value="ТУК" /></span>
    </
form>
    </
center>
    </
td>
</
tr>
    </
table>
</
html>

...затваряме всичко каквото има да се затваря...този скрипт е писан от escapeboy. Всяко разпространение без неговото изрично съгласие е забранено!
CODE
1
2
3
4
5
6
7
<?
exit;
}
}
}
}
?>

.. и ето самият дизайн на login.php, който се зарежда още в началото (или по-точно самата форма за писане)
CODE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<title><? echo "$sitename"; ?> Admin Panel :: Влизане </title>
 <
br>
<
form action="login.php?login=yes" method="post">

<
table width="100%" cellpadding="4" cellspacing="1" border="0" class="forumline" align="center">
  <
tr>
    <
th height="25" class="thHead" nowrap="nowrap">Login For Admin Panel</th>
  </
tr>
  <
tr>
    <
td class="row1"><table border="0" cellpadding="3" cellspacing="1" width="100%">
          <
tr>
            <
td colspan="2" align="center"> </td>
          </
tr>
          <
tr>
            <
td width="45%" align="right"><span class="gen">Username:</span></td>
            <
td>
              <
input type="text" name="username" size="25" maxlength="40" />
            <
/td>
          </
tr>
          <
tr>
            <
td align="right"><span class="gen">Password:</span></td>
            <
td>
              <
input type="password" name="password" size="25" maxlength="25" />
            <
/td>
          </
tr>
          <
tr align="center">
            <
td colspan="2"><input type="submit" name="login" class="mainoption" value="Влез" /></td>
          </
tr>
          </
table></td>
  </
tr>
</
table>
</
form>

Дотук с login.php. Вече сме в index.php. Тук единственото, което трябва да се вмъкне е един файл (user_check.php който ще разгледаме по-долу) и една малка особеност: когато пишете линка трябва да добавяте sid=$sid. За да може на следващата страница отново да ви провери (ако и там е вмъкнат user_check.php) в противен случай отново ще ви върне на login.php
Ето как ще изглежда един подобен линк:този скрипт е писан от escapeboy. Всяко разпространение без неговото изрично съгласие е забранено!
CODE
1
<a href=./example.php?<? echo "sid=$sid"; ?>>Example</a>

Проверка на sid | user_check.php

Проверяваме дали в sid има някаква стойност, ако няма - обратно в login.php ...
CODE
1
2
3
4
5
6
<?
$sid = $_GET['sid'];
if (empty($sid)){
?><
meta http-equiv="refresh" content="1;url=login.php"><?
 
exit();
}

... малко разчистване на базата данни (излишно е да седят всички данни). Тази част от скрипта не е лоша да се промени, но и така ще ви свърши добра работа ...
CODE
1
2
3
4
5
6
7
8
9
10
11
12
13
$query = "SELECT id, time FROM sessions ORDER BY time ";
$result = mysql_query($query) or die("Query failed: " . mysql_error());
while (list ($id, $time)= mysql_fetch_array ($result)) {
$time = $time;
$id = $id;
}
//
Check Session Date
$now=date("H");
$end=($time + 1);
if ($now >= $end){
$query = "DELETE FROM sessions WHERE id='$id'";
$result = mysql_query($query) or die("Query failed: " . mysql_error());
}

... извеждаме данните за този sid и по-точно ip-то отговарящо на тази "сесия" ...този скрипт е писан от escapeboy. Всяко разпространение без неговото изрично съгласие е забранено!
CODE
1
2
3
4
5
$query = "SELECT id, start_at, ip, user, session_id, time FROM sessions WHERE session_id='$sid' ORDER BY time LIMIT 1";
$result = mysql_query($query) or die("Query failed: " . mysql_error());
while (list ($id, $start_at, $ip, $dbuser, $session_id, $time)= mysql_fetch_array ($result)) {
$dbip = $ip;
}

... и проверяваме дали IP-то на потребителя отговаря на IP-то записано в базата данни за тази сесия. Ако не отговаря го препращаме към login.php и завършваме скрипта...
CODE
1
2
3
4
5
6
7
8
// check ip for that user
$nip = $_SERVER['REMOTE_ADDR'];
if ($nip != $dbip){
?><
meta http-equiv="refresh" content="1;url=login.php"><?
 
exit();
}

?>

Това което остава да направите е да вмъкнете във всеки файл, който искате да защитите по този начин едно <? include("./user_check.php"); ?>

Само не забравяйте с всеки линк да изпращате sid иначе всеки път ще ви връща в login.php

Edit::
Опс, забравих sql-а ;) Ето го и него (тук давам само sessions.sql с другото предполагам, че ще се справите ;) ):

sessions.sql
CODE
1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE sessions (
 
id INTEGER,
 
start_at VARCHAR(15),
 
ip VARCHAR(50),
 
user VARCHAR(50),
 
session_id INTEGER,
 
time VARCHAR(20)
)
;


COMMIT;


П.П.
Сега забелязвам, че има доста излишни неща в скрипта, но това не пречи на неговата работа ;)

За по-знаещите :D
Ако забележите някъде дупка моля казвайте, за да се опитам да го оправя :D

10х и се надявам да ви свърши работа

Декларирам, че авторът на по-горе посоченият скрипт съм АЗтози скрипт е писан от escapeboy. Всяко разпространение без неговото изрично съгласие е забранено!

Абе к'ви глупости ме карате да пиша



Ключови думи: PHP script скрипт login логин админ панел sessions cookies сесия ip база данни




 1 посетител чете този скрипт (0 потребители и 1 гост)  
Активни потребители: ---
   
  

Еmail  
 

забележчица или 2;
1. не използваи ранд - особенно с такива големи стоиности, cpu-емка е таз фукция, мойе6 да използваш мт_ранд;
2. имаш директна фукнция за прегенериране на сесийното ид :)

  zetxx на 13.09.2007 23:40

Работя в фирма за web hosting и web design занимавам се от 4 години с PHP и HTML.
Имам известни критики относно скрипта ,но за начинаещ е добре и върши работа .

  masterfree на 01.08.2007 18:07

Какво да кажа по лесно щеше да ти е да прочетеш за сесии наистина е елементарно, но както и да е. Не прегледах целия код но трябва да сложиш махане на таговете и обработка на кавичките преди да пратиш каквото и да е към базата визирам   CODE
1
$query = "SELECT ID, username, password, status FROM users WHERE username='$username'";
Другото което мога да дам като съвет е да не съхраняваш паролите на потребителите в некриптиран вид в базата, ако някой успее да стигне до нея може да вземе паролите и ако потребителя ползва съ6тите усер и пасс на други места ще се знаят. 

  griffin на 24.04.2007 15:16

еми аз съм ламерче и може и да съм се объркал (4 часа е все пак  ), но мисля, че в този логин не може да се говори за сигурност ;). 

  QuaKy на 19.04.2005 03:06

 

 
  • Интересно от Софтуер
 
  • Интересно от myLINKS
 
 
 
 



IT-PLACE.NET © 2004 - 2008