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

Форум PHP

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

 

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

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Проверка скрипта на дыры

Сообщения:  [1-10]    [11-20]  [21-25] 

 
 автор: JIEXA   (05.03.2005 в 18:51)   письмо автору
 
   для: Atom   (27.02.2005 в 19:01)
 

Я тут немного переделал:

<?php
chdir
("../");
include
"includes/config.php";
include
"includes/utils.php";
$url_host parse_url($HTTP_REFERER );
$referer=$url_host[host];
$referer=str_replace("www."""$referer);
$h_referer="http://".$referer;
if(
$h_referer!=$siteurl)
{
        include
"includes/header.php";
        print
"<br><br><center><b>Зачем тебе ломать этот сайт? Вали отсюда!</b></center>";
        include
"includes/footer.php";
        exit();
}
$name=trim($_POST['name']);
$email=trim($_POST['email']);
$c_text=trim($_POST['c_text']);
$id=trim($_POST['id']);
if(empty(
$id)) # Если неопределена переменная id, то форма отправлена с чужого сайта...
{
        include
"includes/header.php";
        echo
"<br><br><center>Хакер? ха ха...</center>";
        include 
"includes/footer.php";
        exit();
}
if(
$id!="")
{
        if(
strspn($id,"0123456789") != strlen($id)) # Если переменная id содержит, что-то кроме цифор
        
{
                include
"includes/header.php";
                echo
"<br><br><center>Ой, что-то неполучилось взломать сайт :)</center>";
                include 
"includes/footer.php";
                exit();
        }
}
if (empty(
$name)){ # Ввёл ли пользователь имя?
        
include"includes/header.php";
        echo
"<br><br><center><b>Введите ваше имя!</b></center>";
        include 
"includes/footer.php";
        exit();
}
if(
strlen($name) > "40"# Оно больше 40 символов?
{
        include
"includes/header.php";
        echo 
"<br><br><center><b>Ваше имя привышает 40 символов!</b></center>";
        include 
"includes/footer.php";
        exit;
}
if(
preg_match("/<.*?(script|object|iframe|applet|meta|style|form).*?>/"$name)) # Хочет хакнуть сайт через скрипты?
{
        include
"includes/header.php";
        print
"<br><br><center>Хакер? ха ха...</center>";
        include
"includes/footer.php";
        exit();
}
if (
preg_match("/[^(\w)|(\x7F-\xFF)|(\s)]/",$name)) {
        include
"includes/header.php";
        echo 
"<br><br><center><b>В имени можно использовать только буквы русского и латинского алфавита, цифры, знак _ и пробел.</b></center>";
        include
"includes/footer.php";
        exit;
}
if (empty(
$c_text)){ # Ввёл ли пользователь текст комментария
        
include"includes/header.php";
        echo
"<br><br><center><b>Вы забыли ввести текст комментариев!</b></center>";
        include 
"includes/footer.php";
        exit();
}
if (
$email != ""# Правильно ли ввёл пользователь e-mail
{
        if (
preg_match("/[^(\w)|(\@)|(\.)]/",$email))
        {
                include
"includes/header.php";
                print
"<br><br><center><b>Неверно введен е-mail. Введите e-mail в виде <i>email@email.ru</i></b></center>\n";
                include 
"includes/footer.php";
                exit;
        }
}
if(
strlen($email) > "40"# Он больше 40 символов?
{
        include
"includes/header.php";
        echo 
"<br><br><center><b>Ваш e-mail привышает 40 символов!</b></center>";
        include 
"includes/footer.php";
        exit;
}
if(
strlen($c_text) > "5000"# Текст комментария привышает 5000 символов?
{
        include
"includes/header.php";
        echo 
"<br><br><center><b>Текст комментариев привышает 5000 символов!</b></center>";
        include
"includes/footer.php";
        exit;
}
/* Обработаем имя, e-mail и текст комментария */
$name=htmlspecialchars(addslashes($name));
$email=htmlspecialchars(addslashes($email));
$c_text=addslashes($c_text);
if (!
get_magic_quotes_gpc())
{
        
$name mysql_escape_string($name);
        
$email mysql_escape_string($email);
        
$c_text mysql_escape_string($c_text);
}
mysql_query("UPDATE news SET comm=comm+1 WHERE id='".$id."'");
$query "INSERT INTO news_commentaries (cid, id, name, email, c_text, date) values (NULL, '".$id."', '".$name."', '".$email."', '".$c_text."', now())";
mysql_query($query$db);
if(
$save!="")
{
          
setcookie("comm_name"$nametime() + 3600*24*14);
          if(
$email!="")
          {
                  
setcookie("comm_email"$emailtime() + 3600*24*14);
          }
}
header("Location: ".$siteurl."/news/".$id.".html");
?>

P.S. c_text обрабатывается htmlspecialchars толькл при выводе в браузер )))

   
 
 автор: Atom   (27.02.2005 в 19:01)   письмо автору
 
   для: imi   (27.02.2005 в 17:38)
 

Ой, точно, я код невнимательно читал.

Кст, вопрос к Храптору.
Конкретизируйте, пожалуйста, в каких случаях mysql_escape_string не спасает от sql инъекций?

   
 
 автор: imi   (27.02.2005 в 17:38)   письмо автору
 
   для: Atom   (27.02.2005 в 16:14)
 

Доктор, я, кажется, разговариваю на другом языке :)))
Итак, берем укороченную версию скрипта, адаптированного для тестов:

