The OpenNET Project / Index page

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

Десять правил написания безопасного кода на PHP

13.04.2003 15:20

В серии статей "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%27+OR+1%3Di%271" которая будет использована в 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.

  1. Главная ссылка к новости (http://www.onlamp.com/pub/a/ph...)
  2. Часть 1
  3. Часть 2
  4. A Study In Scarlet - Exploiting Common Vulnerabilities in PHP Applications
  5. Security flaws in PHP
  6. PHP Manual
Лицензия: CC BY 3.0
Источник: onlamp
Короткая ссылка: https://opennet.ru/2341-sql
Ключевые слова: sql, html, parser, file, exec, php, quota, web, crypt, trouble, access, password, limit, lib, screen, text, security, http, cgi, example
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (2) RSS
  • 1, TaranTuL (?), 15:32, 08/03/2004 [ответить]  
  • +/
    >>При использовании не mod_php, а CGI варианта
    >>php.cgi не забывайте, что через php.cgi можно
    >>получить доступ к любому файлу в директориях
    >>защищенных через .htaccess, так как доступ в этом
    >>случае ограничен только для прямых запросов, но
    >>не для запросов через CGI скрипт php.cgi.

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

     
  • 2, Pilat (?), 17:07, 18/05/2007 [ответить]  
  • +/
    >>Необходимо экранировать опасные символы (\ и ') в
    >>переменных участвующих в 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)

     
     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



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

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