ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > ИНФО > Статьи > Чужие Статьи
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Защита Php-скриптов
  #1  
Старый 11.09.2007, 19:01
Аватар для Zitt
Zitt
Познавший АНТИЧАТ
Регистрация: 07.05.2006
Сообщений: 1,031
Провел на форуме:
5885100

Репутация: 773


Отправить сообщение для Zitt с помощью ICQ
По умолчанию Защита Php-скриптов

В этой статье представлены элементарные принципы защиты PHP-скриптов, которые должен знать каждый веб-программист.

Сейчас всё чаще защита веб-скриптов сводится к проверке и ограничению их входных данных. Делается это для ограничения возможностей зловредных пользователей или просто для защиты от неправильных данных. Такая защита от кулхацкеров, не от хакеров, т.к. последние редко ищут дыры в скриптах с целью дефейса или по каким-либо другим своим личным надобностям, атака чаще сводится к взлому сервера, к получению привилегированных учетных записей на нем, с которых можно сделать запланированное. Но защита "от дурака" тоже важна, даже если у себя на сайте вы и не храните секретные коды запуска ракет или планы эвакуации для пентагона. Об элементарной, но эффективной защите и пойдет речь.


1. Итак, для начала неплохо было бы ограничить поступающие в скрипт входные данные. Никогда нельзя доверять данным, пришедшим в скрипт извне.
PHP код:
substr($str010); 
Так можно ограничить длину строки. К примеру, ограничить длину ника, вводимого в форме. Функция возвращает часть переменной $str. В данном случае функция вернет строку длинной не более 10 символов, начиная с нулевого, т.е. отбросит все символы, после десятого символа, если таковые имеются. Последний параметр функции является опциональным, т.е. необязательным, можно просто задать substr($str, 5) - в таком случае возвратом функции будет строка, часть переменной $str начиная с пятого символа.
Не стоит надеяться только на атрибут size в полях формы, не забывайте, что данные в ваш скрипт могут прийти откуда угодно, а не только из предусмотренной вами формой.

2. Также очень важно проверять поступающие данные на достоверность.
PHP код:
empty($str); 
Функция возвращает true, если переменная $str пустая [не содержит данных], false - в противном случае.
PHP код:
trim($str); 
Функция возвращает строку, очищенную от пустых символов вначале и конце строки [пробелы, символы табуляции, перевода строки].
PHP код:
strip_tags($str); 
Функция возвратит строку, очищенную от html и php тегов. В качестве второго параметра, начиная с версии PHP 3.0.13, можно задавать разрешенные теги, т.е. те теги, которые не будут вырезаться из строки. Например:
PHP код:
$strstrip_tags($str'<a><i><b>' );
htmlspecialchars$str); 
Функция заменяет символы в строке $str, имеющие специальное значение в html, на их безопасные эквиваленты:
PHP код:
на &amp;
на &lt;
на &gt;
" на &quot;
' на ' 
В качестве второго параметра можно задавать способ интерпретации кавычек. По умолчанию стоит ENT_COMPAT - преобразует только двойные кавычки, не трогая одиночные. ENT_QUOTES - преобразует оба типа кавычек. ENT_NOQUOTES - никакие кавычки не преобразуются.
Например:
PHP код:
$str htmlspecialchars'<a href="test">Test</a>' ENT_QUOTES); 
С помощью регулярных выражений можно (нужно!) многое. Часто требуется заменять какие-либо символы в тексте вручную. Например:
PHP код:
$strereg_replace"n"'&lt;br&gt;'$str); 
Данное выражение заменит в $str все символы с кодом 10 ["n" - перевод строки] на строку
PHP код:
&lt;br&gt
Очень желательно чтобы в поля e-mail и url были введены именно адрес электронной почты и адрес сайта соответственно, а не то, что душе угодно:
PHP код:
preg_match'/^([a-z0-9_-.])+@([a-z0-9_-])+(.([a-z0-9])+)+$/' ,$email); 
Такая запись устанавливает условие на содержимое переменной $email. Функция вернет true, если данные в переменной похожи на адрес электронной почты, false - в противном случае.
PHP код:
preg_match'/^([a-z0-9_-.])+(.([a-z0-9/])+)+$/' ,$url); 
Таким регулярным выражением можно проверить и url на правильность

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

Первым делом скрипты не должны выдавать предупреждения [warning] и тем более ошибки [error] в браузер, и вообще не должны их выдавать.

Много предупреждений возникает по поводу undefined variable - то бишь при попытке использования несуществующей переменной. Почему переменная может не существовать это отдельный вопрос, но всегда лучше это предупредить функцией isset().
PHP код:
isset( $var); 
Функция возвращает true, если переменная определена, false - в противном случае.

Использование get-метода передачи данных в скрипт, на мой взгляд, не желательно. Во-первых, эстетическая сторона - выглядит адресная строка отвратительно и непонятно для пользователя. Во-вторых, частично открывает структуру работы скрипта. Если метод get у вас нигде не используется, то лучше вообще абстрагироваться от него.

С методом post ситуация похожая:

register_globals

- директива, которая задает возможность (или невозможность) регистрации глобальных переменных, т.е. при получении данных из формы [post] или из адресной строки [get], по умолчанию создаются глобальные переменные с соответствующими именами [имя поля или имя параметра в адресной строке]. Это естественно, но безобразно.. (парадокс!) и вообще в некоторых случаях ведет к дырам в скриптах. Желательно так писать сценарии, чтобы они по возможности старались обходиться без директивы register_globals. Отключить это безобразие в .htaccess файле можно следующим образом:

php_flag register_globals Off

В таком случае данные get и post будут храниться в глобальных ассоциативных массивах
PHP код:
$HTTP_GET_VARS
и 
$HTTP_POST_VARS 
Для отключения неиспользуемых возможностей или их детальной кофигурации также могут пригодиться следующие директивы:
track_vars - доступность глобальных ассоциативных массивов переменных среды, сервера, get, post и cookie.
variables_order - порядок регистрации переменных среды, сервера, get, post и cookie.
register_argc_argv - переменные $argv и $argc на основе информации, поступившей методом get.
file_uploads - возможность обрабатывать закачку файлов.
Подробнее об этих и других директивах - мануал по Apache [php.ini, .htaccess].

4. Никогда не бывает лишним удостовериться в том, что данные в скрипт пришли именно с вашего сайта.
PHP код:
if(ereg'^http://' .$HTTP_HOST ,getenv ('HTTP_REFERER' ))); 
Регулярное выражение проверяет, содержится ли в HTTP_REFERER имя хоста вашего сайта. Если нет, то можно послать деморализующее сообщение в браузер и завершить работу скрипта. Но не стоит 100%но доверять такой проверке, т.к. HTTP_REFERER при большом желании злоумышленник может подделать и законспирироваться под имя хоста.

5. Ну и последний совет касается авторизации. Если кто не знает, есть программы-переборщики паролей и ими можно пытаться подобрать пароль к интерфейсу авторизации на вашем сайте. Явный тому пример - программа
Brustus AET-2. Замечательная вещь и даже во многих случаях результативная [выделенный канал + большая база словарей + несложный пароль].
Так вот, от подобных переборов в большинстве случаев тоже можно оградиться - все зависит от конкретной реализации. В любом случае защита сводится к ведению лога неудачных попыток авторизироваться. В
код авторизации добавляется следующее:
PHP код:
if( file_exists'log.txt') &amp;&ampfilesize'log.txt')&gt1024) exit; 
Т.е. до авторизации делается проверка - если существует лог неудачных авторизаций и его размер [в байтах] больше 1024, то скрипт прекращает свою работу [или выдает деморализующее сообщение ], не доходя до
самого процесса авторизации. На этом перебор у злоумышленника завершится.

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

(c) www.zeosmaster.com/
 
Ответить с цитированием

  #2  
Старый 12.09.2007, 00:42
Аватар для Sn@k3
Sn@k3
Познавший АНТИЧАТ
Регистрация: 13.04.2006
Сообщений: 1,738
Провел на форуме:
5151669

Репутация: 1198


Отправить сообщение для Sn@k3 с помощью ICQ
По умолчанию

всё знакомо =) правда я обычно на достоверность провеяю if =)
 
Ответить с цитированием

  #3  
Старый 12.09.2007, 10:48
Аватар для madnet
madnet
Умиротворенн
Регистрация: 09.12.2004
Сообщений: 996
Провел на форуме:
2386719

Репутация: 1384


Отправить сообщение для madnet с помощью ICQ
По умолчанию

блин зачем мусор собирать в разделе =(
__________________

http://madnet.name - madnet - blog | homepage (Мысли, релизы, скрипты, софт)

http://antichat.ru - Лучший сайт по безопасности
irc.antichat.ru:7771 #antichat - общение online
ГАРАНТ ФОРУМА
 
Ответить с цитированием

  #4  
Старый 12.09.2007, 16:27
Аватар для n1†R0x
n1†R0x
Постоянный
Регистрация: 20.01.2007
Сообщений: 787
Провел на форуме:
2924346

Репутация: 1719


Отправить сообщение для n1†R0x с помощью ICQ
По умолчанию

На самом-то деле, как мне кажется для фильтрации:
1. XSS достаточно использовать striptags/htmlspecialchars/htmlentities
2. SQL достаточно испольльзовать mysql_escape_string/mysql_real_escape_string
3. PHP-Include достаточно создать массив нужных файлов и / или осуществлять выборку через case.

Регулярки тоже вариант.

Кстати, во 2ом случае можно использовать функции проверки содержимого переменной, например, на присутствие только цифровых символов (is_int).

Помогает присутствие magic_quotes_gpc, фильтрацию нужно также употреблять с учетом результата выполнения функции get_magic_quotes_gpc
Защититься от заливки шелла? хм.. регулярка на расширения + список разрешенных. Ну и .htaccess настроить, запретить выполнение php для папок вроде uploads.

По поводу ошибок: error_reporting(0) спасает, хотя при грамотном стиле программирования ошибки не должны появляться.

ps: перевод строки - "\n", фильтрация "n" затронет все вхождения этого символа и слово "antichat" превратится в "atichat".

pps: все, что выше - сугубо мое личное мнение. я не претендую на звание php-программиста, занимаюсь изучением сравнительно недавно и, скорее всего, многого не знаю) Если я где-то не прав и вы меня поправите, я буду только рад)
 
