[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Найти уязвимости и недостатки небольшого крипта
denis79513
Вот первый мой скрипт написанный после нескольких недель изучения PHP и sql это скрипт авторизации и регистрации пользователей, хотелось бы увидеть комментарии профессионалов и узнать его недостатки, уязвимости, что доработать.
1. Файл connect.php для подключения к БД.

<?
$host = "localhost"; //хост
$dbname = "js";//имя базы данных
$dbuser = "admin";//имя пользовалетя для БД
$dbpas = "061095";//пароль для БД
$conect=mysql_connect("$host","$dbuser","$dbpas");//Подключаемся к серверу
?>

2. Файл index.php сама форма регистрации для пользователей

<center><table cellpadding="6" cellspacing="0" border="0"><tr>
<
td width="600">
<
center>
<
h3>Регистрация</h3>
<
form name="reg" method="post" action="register.php">
<
table><tr>
<
td>Логин:</td>
<
td><input name="login" type="text" value="" /><br /></td></tr>
<
tr><td>Пароль:</td>
<
td><input name="pas" type="password" value="" /></td></tr>
<
tr><td>Повторите пароль:</td>
<
td><input name="repas" type="password" value="" /></td></tr>
<
tr><td>E-mail:</td>
<
td><input name="mail" type="text"/></td></tr>
<
tr><td>О себе:</td><td><textarea name="inform" cols="20" rows="3"></textarea></td></tr>
<
tr><td>День рождения:</td><td>
<
select size="1" name="gr">
<
option value="0">Год</option>
<
option value="2005">2005</option>
<
option value="2004">2004</option>
<
option value="2003">2003</option>
<
option value="2002">2002</option>
<
option value="2001">2001</option>
<
option value="2000">2000</option>
<
option value="1999">1999</option>
<
option value="1998">1998</option>
<
option value="1997">1997</option>
<
option value="1996">1996</option>
<
option value="1995">1995</option>
<
option value="1994">1994</option>
<
option value="1993">1993</option>
<
option value="1992">1992</option>
<
option value="1991">1991</option>
<
option value="1990">1990</option>
<
option value="1989">1989</option>
<
option value="1988">1988</option>
<
option value="1987">1987</option>
<
option value="1986">1986</option>
<
option value="1985">1985</option>
<
option value="1984">1984</option>
<
option value="1983">1983</option>
<
option value="1982">1982</option>
<
option value="1981">1981</option>
<
option value="1980">1980</option>
<
option value="1979">1979</option>
<
option value="1978">1978</option>
<
option value="1977">1977</option>
<
option value="1976">1976</option>
<
option value="1975">1975</option>
<
option value="1974">1974</option>
<
option value="1973">1973</option>
<
option value="1972">1972</option>
<
option value="1971">1971</option>
<
option value="1970">1970</option>
<
option value="1969">1969</option>
<
option value="1968">1968</option>
<
option value="1967">1967</option>
<
option value="1966">1966</option>
<
option value="1965">1965</option>
<
option value="1964">1964</option>
<
option value="1963">1963</option>
<
option value="1962">1962</option>
<
option value="1961">1961</option>
<
option value="1960">1960</option>
<
option value="1959">1959</option>
<
option value="1958">1958</option>
<
option value="1957">1957</option>
<
option value="1956">1956</option>
<
option value="1955">1955</option>
<
option value="1954">1954</option>
<
option value="1953">1953</option>
<
option value="1952">1952</option>
<
option value="1951">1951</option>
<
option value="1950">1950</option>
<
option value="1949">1949</option>
<
option value="1948">1948</option>
<
option value="1947">1947</option>
<
option value="1946">1946</option>
<
option value="1945">1945</option>
<
option value="1944">1944</option>
<
option value="1943">1943</option>
<
option value="1942">1942</option>
<
option value="1941">1941</option>
<
option value="1940">1940</option>
<
option value="1939">1939</option>
<
option value="1938">1938</option>
<
option value="1937">1937</option>
<
option value="1936">1936</option>
<
option value="1935">1935</option>
<
option value="1934">1934</option>
<
option value="1933">1933</option>
<
option value="1932">1932</option>
<
option value="1931">1931</option>
<
option value="1930">1930</option>
</
select>
<
select size="1" name="mr">
<
option value="0">Месяц</option>
<
option value="1">Январь</option>
<
option value="2">Февраль</option>
<
option value="3">Март</option>
<
option value="4">Апрель</option>
<
option value="5">Май</option>
<
option value="6">Июнь</option>
<
option value="7">Июль</option>
<
option value="8">Август</option>
<
option value="9">Сентябрь</option>
<
option value="10">Октябрь</option>
<
option value="11">Ноябрь</option>
<
option value="12">Декабрь</option>
</
select>

<
select size="1" name="dr">
<
option value="0">День</option>
<
option value="1">1</option>
<
option value="2">2</option>
<
option value="3">3</option>
<
option value="4">4</option>
<
option value="5">5</option>
<
option value="6">6</option>
<
option value="7">7</option>
<
option value="8">8</option>
<
option value="9">9</option>
<
option value="10">10</option>
<
option value="11">11</option>
<
option value="12">12</option>
<
option value="13">13</option>
<
option value="14">14</option>
<
option value="15">15</option>
<
option value="16">16</option>
<
option value="17">17</option>
<
option value="18">18</option>
<
option value="19">19</option>
<
option value="20">20</option>
<
option value="21">21</option>
<
option value="22">22</option>
<
option value="23">23</option>
<
option value="24">24</option>
<
option value="25">25</option>
<
option value="26">26</option>
<
option value="27">27</option>
<
option value="28">28</option>
<
option value="29">29</option>
<
option value="30">30</option>
<
option value="31">31</option>
</
select>
</
td></tr>
<
tr><td><input name="submit" type="submit" value="Регистрация"/></td>
<
td><input name="submit" type="reset" value="Отменить"/></td>
</
tr></table>
</
form></center>
</
td>
</
tr>
</
table></center>

3. Файл register.php

<?php
include "conect.php";
?>
<?php

$login=$_POST['login'];
$pas=$_POST['pas'];
$repas=$_POST['repas'];
$mail=$_POST['mail'];
$inform=$_POST['inform'];
$gr=$_POST['gr'];
$mr=$_POST['mr'];
$dr=$_POST['dr'];
If (!$conect) {echo('Соединение с сервером не было установлено!<br>');}
$condb=mysql_select_db($dbname,$conect);
If (!$condb) {echo('Соединение с базой данных не было установлено!<br>');}
$result=mysql_query("CREATE TABLE users
(id MEDIUMINT NOT NULL AUTO_INCREMENT,
login varchar(30),
Password varchar(20),
Mail varchar(20),
URL varchar(20),
Inform varchar(450),
YearB text,
MonthB text,
DayB text,
sid varchar(35),
PRIMARY KEY (id))"
,$conect);
if ($pas==$repas)
{
$sql="SELECT * FROM users WHERE Login='$login'";
$result=mysql_query($sql);
if (mysql_num_rows($result))
{echo ('
<center>
<div style="height:60px; width:612px; background-color:#CCCCCC; color:#333333;">
<center>
<br><strong>Ошибка! </strong><font color="#CC6666"><strong>Введенный вами логин уже существует! </strong></font>
</center>
<a href="index.php">Вернитесь назад</a> и попробуйте снова.
</div>
</center>'
);}
else
{$sql = "INSERT INTO users VALUES('0', '$login', '$pas', '$mail', '$url', '$inform', '$gr', '$mr', '$dr', '')";
if (mysql_query($sql)) {echo ('Пользователь успешно зарегистрирован! <a href="login.php">Форма для входа.');}
else
{echo ('
<center>
<div style="height:60px; width:612px; background-color:#CCCCCC; color:#333333;">
<center>
<br><strong>Ошибка! </strong><font color="#CC6666"><strong>Ошибка при регистрации.</strong></font>
</center>
<a href="index.php">Вернитесь назад</a> и попробуйте снова.
</div>
</center>'
);}}
}

else
{echo ('
<center>
<div style="height:60px; width:612px; background-color:#CCCCCC; color:#333333;">
<center>
<br><strong>Ошибка! </strong><font color="#CC6666"><strong>Введенные вами пароли не совпадают!</strong></font>
</center>
<a href="index.php">Вернитесь назад</a> и попробуйте снова.
</div>
</center>'
);}
mysql_close($conect);
?>

4. Файл login.php форма входа для пользователей


<form method="post" action="aut.php">
<
table>
<
tr><td>Логин: </td><td><input name="login" type="text" /></td></tr>
<
tr><td>Пароль:</td><td><input name="pas" type="password" /></td></tr>
<
tr><td><input name="submit" type="submit" /></td><td><input name="reset" type="reset" /></td></tr>
</
table>
</
form>

5. Файл auth.php обработчик для формы авторизации

<?php
include "conect.php";
?>
<?php

If (!$conect) {echo('Соединение с сервером не было установлено!<br>');}
$condb=mysql_select_db($dbname,$conect);
If (!$condb) {echo('Соединение с базой данных не было установлено!<br>');}
$login = $_POST['login'];
$password = $_POST['pas'];
session_start();
$res = mysql_query("SELECT `id`, `login`, `password` FROM users WHERE login ='" . $login. "' AND Password='" . $password . "'");
if (!mysql_num_rows($res))
{echo "Нету такого юзверя";}
else{
function generate_code($length = 35){
$num = range(0, 9);
$alf = range('a', 'z');
$_alf = range('A', 'Z');
$symbols = array_merge($num, $alf, $_alf);
shuffle($symbols);
$code_array = array_slice($symbols, 0, (int)$length);
$code = implode("", $code_array);
return $code;
}
$sid=generate_code();
$query = mysql_query("UPDATE users SET `sid` = '".$sid."' WHERE `login` = '".$login."'");
$_SESSION['login']=$login;
$_SESSION['sid']=$sid;
Header("Location: protected.php");}
mysql_close();
?>


6. Файл protected.php для проверки работы скрипта, если вошел, доступ есть, нет, и доступа нет.

<?php
include "conect.php";
?>
<?

session_start(); //инициализирум механизм сесссий
If (!$conect) {echo('Соединение с сервером не было установлено!<br>');}
$condb=mysql_select_db($dbname,$conect);
If (!$condb) {echo('Соединение с базой данных не было установлено!<br>');}
//начинаем проверку логина и пароля
$res=mysql_query("SELECT * FROM users WHERE login='".$_SESSION['login']."'
AND sid='"
.$_SESSION['sid']."'");
if(mysql_num_rows($res)!=1){ //такого пользователя нет
Header("Location: login.php"); //перенаправляем на login.php
}
else{ //пользователь найден, можем выводить все что нам надо
echo "Текст закрытой страницы<br><a href='logout.php'>Выход</a>";
}
mysql_close();
?>


7. Файл для выхода logout.php

<?
session_start(); //инициализируем механизм сессий
session_destroy(); //удаляем текущую сессию
Header("Location: protected.php"); //перенаправляем на protected.php
?>


Форма регистрации на правильность заполнения полей не проверяется, главное, принцип и безопасность работы скрипта, для безопасности я прочтя как многие в сессии используют логин и пароль для идентификации сессии, но это довольно опасно, в смвзи с этим я использовал уникальный, случайно генерированный SID.



Спустя 5 минут, 32 секунды (20.11.2010 - 14:34) denis79513 написал(а):
Насчет паролей, я читал что их лучше хранить в зашифрованном виде в БД нужно использовать md5 но тогда пароли отображаются в БД зашифрованными и их невозможно увидеть? Ведь в случае если администрации сайта необходимо увидеть пароль пользователя...

Спустя 7 минут, 13 секунд (20.11.2010 - 14:42) inpost написал(а):
Давай так, хочешь учиться? Даю задание, делаешь и совершенствуешься.
1) Опции сократи до двух коротких строк.
$dateStart = 1930;
$dateEnd = 2005;
Выведи в цикле for, где начальная точка будет dateStart, вторым условием остановки будет dateEnd, при этом dateStart будет увеличиваться на 1.
КОМАНДА: for() {};

2) Сделай тоже самое и с остальными опциями, код сюда в студию, дальше будем править вместе! Раскритиковать могу, но не хочу сразу обижать, надо всё делать шаг за шагом.

Спустя 8 минут, 25 секунд (20.11.2010 - 14:50) denis79513 написал(а):
Вот файл index.php с месяцами не знаю как быть думаю с ними ничего не упростишь.

<center><table cellpadding="6" cellspacing="0" border="0"><tr>
<
td width="600">
<
center>
<
h3>Регистрация</h3>
<
form name="reg" method="post" action="register.php">
<
table><tr>
<
td>Логин:</td>
<
td><input name="login" type="text" value="" /><br /></td></tr>
<
tr><td>Пароль:</td>
<
td><input name="pas" type="password" value="" /></td></tr>
<
tr><td>Повторите пароль:</td>
<
td><input name="repas" type="password" value="" /></td></tr>
<
tr><td>E-mail:</td>
<
td><input name="mail" type="text"/></td></tr>
<
tr><td>О себе:</td><td><textarea name="inform" cols="20" rows="3"></textarea></td></tr>
<
tr><td>День рождения:</td><td>
<
select size="1" name="gr">
<
option value="0">Год</option>
<?php
$year = 1930;
while ($year <= 2010) {
echo ('<option>'.$year.'</option>');
$year++;
}
?>
</select>
<
select size="1" name="mr">
<
option value="0">Месяц</option>
<
option value="1">Январь</option>
<
option value="2">Февраль</option>
<
option value="3">Март</option>
<
option value="4">Апрель</option>
<
option value="5">Май</option>
<
option value="6">Июнь</option>
<
option value="7">Июль</option>
<
option value="8">Август</option>
<
option value="9">Сентябрь</option>
<
option value="10">Октябрь</option>
<
option value="11">Ноябрь</option>
<
option value="12">Декабрь</option>
</
select>

<
select size="1" name="dr">
<
option value="0">День</option>
<?php
$day = 1;
while ($day <= 31) {
echo ('<option>'.$day.'</option>');
$day++;
}
?>
</select>
</
td></tr>
<
tr><td><input name="submit" type="submit" value="Регистрация"/></td>
<
td><input name="submit" type="reset" value="Отменить"/></td>
</
tr></table>
</
form></center>
</
td>
</
tr>
</
table></center>
<?php
$name=memory_get_usage();
echo ($name.'<br>');
?>

Спустя 15 минут, 35 секунд (20.11.2010 - 15:06) DySprozin написал(а):
denis79513
;;с месяцами не знаю как быть думаю с ними ничего не упростишь.
ну... можно ассоциированный массив создать, потом цикл - будет проще (;

Спустя 2 минуты, 21 секунда (20.11.2010 - 15:08) denis79513 написал(а):
Ну все равно все значения - названия месяцев писать нужно да и их не так много, главное года и даты, что еще подредактировать?

Спустя 8 минут, 12 секунд (20.11.2010 - 15:16) inpost написал(а):
Скрипт формы и скрипт обработчика авторизации помести в один файл. Сверху обработчик, снизу форма. Сабмит сам на себя. Если пустые данные - выводи в форме ошибку.
$login = (isset($_POST['login']) ? htmlspecialchars(trim($_POST['login'])) : false); // инициализируем так
if (empty($login))
$error[] = 'Вы не ввели имя';


Так ко всему, в самой форме вывод:

foreach ($error as $v)
echo $v.'<br>';


После того как проверили все данные на пустоту, делаем такое:
if(count($error) == 0)
{
// Выполняем обращения к базе данных, то есть массив пуст.
}


Готовый вариант объеденённый этой страницы сюда.
<form action="" method="post"> - так должна выглядеть форма, чтобы обращалась сама на себя. Не забудь при успешной авторизации сделать редирект.

UPDATE: тег <center> считается уже устаревшим, центровку делай так: <div align="center"></div>

Спустя 25 минут, 7 секунд (20.11.2010 - 15:41) denis79513 написал(а):
Поясни пожалуйста это:

foreach ($error as $v)
echo $v.'<br>';

Что это за переменная такая $v вроде нигде не было?

Спустя 10 минут, 39 секунд (20.11.2010 - 15:52) inpost написал(а):
$error[] = 'Нефть'; // ключем в начале будет 0.
$error['key1'] = 'value1';
$error['5'] = 'beer';

foreach - перебор! AS - где,
$v (или любая другая переменная) будет его значением, или же $k=>$v - будет ключем и значением.

Запусти этот код:

$error[] = 'Нефть'; // ключем в начале будет 0.
$error['key1'] = 'value1';
$error[5] = 'beer';

foreach($error as $key=>$value)
{
echo 'Ключ может принимать любое название переменной (свободной), Значение - то, чему равен массив с этим ключем, так же любое имя свободной переменной. Смотрим пример:<br> error=<br><br>'; // тут всякий бред, далее пример:
echo $key.' = '.$value.'<br>';
}
echo '<br><br><br>';
// А так же можно делать и без ключа:
foreach($error as $v)
{
echo $v.'<br>';
}


Спустя 10 минут, 36 секунд (20.11.2010 - 16:03) denis79513 написал(а):
Да, кстати скрипт нужно активировать после нажатия клавиши submit а то он ее до нажатия до ввода проверяет, сразу после загрузки страницы и пишет что поля пустые, нужно чтоб проверял после нажатия где-то видет команду isset как правильно пишется только не помню.

Спустя 5 минут, 17 секунд (20.11.2010 - 16:08) denis79513 написал(а):
Вот код получился:

<?php
include "conect.php";
If (!$conect) {echo('Соединение с сервером не было установлено!<br>');}
$condb=mysql_select_db($dbname,$conect);
If (!$condb) {echo('Соединение с базой данных не было установлено!<br>');}
$login = (isset($_POST['login']) ? htmlspecialchars(trim($_POST['login'])) : false); // инициализируем так
if (empty($login))
{$error[] = ('Вы не ввели имя');}
$password = (isset($_POST['pas']) ? htmlspecialchars(trim($_POST['pas'])) : false); // инициализируем так
if (empty($password))
{$error[] = ('Вы не ввели пароль');}
if(count($error) == 0)

{$res = mysql_query("SELECT `id`, `login`, `password` FROM users WHERE login ='" . $login. "' AND Password='" . $password . "'");
if (!mysql_num_rows($res))
{echo "Нету такого юзверя";}
else{ session_start();
function generate_code($length = 35){
$num = range(0, 9);
$alf = range('a', 'z');
$_alf = range('A', 'Z');
$symbols = array_merge($num, $alf, $_alf);
shuffle($symbols);
$code_array = array_slice($symbols, 0, (int)$length);
$code = implode("", $code_array);
return $code;
}
$sid=generate_code();
$query = mysql_query("UPDATE users SET `sid` = '".$sid."' WHERE `login` = '".$login."'");
$_SESSION['login']=$login;
$_SESSION['sid']=$sid;}
mysql_close();
Header("Location: protected.php");}
?>
<div align="center"><form method="post" action="">
<
table>
<
tr><td>Логин: </td><td><input name="login" type="text" /></td></tr>
<
tr><td>Пароль:</td><td><input name="pas" type="password" /></td></tr>
<
tr><td><input name="submit" type="submit" /></td><td><input name="reset" type="reset" /></td></tr>
</
table>
</
form></div>



Вот только куда вставить это чтоб правильно работало не пойму:(
foreach($error as $v)
{
echo $v.'<br>';
}

Спустя 2 минуты, 46 секунд (20.11.2010 - 16:11) inpost написал(а):
<input type="submit" name="send">

проверка в начале:
if(isset($_POST['send']))
{
тут всё тело.
}

Спустя 3 минуты, 54 секунды (20.11.2010 - 16:15) denis79513 написал(а):
Вот код, но ошибка если не ввел логин или пароль не вылазит и все

<?php
if(isset($_POST['submit']))
{
include "conect.php";
If (!$conect) {echo('Соединение с сервером не было установлено!<br>');}
$condb=mysql_select_db($dbname,$conect);
If (!$condb) {echo('Соединение с базой данных не было установлено!<br>');}
$login = (isset($_POST['login']) ? htmlspecialchars(trim($_POST['login'])) : false); // инициализируем так
if (empty($login))
{$error[] = ('Вы не ввели имя');}
$password = (isset($_POST['pas']) ? htmlspecialchars(trim($_POST['pas'])) : false); // инициализируем так
if (empty($password))
{$error[] = ('Вы не ввели пароль');}
if(count($error) == 0)

{$res = mysql_query("SELECT `id`, `login`, `password` FROM users WHERE login ='" . $login. "' AND Password='" . $password . "'");
if (!mysql_num_rows($res))
{echo "Нету такого юзверя";}
else{ session_start();
function generate_code($length = 35){
$num = range(0, 9);
$alf = range('a', 'z');
$_alf = range('A', 'Z');
$symbols = array_merge($num, $alf, $_alf);
shuffle($symbols);
$code_array = array_slice($symbols, 0, (int)$length);
$code = implode("", $code_array);
return $code;
}
$sid=generate_code();
$query = mysql_query("UPDATE users SET `sid` = '".$sid."' WHERE `login` = '".$login."'");
$_SESSION['login']=$login;
$_SESSION['sid']=$sid;}
mysql_close();
Header("Location: protected.php");}}
?>
<div align="center"><form method="post" action="">
<
table>
<
tr><td>Логин: </td><td><input name="login" type="text" /></td></tr>
<
tr><td>Пароль:</td><td><input name="pas" type="password" /></td></tr>
<
tr><td><input name="submit" type="submit" /></td><td><input name="reset" type="reset" /></td></tr>
</
table>
</
form></div>



Спустя 1 час, 2 минуты, 42 секунды (20.11.2010 - 17:17) inpost написал(а):
Итак, у тебя в массиве содержатся все ошибки, кроме: echo "Нету такого юзверя", а это тоже надо бы туда добавить.
Скобки при присвоивании значения не нужны переменным! $error[] = 'text';
Прочитай про массивы, у тебя ошибки записались в массив $error, теперь его надо вывести на экран в удобном для тебя месте, выводишь с помощью функции foreach!
Имена таблицы и колонок обромляются такими кавычками ``
SELECT `id` FROM `users` WHERE `login`


А так же если ввёл неправильные данные, пусть они обратно в форму возвращаются в value, чтобы заново пользователь не вводил!

Спустя 17 часов, 26 секунд (21.11.2010 - 10:18) denis79513 написал(а):
Хорошо, по упрощению кода это да, тут еще есть работа, но это ничего со временем сделаю, главное, по безопасности, можете что-нибудь сказать?

Спустя 1 час, 24 минуты, 26 секунд (21.11.2010 - 11:42) Tpocmb написал(а):
Случаем не торрент трекер хочешь поднять? )))))

Спустя 4 часа, 39 минут, 49 секунд (21.11.2010 - 16:22) inpost написал(а):
irbis-team.com - там смотри как должнл быть, если не хочешь по пунктам улучшать код!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.