Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Дыры в скрипте. Модификация.
 
 автор: evgen_17   (22.02.2005 в 20:54)   письмо автору
 
 

Уважаемая аудитория и администрация можно ли вас поросить проверить скрипт на дыры? И ещё посоветовать как его можно модифицировать до таого:
1) Пользователи могут изменять свои данные.
2) Занесение IP пользователя в БД.
Я точно не знаю какие файлы точно нужны, но предлагаю - "Форма авторизации", "Форма регистрации", "Обработчик форм".

   
 
 автор: Crux   (22.02.2005 в 21:36)   письмо автору
 
   для: evgen_17   (22.02.2005 в 20:54)
 

а где скрипт-то???
вроде не настолько я пьян

   
 
 автор: evgen_17   (22.02.2005 в 21:40)   письмо автору
 
   для: Crux   (22.02.2005 в 21:36)
 

Я скрипт позже пришлю... Вы скажите файлы эти надо или ещё какие?

   
 
 автор: cheops   (22.02.2005 в 22:08)   письмо автору
 
   для: evgen_17   (22.02.2005 в 21:40)
 

Вы прикрепите архив с этими скриптами - дыры могут появится во многих местах, поэтому желательно привести миниуму три указанных вами файла.

   
 
 автор: evgen_17   (22.02.2005 в 22:14)   письмо автору
 
   для: cheops   (22.02.2005 в 22:08)
 

А кто-нибудь знает как в Linux создавать архивы? Я могу только коды написать прямо в форум. Сейчас только с Windows выйду... Почитайте сообщения в разделе "О форуме", если ещё не прочитали.

   
 
 автор: cheops   (22.02.2005 в 22:42)   письмо автору
 
   для: evgen_17   (22.02.2005 в 22:14)
 

В Linux архив создаётся в два приёма. Сначала файлы объединяются в один файл при помощи утилиты tar
tar -cf имя_архива файл1 файл2 ...

Затем полученный файл сжимается утилитой gzip
gzip имя_архива

Правда в утилите tar имеется специальный ключ -z, позволяющий сразу после объединения файлов запустить произвести сжатие полученного архива gzip
tar -czf имя_архива файл1 файл2 ...

Вместо файл1 файл2 может идти шаблон или имя каталога.

   
 
 автор: evgen_17   (22.02.2005 в 22:43)   письмо автору
 
   для: 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) < || strlen($u) > 16) {
            echo 
"<center><font color=red>Логин должен состоять из 4-16 букв и цифр.</font><br></center>";
            
$err "yes";

        }

        if (!
ctype_alnum($pw) || strlen($pw) < || 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();
?>

   
 
 автор: cheops   (22.02.2005 в 22:56)   письмо автору
 
   для: 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']);
  }
?>

   
 
 автор: evgen_17   (22.02.2005 в 23:28)   письмо автору
 
   для: cheops   (22.02.2005 в 22:56)
 

И что, больше дыр нет? Кстате этот скрипт вставить до или после "db_connection"?
Жду ответа...

   
 
 автор: cheops   (23.02.2005 в 00:40)   письмо автору
 
   для: evgen_17   (22.02.2005 в 23:28)
 

На вскидку вроде ничего не видно больше - может ещё кто-нибудь чего увидит. Этот блок можно поместить как до db_connection, так и после - он не завязан на соединение.

   
 
 автор: evgen_17   (23.02.2005 в 00:47)   письмо автору
 
   для: cheops   (23.02.2005 в 00:40)
 

А как насчёт модификаций?
1) Пользователи могут изменять свои данные.
2) Запись IP пользователя в БД.
Это сложно? За меня ничего делать не надо, Вы только подскажите...

   
 
 автор: cheops   (23.02.2005 в 00:57)   письмо автору
 
   для: 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-адрес меняется при каждом новом подключении к сети, а у тех кто ходит в сеть через прокси-сервер он может быть постоянным (их может быть сотни).

   
 
 автор: evgen_17   (27.02.2005 в 20:13)   письмо автору
 
   для: cheops   (23.02.2005 в 00:57)
 

Сообщение перенесено в новую тему...

   
 
 автор: cheops   (27.02.2005 в 21:36)   письмо автору
 
   для: 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   (27.02.2005 в 21:42)   письмо автору
 
   для: evgen_17   (27.02.2005 в 20:13)
 

http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=2384

   
 
 автор: XPraptor   (24.02.2005 в 14:47)   письмо автору
 
   для: cheops   (22.02.2005 в 22:56)
 

Да, нет! Дыры есть всегда, все зависит от времени их поиска :-))
Кстаи, cheops, mysql_escape_string не спасает от скриптовой атаки, только от SQL-инъекций и то не всегда. И я это буквально неделю назад продемонстрировал в теме, где тоже просили проверить авторизацию на дыры. evgen17, а твой тип авторизации дырявый полностью и на инъекции и на скрипты тем более. Не буду повторяться в сотый раз почему, просто пройдись по темам на этом форуме и найдешь ответ.

   
 
 автор: Atom   (27.02.2005 в 20:47)   письмо автору
 
   для: XPraptor   (24.02.2005 в 14:47)
 

ХРаптор,
а когда mysql_escape_string не спасает от инъекций?

   
 
 автор: XPraptor   (28.02.2005 в 10:14)   письмо автору
 
   для: Atom   (27.02.2005 в 20:47)
 

А тогда, когда скрипт вписанный в базу является инъекцией.

   
 
 автор: evgen_17   (06.03.2005 в 21:44)   письмо автору
 
   для: evgen_17   (22.02.2005 в 20:54)
 

Вот архив с двумя файлами. В одном из них скрипт который проверяет информацию, введённую пользователем, в данном примере только одно значение - $uid. (check.php) В другом вопрос по регулярному выражению. (question.php) Ели можно, то проверьте пожалуйста его (check.php) на дыры, если есть ещё варианты добавления защиты, то подскажите, желательно прямо в файлах написать и отправить обратно. Но можно и в форум строки выложить. Я ещё не слишком в этом силён, но помоему этот скрипт от SQL - инекций не очень - то сильно защищает. Можно тоже варианты подсказать, если есть... Спасибо.

   
 
 автор: evgen_17   (07.03.2005 в 02:30)   письмо автору
 
   для: evgen_17   (06.03.2005 в 21:44)
 

Срочно требуется помощь... Проверьте пожалуйста скрипт на дыры... Нужны советы...

   
 
 автор: evgen_17   (07.03.2005 в 21:04)   письмо автору
 
   для: 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) < || 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   (08.03.2005 в 00:17)   письмо автору
 
   для: evgen_17   (07.03.2005 в 21:04)
 

Больщое ВСЕМ спасибо. Видимо достал уже своими вопросами... Хотя на то он и форум, чтобы их задавать... ;(((

   
 
 автор: glsv (Дизайнер)   (08.03.2005 в 07:34)   письмо автору
 
   для: evgen_17   (08.03.2005 в 00:17)
 

Хм… дело в другом. Нормальная проверка скрипта на дыры требует значительных временных затрат. Ответ на вопрос и аудит безопасности – это далеко не одно и тоже. Работы по аудиту безопасности сайта могут перекрывать стоимость его разработки и создания. Если бы наличие дыр можно было бы определять одним взглядом, то и дыр бы не было.

Старайтесь задавать более конкретные вопросы.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования