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

Форум PHP

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

 

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

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

тема: Как писать неуязвимо?
 
 автор: Eugene77   (04.12.2009 в 12:52)   письмо автору
 
 

Одно из недавних обсуждений навело меня на мысль, что неплохо было бы собрать в отдельный список всё, что надо не забывать делать для обеспечения неуязвимости скрипта. Начну список сам:

1) При выводе на страницу надо пропускать строки через htmlspesialchars()
2) При записи в базу -> mysql_real_escape_string() или Intval() и кавычки
3) Инициализировать переменные
4) Закрывать через .htaccess доступ к папкам со вспомогательными файлами .inc
5) Использовать move_uploaded_files() вместо copy()
6) При подключении файлов библиотек проверять наличие секретной константы в основном скрипте. if(defined(SECRET_CODE_DEFINED_IN_ALL_MY_PHP_SCRIPTS))

Что ещё? Помогите продолжить список. Давайте в этой теме не будем обсуждать и раскрывать подробно суть каждого из действий (будем создавать, если нужно отдельные темы), зато постарамемся всё-всё перечислить.
Ничего не забыть
Чтобы в итоге, если выполнено всё из списка, любой программист согласился бы, что написано полностью безопасно.

  Ответить  
 
 автор: Thrasher   (04.12.2009 в 12:54)   письмо автору
 
   для: Eugene77   (04.12.2009 в 12:52)
 

О, как раз пункты, кот. пользуюсь я. Именно так и делаю.

  Ответить  
 
 автор: mihdan   (04.12.2009 в 16:55)   письмо автору
 
   для: Eugene77   (04.12.2009 в 12:52)
 

Intval() - при большом числе выдаст вам не то, что вы ожидали!

  Ответить  
 
 автор: Fractured#   (04.12.2009 в 17:58)   письмо автору
 
   для: mihdan   (04.12.2009 в 16:55)
 

лол тут сам intval не причём

  Ответить  
 
 автор: DEM   (04.12.2009 в 18:14)   письмо автору
 
   для: mihdan   (04.12.2009 в 16:55)
 

Почему? Если передавать в него строку, то он вернёт 0. Прсто делается проверка на это и всё...

  Ответить  
 
 автор: neadekvat   (04.12.2009 в 20:13)   письмо автору
 
   для: mihdan   (04.12.2009 в 16:55)
 

Так надо думать, когда, где и что применять.
Можно же и is_numeric() использовать.

  Ответить  
 
 автор: psychomc   (04.12.2009 в 20:30)   письмо автору
 
   для: Eugene77   (04.12.2009 в 12:52)
 

немного не понял. для чего пункт 6? (поподробнее)

  Ответить  
 
 автор: Eugene77   (05.12.2009 в 12:25)   письмо автору
 
   для: psychomc   (04.12.2009 в 20:30)
 

>немного не понял. для чего пункт 6? (поподробнее)
Лучше обсуждения в отдельные темы отделять.
Попросим об этом модератора!
Но смысл у
6) При подключении файлов библиотек проверять наличие секретной константы в основном скрипте.
<? 
if(defined(SECRET_CODE_DEFINED_IN_ALL_MY_PHP_SCRIPTS))

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

Хотелось бы услышать ещё о мерах безопасности. Чтобы потом можно было всем давать ссылку на эту тему.
И не было разночтения между мастерами в смысле понимания того, что значит писать безопасно

  Ответить  
 
 автор: Trianon   (05.12.2009 в 13:24)   письмо автору
 
   для: Eugene77   (05.12.2009 в 12:25)
 

>>немного не понял. для чего пункт 6? (поподробнее)
>6) При подключении файлов библиотек проверять наличие секретной константы в основном скрипте.
<? 
>if(defined(SECRET_CODE_DEFINED_IN_ALL_MY_PHP_SCRIPTS))

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

Вы не делаете разницы между файлом конфигурации (с прватными данными) и файлом библиотеки (с открытым кодом) ?

  Ответить  
 
 автор: Eugene77   (05.12.2009 в 14:45)   письмо автору
 
   для: Trianon   (05.12.2009 в 13:24)
 

На всякий случай я везде ставлю такую проверку. (И считаю её обязательной)
Если даже библиотека с открытым кодом, то я её частенько немного подправляю.
Но дело не в этом.
В библиотеке могут оказаться функции, через которые можно будет что-то наковырять про мой сайт.
Я могу это не осознавать. И даже не хочу анализировать с этих позиций их текст максимально внимательно.
Достаточно того, что .inc файлы
1) Нельзя запустить через Апачи
2) Нельзя проинклудить чужим скриптом
3) Мои .php скрипты используют их аккуратно, следя за тем, чтобы не вызывать их с без проверки аргументов (если такая проверка не предусмотрена в самих функциях библиотек)

  Ответить  
 
 автор: sim5   (05.12.2009 в 14:57)   письмо автору
 
   для: Eugene77   (05.12.2009 в 14:45)
 

Почитайте сайты посвященные хакингу, много полезного узнаете.

  Ответить  
 
 автор: neadekvat   (05.12.2009 в 19:52)   письмо автору
 
   для: Eugene77   (04.12.2009 в 12:52)
 

> 3) Инициализировать переменные
Это разве так страшно? В чем тут уязвимость?
Вот, к примеру, код:
<?php
switch ($_GET['act']) {
 case 
'files': include ('files.php'); break;
 case 
'news': include ('news.php'); break;
 default: include (
'main.php');
}


Согласитесь, $_GET['act'] может отсутствовать в принципе, интерпретатор при определенном уровне ошибок выведет предупреждение о несуществующей переменной, однако скрипт удачно продолжит работу и сделает то, что предписывает делать switch по дефолту.
Или вы предложите это?
<?php
if (isset ( $_GET{'act'] ) ) {
 switch (
$_GET['act']) {
  case 
'files': include ('files.php'); break;
  case 
'news': include ('news.php'); break;
 }
} else {
 include (
'main.php');
}

Предупреждение исчезнет, и только. Читабельность, имхо, резко падает.

  Ответить  
 
 автор: DEM   (05.12.2009 в 21:18)   письмо автору
 
   для: neadekvat   (05.12.2009 в 19:52)
 

Но зато, если надо добаивть еще один модуль, то придётся что-то изменять в коде... У меня все модули хранятся в БД и я проверяю с этой переменной их существование, так что лучше проверять :)

ЗЫ. Fractured#, я пнимаю, что вы супер-мега программист, но вы ИМХО уже достали порядком людей своей "крутостью". Если вы такой крутой, что вы тут делаете?

  Ответить  
 
 автор: Trianon   (05.12.2009 в 21:37)   письмо автору
 
   для: neadekvat   (05.12.2009 в 19:52)
 

Если Вы заранее в курсе, что переменная GET['act'] может быть не задана, то самое разумное - обработать это явно :

<?php
switch (@$_GET['act']) 
{
 case 
'files': include ('files.php'); break;
 case 
'news':  include ('news.php');  break;
 case   
null:  include ('main.php');  break;
 default:      exit(
'incorrect act value');

  Ответить  
 
 автор: neadekvat   (05.12.2009 в 22:13)   письмо автору
 
   для: Trianon   (05.12.2009 в 21:37)
 

За case null спасибо, даже не задумывался о таком варианте.

  Ответить  
 
 автор: Eugene77   (06.12.2009 в 12:27)   письмо автору
 
   для: neadekvat   (05.12.2009 в 22:13)
 

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

  Ответить  
Rambler's Top100
вверх

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