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

Форум PHP

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

 

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

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

тема: Вопросы по безопасности
 
 автор: FireTiger   (10.05.2007 в 22:48)   письмо автору
 
 

Сначала такой вопрос:
При загрузке файлов на сервер, достаточно ли будет предварительно описать все расширения в массиве, а потом сравнивать допустимые расширения с текущем. Вот примерно так:

$extention = array(".jpg",".png");
    if(!empty($_FILES['image']['tmp_name'])) 
    {
$exten = strrchr($_FILES['image']['name'], "."); 
    if(in_array($exten,$extention)) 
    {
    //Копируем файлы
        }
  ...
     }

P.S Я новичок, строго не судите =).

   
 
 автор: Unkind   (10.05.2007 в 22:52)   письмо автору
 
   для: FireTiger   (10.05.2007 в 22:48)
 

Только при условии, что Вы и сохраните с этим разрешенным расширением.

   
 
 автор: FireTiger   (10.05.2007 в 23:46)   письмо автору
 
   для: Unkind   (10.05.2007 в 22:52)
 

Ок, спасибо, а вообще таких дыр вроде и нету, да?
И еще вопрос:
Стоит ли так писать, умно ли, или это перебор?

$_POST['title'] = htmlspecialchars(addslashes(stripslashes(ltrim($_POST['title']))));

   
 
 автор: bronenos   (11.05.2007 в 07:12)   письмо автору
 
   для: FireTiger   (10.05.2007 в 23:46)
 

addslashes stripslashes
налить воду, слить воду
зачем?

   
 
 автор: Trianon   (11.05.2007 в 09:53)   письмо автору
 
   для: bronenos   (11.05.2007 в 07:12)
 

addslashes - stripslashes - это налить воду слить налитое. Это еще не так опасно. Хотя и бесполезно.
А вот то, что написано - stripslashes - addslashes - это хуже. это выжать сок, а потом налить воды. То бишь разрушение контента.

   
 
 автор: Trianon   (11.05.2007 в 09:59)   письмо автору
 
   для: FireTiger   (10.05.2007 в 23:46)
 

Подобного рода строка мне говорит следующее.

Автор считает каждую из этих функций своего рода амулетом. И полагает, что чем плотнее он ими переменную обовьет, тем цветочнее ему будет.

Эти функции - не амулеты. Каждая выполняет строго определенные преобразования строки, и каждая полезна лишь там, где это преобразование требуется контекстом алгоритма. В любом другом месте каждая - вредна.

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

   
 
 автор: FireTiger   (11.05.2007 в 11:18)   письмо автору
 
   для: Trianon   (11.05.2007 в 09:59)
 


$_POST['title'] = htmlspecialchars(stripslashes(ltrim($_POST['title']))); 

Значит вот так? Или скажите как правильно, пожалуйста.
p.s
ltrim() я использую для удаления пробелов слева, то есть чтобы форму нельзя было заполнить пробелами. Так правильно?
stripslashes() я использую для удаления html тегов, и htmlspecialchars() для вывода только текстовой информации, чтобы скрипт там не выполнялся. У меня правильное понимание этих функций?
И еще вопрос, если я сделаю так:

$_POST['title'] =  htmlspecialchars(stripslashes(preg_replace("/[^a-z0-9]/i", "", ltrim($_POST['title']))));

то, нужны htmlspecialchars() , stripslashes()?

   
 
 автор: FireTiger   (11.05.2007 в 11:22)   письмо автору
 
   для: FireTiger   (11.05.2007 в 11:18)
 

Или просто скажите, как можно проверить данные получаемые от пользователя, чтобы ни одна мышь не проскочила.

   
 
 автор: Trianon   (11.05.2007 в 11:45)   письмо автору
 
   для: FireTiger   (11.05.2007 в 11:18)
 

Что ж, давайте попробуем разобраться.
>

>$_POST['title'] = htmlspecialchars(stripslashes(ltrim($_POST['title']))); 
>

>Значит вот так? Или скажите как правильно, пожалуйста.
На самом деле, первый смый трудный правильный шаг Вы уже сделали. Вы стали правильно ставить вопрос - зачем нужна каждая из функций.

>ltrim() я использую для удаления пробелов слева, то есть чтобы форму нельзя было заполнить пробелами. Так правильно?

