Сктипт за логин в админ панел(без sessions и cookies)
Този урок е написан специално за it-place.net.
Всяко следващо разпространение без изричното съгласие на автора е забранено!!!този скрипт е писан от escapeboy. Всяко разпространение без неговото изрично съгласие е забранено!
Тъйкато ме мързеше да чета session функциите на php реших да си направя система за логване в админ панела. Малко е дълго, но пък за сметка на това е простичко за разбиране.
Тъкмо ще го тествате да кажете дали е достатъчно защитен ;)
Започваме:
в login.php
инклудваме конфиг файла и връзката ни с БДтози скрипт е писан от escapeboy. Всяко разпространение без неговото изрично съгласие е забранено!
CODE
Проверяваме дали имаме въведени username и password. Ако нямаме извеждаме грешка...
CODE
... ако имаме въведени потребителско име и парола извеждаме информацията за този потребител... този скрипт е писан от escapeboy. Всяко разпространение без неговото изрично съгласие е забранено!
CODE
... след което проверяваме дали паролата отговаря на потребителското име. Ако не отговаря извеждаме грешка. Ако имате повече от един потребител с различни статуси, можете да промените <? if ($password != $dbpassword) ?> с <? if (($password != $dbpassword) || $status != "admin") ?> По този начин ще провери и статус на потребителя...
CODE
... ако паролата съответства на потребителя (и неговия статус е админ) тогава взимаме датата, часът(тук има някои особености, но няма да ви тормозя ;) ), генерираме някаква произволна цифра, която ще игра ролята на session_id, взимаме IP-то на потребителя и това цялото го вкарваме в базата данни. След което поздравяваме потребителя и го пращаме към началната страница на админ панела ...този скрипт е писан от escapeboy. Всяко разпространение без неговото изрично съгласие е забранено!
CODE
...затваряме всичко каквото има да се затваря...този скрипт е писан от escapeboy. Всяко разпространение без неговото изрично съгласие е забранено!
CODE
.. и ето самият дизайн на login.php, който се зарежда още в началото (или по-точно самата форма за писане)
CODE
Дотук с login.php. Вече сме в index.php. Тук единственото, което трябва да се вмъкне е един файл (user_check.php който ще разгледаме по-долу) и една малка особеност: когато пишете линка трябва да добавяте sid=$sid. За да може на следващата страница отново да ви провери (ако и там е вмъкнат user_check.php) в противен случай отново ще ви върне на login.php
Ето как ще изглежда един подобен линк:този скрипт е писан от escapeboy. Всяко разпространение без неговото изрично съгласие е забранено!
CODE
Проверка на sid | user_check.php
Проверяваме дали в sid има някаква стойност, ако няма - обратно в login.php ...
CODE
... малко разчистване на базата данни (излишно е да седят всички данни). Тази част от скрипта не е лоша да се промени, но и така ще ви свърши добра работа ...
CODE
... извеждаме данните за този sid и по-точно ip-то отговарящо на тази "сесия" ...този скрипт е писан от escapeboy. Всяко разпространение без неговото изрично съгласие е забранено!
CODE
... и проверяваме дали IP-то на потребителя отговаря на IP-то записано в базата данни за тази сесия. Ако не отговаря го препращаме към login.php и завършваме скрипта...
CODE
Това което остава да направите е да вмъкнете във всеки файл, който искате да защитите по този начин едно <? include("./user_check.php"); ?>
Само не забравяйте с всеки линк да изпращате sid иначе всеки път ще ви връща в login.php
Edit::
Опс, забравих sql-а ;) Ето го и него (тук давам само sessions.sql с другото предполагам, че ще се справите ;) ):
sessions.sql
CODE
П.П.
Сега забелязвам, че има доста излишни неща в скрипта, но това не пречи на неговата работа ;)
За по-знаещите :D
Ако забележите някъде дупка моля казвайте, за да се опитам да го оправя :D
10х и се надявам да ви свърши работа
Декларирам, че авторът на по-горе посоченият скрипт съм АЗтози скрипт е писан от escapeboy. Всяко разпространение без неговото изрично съгласие е забранено!
Абе к'ви глупости ме карате да пиша
Всяко следващо разпространение без изричното съгласие на автора е забранено!!!този скрипт е писан от 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. Всяко разпространение без неговото изрично съгласие е забранено!
Абе к'ви глупости ме карате да пиша





