@okha22

Экранирование sql запросов, достаточно ли функции?

Всем хаю-хай =)

Ребят, созрел такой вопрос, относительно экранирования при выполнении sql запросов в БД, ниже предоставлю самописную функцию. Будет ли достаточно данной функции, для защиты от инъекции? Либо это все лажа перед подготовленными запросами?

function formatstr($str) 
{
	global $rows, $db;
    $str = trim($str);
    $str = stripslashes($str);
    $str = htmlspecialchars($str);
	$str = $db->real_escape_string($str);
    return $str;
}
  • Вопрос задан
  • 275 просмотров
Решения вопроса 2
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Эта функция не самописная, а цельнотянутая. Причем из самых смрадных помоек интернета.
К защите от инъекций не имеет вообще никакого отношения.

- trim() ни к инъекциям, ни к защите отношения не имеет
- stripslashes() просто бессмысленная функция, которая только портит данные
- htmlspecialchars() не имеет отношения к SQL. Применяется при выводе данных, а не при получении
- real_escape_string() - единственная функция, которая имеет отношение к SQL, но при этом вообще не предназначенная ни для каких защит.

Попробуйте на основании этой информации самостоятельно оценить полезность вашей функции.

Возьмем классический пример
$_GET['id'] = '1;DROP TABLE Students;';
$id = formatstr($_GET['id']);
$sql = "SELECT * FRPM Students WHERE id=$id";

И посмотрим, помогло ли ваше самописное экранирование предотвратить хоть что-то (спойлер: нет).
(да, та функция, которую лично вы используете для выполнения запросов, выполняет только один запрос за раз. И вместо инъекции вы получите ошибку. Но это не отменяет сам факт получения инъекции.)

Как правильно все отметили выше, для защиты от инъекций используются подготовленные запросы, в которых все переменные заменяются на специальные маркеры, и передаются отдельно.
Ответ написан
Compolomus
@Compolomus Куратор тега PHP
Комполом-быдлокодер
Пригласить эксперта
Ответы на вопрос 1
Adamos
@Adamos
Самописные "защиты от инъекций" вследствие непонимания автором того, что он вообще делает, обычно убивают двух зайцев сразу.
И оставляют дыру в безопасности, и портят данные в базе.
Для реальной защиты подготовленного запроса, как правило, достаточно. Но если очень постараться, дырку можно проделать и в нем.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы