|
|
|
| Уважаемая аудитория и администрация можно ли вас поросить проверить скрипт на дыры? И ещё посоветовать как его можно модифицировать до таого:
1) Пользователи могут изменять свои данные.
2) Занесение IP пользователя в БД.
Я точно не знаю какие файлы точно нужны, но предлагаю - "Форма авторизации", "Форма регистрации", "Обработчик форм". | |
|
|
|
|
|
|
|
для: evgen_17
(22.02.2005 в 20:54)
| | а где скрипт-то???
вроде не настолько я пьян | |
|
|
|
|
|
|
|
для: Crux
(22.02.2005 в 21:36)
| | Я скрипт позже пришлю... Вы скажите файлы эти надо или ещё какие? | |
|
|
|
|
|
|
|
для: evgen_17
(22.02.2005 в 21:40)
| | Вы прикрепите архив с этими скриптами - дыры могут появится во многих местах, поэтому желательно привести миниуму три указанных вами файла. | |
|
|
|
|
|
|
|
для: cheops
(22.02.2005 в 22:08)
| | А кто-нибудь знает как в Linux создавать архивы? Я могу только коды написать прямо в форум. Сейчас только с Windows выйду... Почитайте сообщения в разделе "О форуме", если ещё не прочитали. | |
|
|
|
|
|
|
|
для: evgen_17
(22.02.2005 в 22:14)
| | В Linux архив создаётся в два приёма. Сначала файлы объединяются в один файл при помощи утилиты tar
tar -cf имя_архива файл1 файл2 ...
|
Затем полученный файл сжимается утилитой gzip
Правда в утилите tar имеется специальный ключ -z, позволяющий сразу после объединения файлов запустить произвести сжатие полученного архива gzip
tar -czf имя_архива файл1 файл2 ...
|
Вместо файл1 файл2 может идти шаблон или имя каталога. | |
|
|
|
|
|
|
|
для: evgen_17
(22.02.2005 в 22:14)
| | Вот коды...
Форма регистрации
<form name="frm" action="signup.php" method="post">
<TABLE BORDER=0 align="center">
<TR> <TD>* Логин:</TD> <TD><input type="text" name="uid" value="<? echo $uid; ?>"></TD> </TR>
<TR> <TD>* Пароль:</TD> <TD><input type="password" name="pwd"></TD> </TR>
<TR> <TD>* Повторите пароль:</TD> <TD><input type="password" name="pwd2"></TD> </TR>
<TR> <TD>* Email адрес:</tD> <TD><input type="text" name="email" value="<? echo $email; ?>"></TD> </TR>
<TR> <TD>* Имя:</TD> <TD><input type="text" name="fname" value="<? echo $fname; ?>"></TD> </TR>
<TR> <TD>* Фамилия:</TD> <TD><input type="text" name="lname" value="<? echo $lname; ?>"></TD> </TR>
<TR> <TD>* Адрес:</TD> <TD><input type="text" name="addr" value="<? echo $addr; ?>"></TD> </TR>
<TR> <TD>* Город:</TD> <TD><input type="text" name="city" value="<? echo $city; ?>"></TD> </TR>
<TR> <TD>* Штат:</TD> <TD><select name="state">
<option value="">[Выберите штат] <option value="NN" (state_NN)>Non US //И т.д. их там много </select></TD> </TR>
<TR> <TD>* Страна/Country:</TD> <TD><select name="country">
<option value="">[Выберите страну] <option value="RU" (country_RU)>Российская Федерация <option value="UM" (country_UM)>United States //Здесь тоже очень много стран </select></TD> </TR>
<TR> <TD>* Zip Code:</tD> <TD><input type="text" name="zipcode" value="<? echo $zipcode; ?>"></TD> </tR>
<TR> <TD>* Телефон:</tD> <TD><input type="text" name="phone" value="<? echo $phone; ?>"></TD> </tR> </TABLE> <center> <input type=submit value='Зарегистрироваться' name=register> </FORM>
|
Обработчик формы регистрации
<? require('main.php');
db_connect();
if ($_SERVER['REQUEST_METHOD'] == "POST") {
$uid = $_POST['uid']; $pwd = $_POST['pwd']; $pwd2 = $_POST['pwd2']; $email = $_POST['email']; $fname = $_POST['fname']; $lname = $_POST['lname']; $addr = $_POST['addr']; $city = $_POST['city']; $state = $_POST['state']; $country = $_POST['country']; $zipcode = $_POST['zipcode']; $phone = $_POST['phone'];
$u = strtolower($uid); $pw = strtolower($pwd); $pw2 = strtolower($pwd2); $today = date("mdY");
if (!ctype_alnum($u) || strlen($u) < 4 || strlen($u) > 16) { echo "<center><font color=red>Логин должен состоять из 4-16 букв и цифр.</font><br></center>"; $err = "yes";
}
if (!ctype_alnum($pw) || strlen($pw) < 6 || strlen($pw) > 20) { echo "<center><font color=red>Пароль должен состоять из 6-20 символов .</font><br></center>"; $err = "yes"; }
if ($pw != $pw2) { echo "<center><font color=red>Введённые пароли не совпадают.</font><br></center>"; $err = "yes"; }
if ($err == "") {
$sql="select * from users where email='$email' OR uid like '%$u%'"; $result=mysql_query($sql) or die("select fails"); $no=mysql_num_rows($result);
if ($no==0) {
$sql="insert into users(uid,pwd,fname,lname,addr,city,state,country,zipcode,email,phone,status,type,datesignup) values('$u','$pw','$fname','$lname','$addr','$city','$state','$country','$zipcode','$email','$phone','active','sing',NOW())"; $result = mysql_query($sql) or die("insert fails");
if (isset($result)) {
echo "<center><br><b>Ваш аккаунт зарегистрирован</b> - Введите имя пользователя и пароль для доступа в защищённую зону..</center>";
} else { echo "<center><br>Ошибка регистрации, свяжитесб с администратором.<br></center>"; }
} else {
echo "<center><font color=red>Для того, чтобы восстановить данные для доступа к аккаунту, введите Ваш e-mail. <br> <a href='".BASEHREF."/forgotpass.php'>Напомнить пароль!</a></font><br></center>";
} } else {
include(INC_DIR."signup.php");
}
} else {
include(INC_DIR."signup.php");
}
db_disconnect();
?>
|
Форма авторизации
<form action="member.php" method="post"> <?php $_POST['uid'] = addslashes($_POST['uid']); $_POST['uid'] = htmlspecialchars ($_POST['uid']); $_POST['uid'] = preg_replace("/[a-z0-9]/i", "", $_POST['uid']); ?> <TABLE BORDER=0> <TR><TD colspan=2>Имя пользователя:</TD></TR> <TR><TD colspan=2><INPUT TYPE="text" size="10" name="uid"></TD></TR>
<TR><TD colspan=2>Пароль:</TD></TR> <TR><TD colspan=2><INPUT TYPE="password" size="10" name="pwd"></TD></TR>
<TR><TD colspan=2><A HREF='forgotpass.php' class='blue'>Напомнить пароль!</A></TD></TR>
<TR> <TD><input type="submit" value="Войти"></TD> <TD><input type="reset" value="Сброс"></TD> </tR> </TABLE>
</FORM>
|
Обработчик формы авторизации
<? session_start();
if (!isset($_SESSION['uid'])) { $_SESSION['uid'] = $_POST['uid']; $_SESSION['pwd'] = $_POST['pwd']; }
$uid = $_SESSION['uid']; $pwd = $_SESSION['pwd'];
db_connect();
$res = mysql_query("SELECT * FROM users WHERE uid='$uid' AND pwd='$pwd' and status='active'"); $re = mysql_fetch_array($res);
if(mysql_num_rows($res) != 0) {
echo "<center><br><b>Здравствуйте $uid, желаем приятно провести время.</b></center>"; } else {
unset($_SESSION['uid']); unset($_SESSION['pwd']);
echo "<center><br><b>Вы не авторизированы.</b></center>";
}
db_disconnect(); ?>
|
| |
|
|
|
|
|
|
|
для: evgen_17
(22.02.2005 в 22:43)
| | В обработчике данные, получаемые из формы лучше дополнительно обработать следующим образом:
<?php
if (!get_magic_quotes_gpc())
{
$uid = mysql_escape_string($_POST['uid']);
$pwd = mysql_escape_string($_POST['pwd']);
$pwd2 = mysql_escape_string($_POST['pwd2']);
$email = mysql_escape_string($_POST['email']);
$fname = mysql_escape_string($_POST['fname']);
$lname = mysql_escape_string($_POST['lname']);
$addr = mysql_escape_string($_POST['addr']);
$city = mysql_escape_string($_POST['city']);
$state = mysql_escape_string($_POST['state']);
$country = mysql_escape_string($_POST['country']);
$zipcode = mysql_escape_string($_POST['zipcode']);
$phone = mysql_escape_string($_POST['phone']);
}
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(22.02.2005 в 22:56)
| | И что, больше дыр нет? Кстате этот скрипт вставить до или после "db_connection"?
Жду ответа... | |
|
|
|
|
|
|
|
для: evgen_17
(22.02.2005 в 23:28)
| | На вскидку вроде ничего не видно больше - может ещё кто-нибудь чего увидит. Этот блок можно поместить как до db_connection, так и после - он не завязан на соединение. | |
|
|
|
|
|
|
|
для: cheops
(23.02.2005 в 00:40)
| | А как насчёт модификаций?
1) Пользователи могут изменять свои данные.
2) Запись IP пользователя в БД.
Это сложно? За меня ничего делать не надо, Вы только подскажите... | |
|
|
|
|
|
|
|
для: evgen_17
(23.02.2005 в 00:47)
| | 1) Для этого можно использовать уже существующую HTML-форму. Следует извлечь информацию по пользователю для которого осуществляется редактирование и включить форму при помощи include
<?php
// Здесь запрос и извлечение информации
$uid = $result['uid'];
....
$city = $result['city'];
// Включаем форму
include "form.php";
?>
|
Обработчик формы сделать динамическим - подставлять его при помощи переменной $action
<form name="frm" action="<?php echo $action; ?>" method="post">
|
2) Для каких целей записывается IP-адрес, дело в том, что у пользователей диалапа IP-адрес меняется при каждом новом подключении к сети, а у тех кто ходит в сеть через прокси-сервер он может быть постоянным (их может быть сотни). | |
|
|
|
|
|
|
|
для: cheops
(23.02.2005 в 00:57)
| | Сообщение перенесено в новую тему... | |
|
|
|
|
|
|
|
для: evgen_17
(27.02.2005 в 20:13)
| | >Если в обработчик включить или прямо в нём написать (кстате, как лучше?)
1) Лучше разделять форму и обработчик - код будет проще, поэтому при создании и модифицировании вероятность сделать ляп будет меньше.
>, то что Вы скажите?
2) Лучше убрать замену обратных кавычек - это действие лишнее
3) Не очень понятно, что делает эта строка
<?php
$uid = preg_replace("/[a-z0-9]/i", "",$_POST['uid'] );
?>
|
Нужны только спец-символы?
4) Этот код, тоже по-моему лишний
<?php
$uid = strip_tags($_POST['uid'] );
?>
|
>Какой бы код не ввели - она всё преобразует в обычный текст?
Нет она только заменит HTML-код на его эквиваленты, но этого достаточно.
5) На самом деле вы зря беспокоитесь, так как у вас ввод ограничен 10 символами, то у злоумышленика нет практически никаких шансов написать какой-бы то нибыло код.
6) Плохо вот что, вы в каждой строке переопределяете переменную $uid, так как вместо того, чтобы использовать $uid в качестве параметра у вас везде $_POST['uid']. Поэтому реальна вся защита состоит из
<?php
$uid = addslashes($_POST['uid']);
?>
|
PS Больше внимания следует уделять именно таким вещам (6), как правило дыры появляются из-за невнимательности :). | |
|
|
|
|
|
|
|
|
для: cheops
(22.02.2005 в 22:56)
| | Да, нет! Дыры есть всегда, все зависит от времени их поиска :-))
Кстаи, cheops, mysql_escape_string не спасает от скриптовой атаки, только от SQL-инъекций и то не всегда. И я это буквально неделю назад продемонстрировал в теме, где тоже просили проверить авторизацию на дыры. evgen17, а твой тип авторизации дырявый полностью и на инъекции и на скрипты тем более. Не буду повторяться в сотый раз почему, просто пройдись по темам на этом форуме и найдешь ответ. | |
|
|
|
|
|
|
|
для: XPraptor
(24.02.2005 в 14:47)
| | ХРаптор,
а когда mysql_escape_string не спасает от инъекций? | |
|
|
|
|
|
|
|
для: Atom
(27.02.2005 в 20:47)
| | А тогда, когда скрипт вписанный в базу является инъекцией. | |
|
|
|
|
|
|
|
для: evgen_17
(22.02.2005 в 20:54)
| | Вот архив с двумя файлами. В одном из них скрипт который проверяет информацию, введённую пользователем, в данном примере только одно значение - $uid. (check.php) В другом вопрос по регулярному выражению. (question.php) Ели можно, то проверьте пожалуйста его (check.php) на дыры, если есть ещё варианты добавления защиты, то подскажите, желательно прямо в файлах написать и отправить обратно. Но можно и в форум строки выложить. Я ещё не слишком в этом силён, но помоему этот скрипт от SQL - инекций не очень - то сильно защищает. Можно тоже варианты подсказать, если есть... Спасибо. | |
|
|
|
|
|
|
|
для: evgen_17
(06.03.2005 в 21:44)
| | Срочно требуется помощь... Проверьте пожалуйста скрипт на дыры... Нужны советы... | |
|
|
|
|
|
|
|
для: evgen_17
(07.03.2005 в 02:30)
| | Мда... Похоже таким образом помощи не добиться...
Вот скрипт:
<?
(preg_match("/[^-0-9a-z_]/i",$var))
/********************************************************************
Какие изменения сюда нужно внести, чтобы добавить использование пробелов?
И вообще, правильно ли оно написано?
********************************************************************/
?>
|
Вот второй скрипт:
<?
if(empty($uid))
{
echo '<table border = 1 bordercolor=#336699 cellspacing=2 cellpadding=2 valign=top width = 645 align = center>
<tr><td bgcolor=#FFCC33><font color=red size = 3>
<b><center>Поле "Логин"
не может быть пустым.
</center></b></font></td></tr></table>';
$err = "yes";
}
elseif (preg_match("/<.*?(script|object|iframe|applet|meta|style|form).*?>/", $uid))
{
echo '<table border = 1 bordercolor=#336699 cellspacing=2 cellpadding=2 valign=top width = 645 align = center>
<tr><td bgcolor=#FFCC33><font color=red size = 3>
<b><center>Логин не может содержать
элементы кода.
</center></b></font></td></tr></table>';
$err = "yes";
exit(); }
elseif (preg_match("/[^(\w)|(\x7F-\xFF)|(\s)]/",$uid))
{
echo '<table border = 1 bordercolor=#336699 cellspacing=2 cellpadding=2 valign=top width = 645 align = center>
<tr><td bgcolor=#FFCC33><font color=red size = 3>
<b><center>Логин должен содержать
русские и латинские буквы, цифры, знак подчёркивания и пробел.
</center></b></font></td></tr></table>';
exit(); }
elseif (strlen($uid) < 4 || strlen($uid) > 10)
{
echo '<table border = 1 bordercolor=#336699 cellspacing=2 cellpadding=2 valign=top width = 645 align = center>
<tr><td bgcolor=#FFCC33><font color=red size = 3>
<b><center>Логин должен содержать от 4 до 10 символов.
</center></b></font></td></tr></table>';
exit(); }
else
{
echo "<table border = 1 bordercolor=#336699 cellspacing=2 cellpadding=2 valign=top width = 645 align = center>
<tr><td bgcolor=#FFCC33><font color=#336699 size = 3>
<b><center>Логин <b><i>[$uid]</i></b>
принят.
</center></b></font></td></tr></table>";
}
$uid = htmlspecialchars(stripslashes($uid));
$uid = trim($uid );
if (!get_magic_quotes_gpc())
{
$uid = mysql_escape_string($uid );
}
$uid = addslashes($uid );
?>
|
Жду предложений, спасибо заранее... | |
|
|
|
|
|
|
|
для: evgen_17
(07.03.2005 в 21:04)
| | Больщое ВСЕМ спасибо. Видимо достал уже своими вопросами... Хотя на то он и форум, чтобы их задавать... ;((( | |
|
|
|
|
|
|
|
для: evgen_17
(08.03.2005 в 00:17)
| | Хм… дело в другом. Нормальная проверка скрипта на дыры требует значительных временных затрат. Ответ на вопрос и аудит безопасности – это далеко не одно и тоже. Работы по аудиту безопасности сайта могут перекрывать стоимость его разработки и создания. Если бы наличие дыр можно было бы определять одним взглядом, то и дыр бы не было.
Старайтесь задавать более конкретные вопросы. | |
|
|
|