Този урок е написан специално за it-place.net.
Всяко следващо разпространение без изричното съгласие на автора е забранено!!!този скрипт е писан от escapeboy. Всяко разпространение без неговото изрично съгласие е забранено!
Тъйкато ме мързеше да чета session функциите на php реших да си направя система за логване в админ панела. Малко е дълго, но пък за сметка на това е простичко за разбиране.
Тъкмо ще го тествате да кажете дали е достатъчно защитен ;)
Започваме:
в login.php
инклудваме конфиг файла и връзката ни с БД
този скрипт е писан от escapeboy. Всяко разпространение без неговото изрично съгласие е забранено!
CODE1
2
3
| <?
include ("./config.php");
include ("./dbconnect.php"); |
Проверяваме дали имаме въведени username и password. Ако нямаме извеждаме грешка...
CODE1
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. Всяко разпространение без неговото изрично съгласие е забранено!
CODE1
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") ?> По този начин ще провери и статус на потребителя...
CODE1
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. Всяко разпространение без неговото изрично съгласие е забранено!
CODE1
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. Всяко разпространение без неговото изрично съгласие е забранено!
CODE1
2
3
4
5
6
7
| <?
exit;
}
}
}
}
?> |
.. и ето самият дизайн на login.php, който се зарежда още в началото (или по-точно самата форма за писане)
CODE1
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. Всяко разпространение без неговото изрично съгласие е забранено!
CODE1
| <a href=./example.php?<? echo "sid=$sid"; ?>>Example</a> |
Проверка на sid | user_check.php
Проверяваме дали в sid има някаква стойност, ако няма - обратно в login.php ...
CODE1
2
3
4
5
6
| <?
$sid = $_GET['sid'];
if (empty($sid)){
?><meta http-equiv="refresh" content="1;url=login.php"><?
exit();
} |
... малко разчистване на базата данни (излишно е да седят всички данни). Тази част от скрипта не е лоша да се промени, но и така ще ви свърши добра работа ...
CODE1
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. Всяко разпространение без неговото изрично съгласие е забранено!
CODE1
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 и завършваме скрипта...
CODE1
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
CODE1
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. Всяко разпространение без неговото изрично съгласие е забранено!
Абе к'ви глупости ме карате да пиша