Ответить с цитированием

  #5  
Старый 12.09.2007, 16:36
Аватар для Helios
Helios
Постоянный
Регистрация: 14.01.2007
Сообщений: 459
Провел на форуме:
1469995

Репутация: 589
Отправить сообщение для Helios с помощью ICQ
По умолчанию

2 n1†R0x

Мало того, что прав, так еще и в одном посте обобщил большую половину той кучи статей и талмудов, которые на эту тему написаны.
 
Ответить с цитированием

  #6  
Старый 12.09.2007, 18:00
Аватар для Piflit
Piflit
Banned
Регистрация: 11.08.2006
Сообщений: 1,522
Провел на форуме:
5128756

Репутация: 2032


Отправить сообщение для Piflit с помощью ICQ
По умолчанию

хм... не очень понял про
PHP код:
if( file_exists'log.txt') &amp;&ampfilesize'log.txt')&gt1024) exit; 
где и как должен быть создан log.txt и если его размер дойдет до 1024, остальные юзеры тоже не смогут заходить...? поясните плз
 
Ответить с цитированием

  #7  
Старый 12.09.2007, 18:22
Аватар для n1†R0x
n1†R0x
Постоянный
Регистрация: 20.01.2007
Сообщений: 787
Провел на форуме:
2924346

Репутация: 1719


Отправить сообщение для n1†R0x с помощью ICQ
По умолчанию

Цитата:
где и как должен быть создан log.txt
в папке со скриптом, строчку из которого ты продемонстрировал

"если размер лога больше 1024 байт то скрипт завершается."
exit() - аналог die()
 
Ответить с цитированием

  #8  
Старый 12.09.2007, 18:30
Аватар для Piflit
Piflit
Banned
Регистрация: 11.08.2006
Сообщений: 1,522
Провел на форуме:
5128756

Репутация: 2032


Отправить сообщение для Piflit с помощью ICQ
По умолчанию

Цитата:
Сообщение от n1†R0x  
в папке со скриптом, строчку из которого ты продемонстрировал

"если размер лога больше 1024 байт то скрипт завершается."
exit() - аналог die()
а вторая часть вопроса?
 
Ответить с цитированием

  #9  
Старый 12.09.2007, 18:33
Аватар для VDShark
VDShark
Участник форума
Регистрация: 01.02.2007
Сообщений: 286
Провел на форуме:
804931

Репутация: 526
По умолчанию

Цитата:
Сообщение от Piflit  
а вторая часть вопроса?
естественно ответ положительный или ты где то видиш там работу с ip, идентификаторами или что нибудь подобное? Никто не сможет заходить, пока лог не почистить.
 
Ответить с цитированием

  #10  
Старый 12.09.2007, 20:08
Аватар для n1†R0x
n1†R0x
Постоянный
Регистрация: 20.01.2007
Сообщений: 787
Провел на форуме:
2924346

Репутация: 1719


Отправить сообщение для n1†R0x с помощью ICQ
По умолчанию

Цитата:
Сообщение от Piflit  
а вторая часть вопроса?
что значит "как"?
если лог используется скриптом, в нем должно быть предусмотрено создание текстового файла. следовательно, программно.


Цитата:
вторая часть вопроса была про юзеров)
упс, я туплю.
да. читай ман по die / exit, работа скрипта завершается.

Последний раз редактировалось n1†R0x; 12.09.2007 в 20:28..
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Books PHP FRAGNATIC PHP, PERL, MySQL, JavaScript 186 21.02.2010 02:41
Books PSalm69 Избранное 248 27.10.2009 04:52
На PHP, как на "Новые ворота"... Mertvii-Listopad Чужие Статьи 7 18.09.2006 12:42
Безопасность в Php, Часть Iii k00p3r Чужие Статьи 0 11.07.2005 19:02
Защищаем Php. Шаг за шагом. k00p3r Чужие Статьи 0 13.06.2005 11:31



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