The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"OpenNews: Десять правил написания безопасного кода на PHP"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Разговоры, обсуждение новостей (Public)
Изначальное сообщение [Проследить за развитием треда]

"OpenNews: Десять правил написания безопасного кода на PHP"  
Сообщение от opennews on 08-Мрт-04, 15:32 
В серии статей "Ten Security Checks for PHP" кратко рассматриваются 10 наиболее часто совершаемых PHP программистами ошибок, приводящих к проблемам с безопасностью скриптов.

Кратко, пересказ:

Избегайте использования переменных сформированных на основании данных пользователя в функции включения файла (include, require) или доступа к файлу (readfile, fopen, file). Например: include($lib_dir . "functions.inc"); include($page); переменные $lib_dir и $page перед этим нужно проверить либо на предмет наличия запрещенных символов, либо сопоставить с заранее определенным массивом допустимых значений:


$valid_pages = array(
  "apage.php"   => "",
  "another.php" => "",
  "more.php"    => "");
if (!isset($valid_pages[$page])) {
   die("Invalid request");
}

if (!(eregi("^[a-z_./]*$", $page) && !eregi("\\.\\.", $page))) {
   die("Invalid request");
}


Необходимо экранировать опасные символы (\ и ') в переменных участвующих в SQL запросах.Например, злоумышленник может передать переменную вида "password=a'+OR+1=i'1"  которая будет использована в SQL запросе как "Password='a' or 1='1'". Решение:  включить magic_quotes_gpc в php.ini или экранировать переменные самостоятельно через addslashes();


Никогда не нужно доверять глобальным переменным, при включенном в php.ini режиме register_globals злоумышленник может подменить значение глобальной переменной. Используйте ассоциативные массивы $HTTP_GET_VARS и $HTTP_POST_VARS с выключенным register_globals и в начале скрипта явно инициализируйте все глобальные переменные.


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


Используйте функции htmlspecialchars(), htmlentities() для экранирования HTML тэгов присутствующих в данных полученных от пользователя.


Защищайте библиотеки функций от просмотра их исходных текстов пользователем (расширения .inc, .class). Решение: снабжайте библиотеки расширением .php, помещайте в закрытую директорию или настройте хэндлер для парсинга расширения файлов с вашими библиотеками.


Помещайте файлы данных вне дерева файловой системы доступной через web (уровнем ниже htdocs, или "document root") или защищайте директории через .htaccess.


mod_php запускайте в режиме safe_mode.


Проверяйте наличие запрещенных символов в переменные используемых в  функциях eval, preg_replace, exec, passthru, system, popen, ``.


При использовании не mod_php, а CGI варианта php.cgi не забывайте, что через php.cgi можно получить доступ к любому файлу в директориях защищенных через .htaccess, так как доступ в этом случае ограничен только для прямых запросов, но не для запросов через CGI скрипт php.cgi.

URL: http://www.onlamp.com/pub/a/php/2003/04/03/php_security.html
Новость: http://www.opennet.me/opennews/art.shtml?num=2341

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


1. "Десять правил написания безопасного кода на PHP"  
Сообщение от TaranTuL email on 08-Мрт-04, 15:32 
>>При использовании не mod_php, а CGI варианта
>>php.cgi не забывайте, что через php.cgi можно
>>получить доступ к любому файлу в директориях
>>защищенных через .htaccess, так как доступ в этом
>>случае ограничен только для прямых запросов, но
>>не для запросов через CGI скрипт php.cgi.

давно устрарело, пхп сама проверяет как ее вызвали и при прямом вызове генерит ошибку.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "Десять правил написания безопасного кода на PHP"  
Сообщение от Pilat on 18-Май-07, 17:07 
>>Необходимо экранировать опасные символы (\ и ') в
>>переменных участвующих в SQL запросах.Например,
>>злоумышленник может передать переменную вида
>>"password=a%27+OR+1%3Di%271" которая будет
>>использована в SQL запросе как "Password='a' or
>>1='1'". Решение: включить magic_quotes_gpc в
>>php.ini или экранировать переменные самостоятельно
>> через addslashes();

Прото вредный совет. Надо использовать prepare('select * from passwd where password=?') и execute($password)

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру