HellWalk
Новичок
Скажу сразу - статей на данную тематику перечитал огромное количество но нигде не встретил перечня всех необходимых действий, которые гарантировали бы (хотя бы с вероятностью 99.99%) защищенность сайта. Много приводится примеров как не надо делать, но как надо - крайне мало, к тому же советы как надо различаются на разных сайтах, и новичку сложно понять, какой же способ наиболее правильный.
1. Проверка входящих данных (бд: MySQL)
Где-то около полугода назад, когда узнавал про sql инъекции, встретил такую рекомендуемую конструкцию для добавления данных в бд (MySQL):
Является ли этот способ защищенным? Наилучшим? Защитит ли он от всех sql инъекций?
2. Защита GET-запросов.
Как оказалось, приведенного выше способа недостаточно. Например, мы ожидаем в $_GET['p'] получить номер страницы, если же передать туда массив site.ru/post.php?p[] - то страница откроется с ошибкой:
Warning: preg_match() expects parameter 2 to be string, array given in /var/www/***/index.php on line #
Мне сказали, что таких ошибок быть не должно - необходима дополнительная фильтрация входящих данных.
2.1 Если принимаем только число, то фильтровать на наличие лишних символов просто:
Все правильно?
2.2 Если вводятся некоторый перечень заведомо известных слов, я делаю так:
Правильно?
А как быть, если мы не знаем заведомо какие данные будут переданы (текст, цифры), но обработать их нужно?
2.3 Чтобы проверить, не передается ли массив там, где должна быть строка, проверяем так:
Правильно?
Нужно ли делать какие-либо другие проверки?
3. Защита выводимых данных
Так как пользователи могут передать в базу HTML код или JS код, данные надо "обезвреживать" при выводе (как мне объяснили, именно при выводе, а не вводе).
Вопросов появляется два: 1) какие именно символы необходимо преобразовывать? Знаки < >, и все? И какой способ наилучший?
Я делаю так:
Это наилучший способ?
4. Защита от спам-запросов
Например от постоянных переборов паролей, или постоянных запросов в поиск (чем можно сильно загрузить сервер), этой темой пока не интересовался - какие можете посоветовать способы (желательно сразу с примерами) защиты в этом случае?
P.S.
Есть ли другие области, в которых необходимо защищать сайт? Например как правильно обрабатывать принимаемые файлы, или что-либо еще в этом плане.
1. Проверка входящих данных (бд: MySQL)
Где-то около полугода назад, когда узнавал про sql инъекции, встретил такую рекомендуемую конструкцию для добавления данных в бд (MySQL):
Код:
$queryString = 'INSERT INTO NameTable '.
'(column1, column2, column3) '.
'VALUES (?, ?, ?)';
if ($stmt = $this->DB->prepare($queryString)) {
$stmt->bind_param(
"iis",
$value1,
$value2,
$value3
);
$stmt->execute();
2. Защита GET-запросов.
Как оказалось, приведенного выше способа недостаточно. Например, мы ожидаем в $_GET['p'] получить номер страницы, если же передать туда массив site.ru/post.php?p[] - то страница откроется с ошибкой:
Warning: preg_match() expects parameter 2 to be string, array given in /var/www/***/index.php on line #
Мне сказали, что таких ошибок быть не должно - необходима дополнительная фильтрация входящих данных.
2.1 Если принимаем только число, то фильтровать на наличие лишних символов просто:
Код:
$page = (int)$_GET['p'];
2.2 Если вводятся некоторый перечень заведомо известных слов, я делаю так:
Код:
if (isset($_GET['category'])) {
if ($_GET['category'] == 'news') {
$pages['category'] = 1;
}
elseif ($_GET['category'] == 'articles') {
$pages['category'] = 2;
}
elseif ($_GET['category'] == 'guides') {
$pages['category'] = 3;
}
elseif ($_GET['category'] == 'mods') {
$pages['category'] = 4;
}
elseif ($_GET['category'] == 'other') {
$pages['category'] = 5;
}
elseif ($_GET['category'] == 'cheats-codes') {
$pages['category'] = 7;
}
elseif ($_GET['category'] == 'cybersport') {
$pages['category'] = 8;
}
elseif ($_GET['category'] == 'interview') {
$pages['category'] = 9;
}
else {
$pages['category'] = 'all';
}
}
else {
$pages['category'] = 'all';
}
А как быть, если мы не знаем заведомо какие данные будут переданы (текст, цифры), но обработать их нужно?
2.3 Чтобы проверить, не передается ли массив там, где должна быть строка, проверяем так:
Код:
if (is_array($list))
{
// пришел массив вместо строки - возвращаем ошибку
}
else
{
// пришла строка, обрабатываем запрос
}
Нужно ли делать какие-либо другие проверки?
3. Защита выводимых данных
Так как пользователи могут передать в базу HTML код или JS код, данные надо "обезвреживать" при выводе (как мне объяснили, именно при выводе, а не вводе).
Вопросов появляется два: 1) какие именно символы необходимо преобразовывать? Знаки < >, и все? И какой способ наилучший?
Я делаю так:
Код:
$Comment = str_replace(array("<", ">"), array("<", ">"), $Comment);
4. Защита от спам-запросов
Например от постоянных переборов паролей, или постоянных запросов в поиск (чем можно сильно загрузить сервер), этой темой пока не интересовался - какие можете посоветовать способы (желательно сразу с примерами) защиты в этом случае?
P.S.
Есть ли другие области, в которых необходимо защищать сайт? Например как правильно обрабатывать принимаемые файлы, или что-либо еще в этом плане.