kemply
@kemply
школьник

Правильная ли защита от XSS и SQL?

Каждый раз, при добавлении записей в БД, приходилось проверять его на SQL инъекцию. А на XSS делать постоянно.

Решил сделать простой метод. Вставить этот код в самое начало всего
З.Ы. Оставил комментарии, чтобы не вникать:
function saveArray($arr){ // Функция для защиты от XSS и SQL
  $r = array(); // Создать массив для возврата

  foreach ($arr as $k => $v){ // Для каждого элемента в массиве для фильрации
    if( strstr($k, 'no-save') ) // Если у ключа массива есть слово 'no-save' 
      continue; // перейти к следующему
    if( $v == "" ){ // Если пустое значение
       $r[$k] = false; // то значение равен false
       continue; // К следующему
    }
    if( ctype_digit($v) ){ // Если все символы в строке - цифра
      $r[$k] = (int) $v; // перевести в тип int
      continue; // К следующему
    }
    if( is_array($v) ){ // Если это массив
      $r[$k] = saveArray($v); // провести через функцию
      continue; // К следующему
    }
    $arr[$k] = htmlspecialchars($v); // Иначе убрать все HTML символы
  }

  return $r; // Вернуть массив
}

$_GET = saveArray($_GET); // Фильтрация $_POST
$_POST = saveArray($_POST); // Фильтрация $_GET


Можно ли это считать "правильным" и использовать его на реальных проектах?
Или все же есть недостатки, из-за чего лучше не стоит это делать?
  • Вопрос задан
  • 446 просмотров
Решения вопроса 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
раньше в PHP этот кусок "бесполезностей" был из коробки, назывался magic quotes.

1) от SQL иньекций спасает prepared statements

2) XSS надо фильтровать при выводе информации а не при вводе, ибо всеравно остается вероятность что-то упустить.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Stalker_RED
@Stalker_RED
// Если все символы в строке - цифра
// перевести в тип int
таким образом можно повредить строки из цифр с нулями в начале
Ответ написан
Комментировать
Akdmeh
@Akdmeh
PHP, Yii2, Music
Массовые проверки - зло. Есть всегда возможность что-то упустить.
Изучайте filter_var, htmlspecialchars делайте исключительно при выводе; используйте исключительно Prepared statements.
Правила валидации входящих данных вы должны всегда указывать вручную, тогда вы будете значить, что применили необходимый фильтр.
ctype_digits вообще не подходит.
В качестве шортката давным давно использую $var=abs(intval($var));
На выходе получаем положительное число, либо ноль. Работает железобетонно.
С небольшими изменениями можно сделать и с abs(floatvar(($var));
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Ведисофт Екатеринбург
от 25 000 ₽
YCLIENTS Москва
от 200 000 до 350 000 ₽
Бюро Цифровых Технологий Санкт-Петербург
от 120 000 до 180 000 ₽
03 мая 2024, в 18:59
2500 руб./за проект
03 мая 2024, в 18:52
15000 руб./за проект