|
|
|
| Одно из недавних обсуждений навело меня на мысль, что неплохо было бы собрать в отдельный список всё, что надо не забывать делать для обеспечения неуязвимости скрипта. Начну список сам:
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))
Что ещё? Помогите продолжить список. Давайте в этой теме не будем обсуждать и раскрывать подробно суть каждого из действий (будем создавать, если нужно отдельные темы), зато постарамемся всё-всё перечислить.
Ничего не забыть
Чтобы в итоге, если выполнено всё из списка, любой программист согласился бы, что написано полностью безопасно. | |
|
|
|
|
|
|
|
для: Eugene77
(04.12.2009 в 12:52)
| | О, как раз пункты, кот. пользуюсь я. Именно так и делаю. | |
|
|
|
|
|
|
|
для: Eugene77
(04.12.2009 в 12:52)
| | Intval() - при большом числе выдаст вам не то, что вы ожидали! | |
|
|
|
|
|
|
|
для: mihdan
(04.12.2009 в 16:55)
| | лол тут сам intval не причём | |
|
|
|
|
|
|
|
для: mihdan
(04.12.2009 в 16:55)
| | Почему? Если передавать в него строку, то он вернёт 0. Прсто делается проверка на это и всё... | |
|
|
|
|
|
|
|
для: mihdan
(04.12.2009 в 16:55)
| | Так надо думать, когда, где и что применять.
Можно же и is_numeric() использовать. | |
|
|
|
|
|
|
|
для: Eugene77
(04.12.2009 в 12:52)
| | немного не понял. для чего пункт 6? (поподробнее) | |
|
|
|
|
|
|
|
для: psychomc
(04.12.2009 в 20:30)
| | >немного не понял. для чего пункт 6? (поподробнее)
Лучше обсуждения в отдельные темы отделять.
Попросим об этом модератора!
Но смысл у
6) При подключении файлов библиотек проверять наличие секретной константы в основном скрипте.
<?
if(defined(SECRET_CODE_DEFINED_IN_ALL_MY_PHP_SCRIPTS))
|
В том, что если всё-таки как-то удастся закинуть атакующий скрипт на ваш хостинг, он не сможет подключить конфиг базы итд.
Хотелось бы услышать ещё о мерах безопасности. Чтобы потом можно было всем давать ссылку на эту тему.
И не было разночтения между мастерами в смысле понимания того, что значит писать безопасно | |
|
|
|
|
|
|
|
для: Eugene77
(05.12.2009 в 12:25)
| | >>немного не понял. для чего пункт 6? (поподробнее)
>6) При подключении файлов библиотек проверять наличие секретной константы в основном скрипте.
<?
>if(defined(SECRET_CODE_DEFINED_IN_ALL_MY_PHP_SCRIPTS))
|
>В том, что если всё-таки как-то удастся закинуть атакующий скрипт на ваш хостинг, он не сможет подключить конфиг базы итд.
Вы не делаете разницы между файлом конфигурации (с прватными данными) и файлом библиотеки (с открытым кодом) ? | |
|
|
|
|
|
|
|
для: Trianon
(05.12.2009 в 13:24)
| | На всякий случай я везде ставлю такую проверку. (И считаю её обязательной)
Если даже библиотека с открытым кодом, то я её частенько немного подправляю.
Но дело не в этом.
В библиотеке могут оказаться функции, через которые можно будет что-то наковырять про мой сайт.
Я могу это не осознавать. И даже не хочу анализировать с этих позиций их текст максимально внимательно.
Достаточно того, что .inc файлы
1) Нельзя запустить через Апачи
2) Нельзя проинклудить чужим скриптом
3) Мои .php скрипты используют их аккуратно, следя за тем, чтобы не вызывать их с без проверки аргументов (если такая проверка не предусмотрена в самих функциях библиотек) | |
|
|
|
|
|
|
|
для: Eugene77
(05.12.2009 в 14:45)
| | Почитайте сайты посвященные хакингу, много полезного узнаете. | |
|
|
|
|
|
|
|
для: 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');
}
|
Предупреждение исчезнет, и только. Читабельность, имхо, резко падает. | |
|
|
|
|
|
|
|
для: neadekvat
(05.12.2009 в 19:52)
| | Но зато, если надо добаивть еще один модуль, то придётся что-то изменять в коде... У меня все модули хранятся в БД и я проверяю с этой переменной их существование, так что лучше проверять :)
ЗЫ. Fractured#, я пнимаю, что вы супер-мега программист, но вы ИМХО уже достали порядком людей своей "крутостью". Если вы такой крутой, что вы тут делаете? | |
|
|
|
|
|
|
|
для: 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');
}
|
| |
|
|
|
|
|
|
|
для: Trianon
(05.12.2009 в 21:37)
| | За case null спасибо, даже не задумывался о таком варианте. | |
|
|
|
|
|
|
|
для: neadekvat
(05.12.2009 в 22:13)
| | Инициализация переменных в некоторых частных случаях, действительно, как бы, ненужна. Но это создаёт очень уж скользкое место. Поэтому для сколько-нибудь большого проекта можно считать инициализацию (или проверку на инициализированность) переменных обязательной.
Да и с позиций экономии времени и мышления значительно проще всё сразу иницилизировать. | |
|
|
|