Сервер принимает данные, в которые легко можно записать любой скрипт или попробовать пробится через защиту на сервере или БД кавычками. Я пытаюсь закрыть все уязвимости максимально чисто, но при этом есть два условия:
- Кавычки и переносы строк нужно оставить. При этом переносы строк идут из textarea, так что там будет происходить замена
\nна<br>. - При проверке на пустое содержимое поля - поле только с символами, то есть кавычки или точки не должны проходить проверку и ответ будет "поле пустое".
В начале скрипта у меня установлена функция, зачищающая массив $_POST от лишнего, выглядит примерно так:
function quote_clear($data) {
$data = str_replace("\n", '<br>', $data);
$data = strip_tags($data, '<br>');
$data = htmlspecialchars($data, ENT_QUOTES);
return $data;
}
function quote($var) {
foreach ($var as $row) {
if(is_array($row)) {
foreach($row as $row2) {
$row2 = quote_clear($row2);
}
} else {
$row = quote_clear($row);
}
}
return $var;
}
Но в комментариях сказали что в базу обычно передают реальные данные, со всеми тегами, кавычками и чем либо другим. Я вижу своеобразную пользу от этого теперь, но я не понимаю как тогда работает защита в этом случае.
То есть мы убираем мою функцию зачистки, а в базу теперь может попасть что угодно, а SQL иньекции прямо ждут захвата мира. Я уже начитался топиков с гениальными советами "каждой переменной своя защита", и ниодного примера в придачу.
На сайте лежит форма в которой есть:
- input(text) - для E-mail, мобильного телефона, имени заказчика, ссылок и так далее.
- input(checkbox) - очевидно просто выбор категорий которые заказчик хочет включить в запрос.
- textarea - комментарии к каждой категории, выбранной в checkbox.
Полагаю что любой из этих input может быть исправлен на клиенте, значит ко всем нужно привести определенные меры безопасности. Изначально я думал что если удалить все специальные символы, теги и экранизировать все что осталось то будет максимально безопасно, а главное универсально, но теперь я не понимаю что такое збезопасность вообще.
Не могли бы вы подсказать пример защиты данных в моем случае? Я использую mysqli.
Благодарю за внимание.
htmlspecialchars. – yeputons May 31 '17 at 15:27htmlspecialchars_decode) html код что остался и вот мы ничего важного не потеряли. (вроде как) – Telion May 31 '17 at 15:35$_POST = quote($_POST);и чистит все что мне не нужно, после чего я планирую добавить это в БД. Так что же я делаю не так? – Telion May 31 '17 at 16:07<script>alert(1);</script>"; drop table questions; --— то он так и должен храниться в БД и ничего не должно вырезаться. Как видите, stackoverflow мой комментарий сохранил и ничего в нём не вырезал, но при этом никакого написанного мной кода не выполнилось :) К этому и нужно стремиться. – andreymal May 31 '17 at 16:49mysqli_real_escape_stringили какие-то другие методы или тут вообще есть какой-то магический неизвестный мне способ? А так, пользователи своих сообщений больше не увидят, их будет отправлено администраторам на рассмотрение. Но я полагаю в сохранении всей информации есть некая польза, так что посмотрим.. – Telion May 31 '17 at 17:16