$text= (isset($HTTP_POST_VARS['text']))? $HTTP_POST_VARS['text']:'';
if (!get_magic_quotes_gpc())
{
    $text = mysql_escape_string($text);
}
echo $text;
echo '<form method="post"><input name="text"><input type="submit"></form>';

Теперь выделяем из поста ХРраптора предлагаемый кусок кода и вставляем в форму, жмем кнопку.
Что происходит? что-то экстраординарное? Выдается test@mail.com; print \"\";
т.е. не выполнилась ни инструкция PHP, ни javascript.
Я чего-то не понимаю?
P.S. Приятно удивлен вашим терпением :) На других форумах давно бы уже облили грязью...

   
 
 автор: cheops   (27.02.2005 в 16:53)   письмо автору
 
   для: imi   (27.02.2005 в 16:08)
 

Обычно средствами JavaScript вытаскивают конфидициальную информацию из cookie (логины, пароли) и отправляют её на хост злоумышленника.

   
 
 автор: Atom   (27.02.2005 в 16:14)   письмо автору
 
   для: imi   (27.02.2005 в 16:08)
 

Мдя....
А тот код, который не показал Раптор, но покажет другой, менее благонастроенный человек опасен.
К примеру
print system("что-то плохое");
очень опасно.

   
 
 автор: imi   (27.02.2005 в 16:08)   письмо автору
 
   для: Atom   (27.02.2005 в 15:23)
 

Вопрос - какой код? Тот код, который показал ХРраптор - безопасен.

   
 
 автор: Atom   (27.02.2005 в 15:23)   письмо автору
 
   для: imi   (27.02.2005 в 14:52)
 

Дыра в том, что если человек введет имеил, и после имейла свой код, то скрипт пропустит этот код.

   
 
 автор: imi   (27.02.2005 в 14:52)   письмо автору
 
   для: cheops   (27.02.2005 в 14:50)
 

Это понятно. Я не могу понять, где же в первоначальном скрипте дыра...

   
 
 автор: cheops   (27.02.2005 в 14:50)   письмо автору
 
   для: imi   (27.02.2005 в 14:15)
 

Приведённое выше постом регулярное выражение не допустит уже такого взлома, так как в нём явно указаны границы слова, после e-mail уже что-то написать не получится.

   
 
 автор: imi   (27.02.2005 в 14:15)   письмо автору
 
   для: cheops   (27.02.2005 в 14:06)
 

Спасибо за ответы.
Но один вопрос остался-таки неотвеченным... Каких символов не хватает в посте ХРраптора? Где дыра?

   

Сообщения:  [1-10]    [11-20]  [21-25] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

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