PHP, проверка входящих данных
- На сайте все данные, которые передаются через POST и GET состоят из русских и английских букв, цифр и символов тире, нижнее подчеркивание, точка, собака. Для защиты от MySQL inject, XSS, и прочих атак, будет ли достаточно в начале скрипта отфильтровать массивы $_POST и $_GET регуляркой?
preg_replace("/[^А-Яа-яA-Za-z0-9-_.@]/u", '', $str);
- Правильно ли составлена регулярка?
Ответы (2 шт):
Автор решения: Alexey
→ Ссылка
Вот мой вариант:
class security {
private function clearArray($array) {
if(is_array($array)) {
foreach ($array as $key => $value) {
if(is_array($array[$key])) {
security::clearArray($array[$key]);
} else {
$array[$key] = htmlspecialchars($value, ENT_QUOTES);
}
}
return $array;
} else {
return false;
}
}
public function clearInput($array) {
return security::clearArray($array);
}
}
$obj = new security;
$get = $obj->clearInput($_GET);
$post = $obj->clearInput($_POST);
Еще можно экранировать строку так...
$get = array_map(array($mysqli, 'real_escape_string'), $_GET);
$post = array_map(array($mysqli, 'real_escape_string'), $_POST);
...но здесь требуется идентификатор соединения, т.е...
$mysqli = new mysqli(DB_HOST, DB_UNAME, DB_PASS, DB_NAME);
Или если хочешь экранировать конкретную строку, то как вариант...
$firstname = $mysqli -> real_escape_string($_POST['firstname']);
Автор решения: Sergei Kirjanov
→ Ссылка
Такие универсальные решения -- лучше чем ничего. Но опираться я бы на них не стал. Даже из этих символов можно кое-что скомбинировать.
От конкретно sql-injection защищают prepared statements. Не склеивайте ничего в запрос. Бинд-ите.
Если встречается странный символ, я бы предпочел не вырезать его молча, а явно бросать ошибку с сообщением о причине. А то через пол года будете отлаживаться пол дня и гадать, почему всё так странно работает.