Так правильно, в случае если строка в этом поле не имеет права по смыслу начинаться с пробелов, и неправильно, если формально она может быть с левыми пробелами.

Впрочем, возможно, что если категорически левые пробелы там недопустимы, то нужно не просто откусить их, а вообще остановить скрипт, выдав пользователю диагностику о недопустимом вводе. Обычно их откусывают, если информационная сущность при этом не теряется, чтобы пользователя в таких случаях лишними отлупами не нагружать.

>stripslashes() я использую для удаления html тегов,
stripslashes никакого отношения к тегам не имеет.
Обычно она применяется для восстановления входных параметров, испорченных на этапе старта скрипта идеологически ошибочным механизмом магических кавычек. Ели Вы о magic quotes ничего не читали - почитайте. Не чтобы его применять, а чтобы знать почему он работает, почему наносит вред, и как с ним бороться. Между прочим, применяться эта функция должна первой в цепочке, иначе её смысл невелик.

и htmlspecialchars() для вывода только текстовой информации, чтобы скрипт там не выполнялся.
htmlspecialchars применяется для замены в текстовом содержимом некоторых символов ( < > & " ) , применяющихся для разметки гипертекстовых документов с целью разместить в гипертексте обычный плоский текст, то есть как Вы правильно отметили, при выводе информации. Так зачем же Вы применяете её при вводе? А если с символами строки придется работать?

У меня правильное понимание этих функций?

>И еще вопрос, если я сделаю так:
>

>$_POST['title'] =  htmlspecialchars(stripslashes(preg_replace("/[^a-z0-9]/i", "", ltrim($_POST['title']))));
>

>то, нужны htmlspecialchars() , stripslashes()?
Я полагаю Вы в состоянии ответить на свой вопрос самостоятельно. Только почему то боитесь очевидного ответа. если в содержимом строки нет ничего кроме букв и цифр - нет ни обратных слэшей (это единственное, что ест stripslashes ) , нет уголков , амперсендов, кавычек (а другие не трогает htmlspecialchars) - то нет никакого смысла их применять после указанного preg_replace.

   
 
 автор: FireTiger   (11.05.2007 в 17:32)   письмо автору
 
   для: Trianon   (11.05.2007 в 11:45)
 

Большое спасибо! Много чего понял, только про magic quotes не очень,(потому что еще не читал).
А не могли бы Вы написать свой вариант защиты от проникновения вредоносного кода через формы?

   
 
 автор: Trianon   (11.05.2007 в 18:56)   письмо автору
 
   для: FireTiger   (11.05.2007 в 17:32)
 

Я просто не считаю код вредноносным.
Голый текст никому никакого вреда не принесет.

   
 
 автор: FireTiger   (11.05.2007 в 21:24)   письмо автору
 
   для: Trianon   (11.05.2007 в 18:56)
 

Просто напишите какие стоит использовать функции, или каких достаточно будет для безопасности.

   
 
 автор: acdcee   (21.05.2007 в 10:18)   письмо автору
 
   для: FireTiger   (11.05.2007 в 11:18)
 

stripslashes() - это убрать обратный слэш
htmlspecialchars() - это для работы с html-oм
addslashes - добавить обратные слешы к апострофам

если не использовать htmlspecialchars() там где надо то написав к примеру в $_POST['title']
alert('Script dead'); а еще и по циклом.... но хорошего будет мало а если через htmlspecialchars() то выведит просто alert('Script dead'); дальше ltrim а почему не trim и справа и слева в полне удобно....

preg_replace("/[^a-z0-9]/i", "", ltrim($_POST['title']) - лучше если это определить через условие

к примеру
if(preg_match("/[^a-z0-9]/i", $_POST['title']){
Header("Location:переносим куда надо");
exit;
}

"/[^a-z0-9]/i" - i это чтение или действие над строкой т.е переводит все буквы и бла бла бла в нижний регистер тоже самое что у тебя a-z

   
 
 автор: Trianon   (11.05.2007 в 10:01)   письмо автору
 
   для: FireTiger   (10.05.2007 в 22:48)
 

>При загрузке файлов на сервер, достаточно ли будет предварительно описать все расширения в массиве, а потом сравнивать допустимые расширения с текущем.

Достаточно для чего?

   
 
 автор: FireTiger   (11.05.2007 в 11:03)   письмо автору
 
   для: Trianon   (11.05.2007 в 10:01)
 

>Достаточно для чего?
Достаточно для безопасности, хватит ли такой защиты? А если есть дыры, то как еще обезопасить.

   
 
 автор: Trianon   (11.05.2007 в 11:25)   письмо автору
 
   для: FireTiger   (11.05.2007 в 11:03)
 

некорректно поставлен вопрос.
Такого кода достаточно, чтобы не позволить пользователю создавать на сервере свои файлы с именами, расширения которых отличны от перечисленных в списке, независимо от контента.
Такая мера в совокупности с другими действиями (например в совокупности с запретом на исполнение файлов с указанными расширениями и программным исключением возможности подключения файлов из целевой папки в поток кода) может обеспечить защиту от некоторых атак.

Абстрактной же безопасности, которой (и для которой) "достаточно" - не существует.

   
 
 автор: FireTiger   (11.05.2007 в 11:30)   письмо автору
 
   для: Trianon   (11.05.2007 в 11:25)
 

Большое спасибо! А насчет вот этого:

$_POST['title'] =  htmlspecialchars(stripslashes(preg_replace("/[^a-z0-9]/i", "", ltrim($_POST['title']))));

Здесь все хорошо?

   
 
 автор: sim5   (11.05.2007 в 17:46)   письмо автору
 
   для: FireTiger   (11.05.2007 в 11:30)
 

>$extention = array(".jpg",".png"); if(!empty($_FILES['image']['tmp_name']))...

Берем любой файл, даем ему расширение jpg или png, и загрузим на сервер. Безопасность может быть в норме, а вот мусора будет предостаточно. Почему бы не использовать getimagesize(), который вернет тип файла. Помоему так лучше будет?

   
 
 автор: FireTiger   (11.05.2007 в 21:25)   письмо автору
 
   для: sim5   (11.05.2007 в 17:46)
 

А можно поподробнее про ваш вариант, я просто еще не изучал работу с графикой.

   
 
 автор: sim5   (11.05.2007 в 21:48)   письмо автору
 
   для: FireTiger   (11.05.2007 в 21:25)
 

Это в мануале по РНР есть:
getimagesize - получает размер изображения.

Описание
array getimagesize (string filename [, array imageinfo])

Функция getimagesize() определяет размер изображения GIF, JPG, PNG, SWF, PSD, TIFF или BMP и возвращает размеры, тип файла и высоту/ширину текстовой строки, используемой внутри нормального HTML-тэга IMG.

Возвращает массив из 4 элементов. Индекс 0 содержит ширину/width изображения в пикселах. Индекс 1 содержит высоту/height. Индекс 2 это флаг, указывающий тип изображения. 1 = GIF, 2 = JPG, 3 = PNG, 4 = SWF, 5 = PSD, 6 = BMP, 7 = TIFF(байтовый порядок intel), 8 = TIFF(байтовый порядок motorola), 9 = JPC, 10 = JP2, 11 = JPX. Индекс 3 это текстовая строка с корректной строкой height="yyy" width="xxx", которая может использоваться непосредственно в тэге IMG.

   
 
 автор: FireTiger   (12.05.2007 в 17:51)   письмо автору
 
   для: sim5   (11.05.2007 в 21:48)
 

Спасибо. А как проверить данные от пользователя методом гет, вот так можно? чтобы обрезать все кроме цифр:

$_GET['page'] = preg_replace("/[^0-9]/i", "", $_GET['page']);

Сейчас изучаю вот эту статью: http://www.softtime.ru/info/articlephp.php?id_article=35. Там есть пример с авторизацией, и вот собственно вопрос: куда нужно ввести эти "123' AND 1=1", "admin'/*" строки чтобы обойти ту авторизацию. Что-то у меня не получается, я создал все в точности как в примере, а авторизацию не выходит обойти.
PS Мне это нужно понять, чтобы убрать дыру и вообще понять принцип работы взлома.

   
 
 автор: FireTiger   (12.05.2007 в 18:52)   письмо автору
 
   для: FireTiger   (12.05.2007 в 17:51)
 

И еще вопрос:
Как-то нужно защищать config.php если он лежит не в защищенном каталоге? Или хватит просто выставить права chmod?
PS И ответьте пожалуйста на предыдущие вопросы ;-)

   
 
 автор: Unkind   (12.05.2007 в 20:16)   письмо автору
 
   для: FireTiger   (11.05.2007 в 11:30)
 

Здесь все хорошо?
Вы издеваетесь? НЕТ.

чтобы обрезать все кроме цифр

Лучше приводить строку к integer:

<?php
$_GET
['page'] = (int) $_GET['page'];
?>

   
 
 автор: FireTiger   (12.05.2007 в 21:07)   письмо автору
 
   для: Unkind   (12.05.2007 в 20:16)
 

Для обработки форм с текстом я остановился на таком варанте:

 $_POST['title'] = htmlspecialchars(stripslashes(ltrim($_POST['title'])));

А для обработки форм с циферными значениями я остановился на таком варанте:

if(!is_numeric($_POST['page']))  $_POST['page'] = (int)$_POST['page']; 

   
 
 автор: Trianon (из кабака)   (12.05.2007 в 22:52)
 
   для: FireTiger   (12.05.2007 в 21:07)
 

вот и мечи после этого бисер.....

   
 
 автор: FireTiger   (12.05.2007 в 23:29)   письмо автору
 
   для: Trianon (из кабака)   (12.05.2007 в 22:52)
 

Что ты имеешь ввиду? Можно прямыми словами?

   
 
 автор: Trianon   (13.05.2007 в 11:07)   письмо автору
 
   для: FireTiger   (12.05.2007 в 23:29)
 

Думаю, что ничего, из того, что тут говорилось, Вы не поняли.
А теперь, прямыми словами (только собственными, а не из книжки) ответьте пожалуйста, что и зачем делает каждая из функций в Вашем коде

htmlspecialchars(stripslashes(ltrim(
?

   
 
 автор: FireTiger   (14.05.2007 в 16:56)   письмо автору
 
   для: Trianon   (13.05.2007 в 11:07)
 

В книжку после вашего сообщения специально не смотрел чтобы проверить мое понимание этих функций.
ltrim() - я использую для удаления пробелов с левой стороны слова.
stripslashes() - использую для удаления обратных слэшей; насколько понимаю это для того чтобы не выполнялся perl скрипт;
htmlspecialchars() - для запрета html-тегов, преобразовывает теги в их эквиваленты, например "<" в "&lt;" и т.п. и вообще не выполняет любые скрипты а просто их выводит как обычный текст.
Я чувствую что что-то не так со stripslashes(). Объясните пожалуйста!

   
 
 автор: provodnik   (14.05.2007 в 23:59)   письмо автору
 
   для: FireTiger   (14.05.2007 в 16:56)
 

Я использовал в галерее изображений такое:

<?
//если ввели путь к несуществующему файлу
if($_FILES["logo"]["name"] != "" and $_FILES['logo']['size'] == "0")
{
    echo 
"<HTML><HEAD><META HTTP-EQUIV='Refresh' CONTENT='3; URL=http://"$_SERVER['HTTP_HOST'] ."/photo/add/'></HEAD></HTML>";
    echo 
"<br /><center><strong>Нет у вас заявленной картинки на жестком диске</strong></center> <BR>";
    
$errors 1;
    exit ();
}    

if(
$_FILES["logo"]["name"] != "" and $_FILES['logo']['size'] > "0")
{
    
// определяем допустимые расширения
    
$valid_types=array("gif","jpg","png","jpeg"); 
    
// определяем имя файла    
    
$f_name $_FILES['logo']['name'];
    
// Запоминаем размер файла            
    
$f_size=$_FILES['logo']['size'];                 
    
    
// проверяем расширение файла
    
$ext strtolower(substr($f_namestrrpos($f_name".")));
    if (!
in_array($ext$valid_types))
    {
        
$errors "1";
        echo 
"Имя загружаемого файла имеет некрасивое расширение";
        exit ();
    }
    
    
// недопускаем использование в имени файла более одной точки
    
$t4k substr_count($f_name".");
    if (
$t4k "1")
    {
        echo 
"<center><strong>Не допускается использование нескольких точек в имени файла...</strong></center> <BR>";
        
$errors "1";
        exit ();
    }

    
// недопускаем использование в имени файла некрасивых дополнительных расширений 
    
$mess="<center><strong>Имя файла должно иметь расширение изображения...</strong></center><br />";
    if (
preg_match("/\.php/i",    $f_name)) {echo $mess$errors 1; exit ();}
    if (
preg_match("/\.html/i",    $f_name)) {echo $mess$errors 1; exit ();}
    if (
preg_match("/\.htm/i",    $f_name)) {echo $mess$errors 1; exit ();}
    if (
preg_match("/\.php3/i",    $f_name)) {echo $mess$errors 1; exit ();}
    if (
preg_match("/\.shtml/i",$f_name)) {echo $mess$errors 1; exit ();}
    if (
preg_match("/\.cgi/i",    $f_name)) {echo $mess$errors 1; exit ();}
    if (
preg_match("/\.pl/i",    $f_name)) {echo $mess$errors 1; exit ();}
    if (
preg_match("/\.asp/i",    $f_name)) {echo $mess$errors 1; exit ();}

    
// проверка веса файла
    
$max_size "307200"// допустимый вес - 300 килобайт
    
$f_kb_size=round($f_size/10.24)/100;
    
$f_size_max=round($max_size/10.24)/100;
    if (
$f_kb_size>$f_size_max)
    {
        
$errors 1;
        echo 
"Превышено ограничение на вес файла";
        exit ();
    }
}
?>

Авось пригодится...

   
 
 автор: mc -aiZer-   (15.05.2007 в 19:36)   письмо автору
 
   для: FireTiger   (14.05.2007 в 16:56)
 

А если MySQL-иньекция, то нужна addslashes() или mysql_escape_string().

   
 
 автор: FireTiger   (16.05.2007 в 23:29)   письмо автору
 
   для: Trianon   (13.05.2007 в 11:07)
 

Ну так как? Можете подсказать что не так? Просто что-то не пойму, в чем здесь проблема...

   
 
 автор: Trianon   (17.05.2007 в 10:14)   письмо автору
 
   для: FireTiger   (16.05.2007 в 23:29)
 

>Ну так как? Можете подсказать что не так? Просто что-то не пойму, в чем здесь проблема...

>ltrim() - я использую для удаления пробелов с левой стороны слова.

А если эти пробелы нужны?

stripslashes() - использую для удаления обратных слэшей; насколько понимаю это для того чтобы не выполнялся perl скрипт;

Не зная, кто насовал в поле эти слэши?
А меж тем, stripslashes() далеко не все слэши удаляет.
Кто будет исполнять введенный текст, как perl-скрипт, где и зачем?
А если посетитель захочет показать другим посетителям текст perl-скрипта, ему что - удавиться прикажете?

>htmlspecialchars() - для запрета html-тегов, преобразовывает теги в их эквиваленты,
>например "<" в "&lt;" и т.п. и вообще не выполняет любые скрипты а просто их выводит как обычный текст.

Эта операция требуется при выводе текста, но никак не при вводе.
при вводе она только мешает.


>Я чувствую что что-то не так со stripslashes(). Объясните пожалуйста!
Еще бы Вы чувствовали так. Про magic quotes прочли?

   
 
 автор: Trianon   (17.05.2007 в 10:21)   письмо автору
 
   для: Trianon   (17.05.2007 в 10:14)
 

А вообще, вот Вам мааааленькая задачка.
Нарисуйте форму с одним текстовым полем, в котором посетитель мог бы написать свое имя. Напишите обработчик, который бы записывал имя в таблицу БД, отвечал

Привет, имярек! Вы знаете, что в Вашем имени 6 символов? 
Сегодня нас посетили:

(вместо слова имярек выводя имя посетителя) и дальше бы построчно выводил список накопленных посетителей из таблицы вместе с количеством посещений.

Пожалуй на этом примере большую часть "так называемых вопросов безопасности", решаемых указанными Вами функциями Вы сможете разобрать.

NB: имя может содержать абсолютно любые символы.

   
 
 автор: mc -aiZer-   (15.05.2007 в 04:13)   письмо автору
 
   для: Unkind   (12.05.2007 в 20:16)
 

Лично я предпочитаю:

<?php 
$_GET
['page'] = intval($_GET['page']); 
?> 

   
Rambler's Top100
вверх

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