Защита от SQL инъекций

Написал небольшую функцию на PHP:

function sql_guard($method, $query, $type)
{
	if ($method == 'POST')
		$safe_text = ($type == 'int') ? intval($_POST["$query"]) : addslashes($_POST["$query"]);
	elseif ($method == "GET")
		$safe_text = ($type == 'int') ? intval($_GET["$query"]) : addslashes($_GET["$query"]);
	else
		$safe_text = ($type == 'int') ? intval($_REQUEST["$query"]) : addslashes($_REQUEST["$query"]);

	return $safe_text;
}


Применяется так:
$var1 = sql_guard('POST', 'input1');
$var2 = sql_guard('POST', 'input2', 'int');


Думаю, что она делает объяснять не стоит. А теперь, собственно, у меня вопрос о целесообразности использования такой функции. Не проще ли (а может быть правильнее) делать addslashes или intval в самом теле запроса? Или это дело вкуса?

Также хотелось бы узнать, какие еще способы защиты от инъекций нужно использовать. Да и вообще, общие советы по безопасности.
  • Вопрос задан
  • 5513 просмотров
Решения вопроса 1
DevMan
@DevMan Куратор тега PHP
Откройте для себя PDO и placeholders.
Ответ написан
Пригласить эксперта
Ответы на вопрос 5
@niko83
Никак не соглашусь с вашей строкой «Думаю, что она делает объяснять не стоит».
Мой комментарий может не совсем по теме вопроса, но всё же код прокомментирую: функция ужасна. Не смотря на то что в функции 10 строк, на входе она берёт 3 аргумента, имеются конструкции elseif, используются два вида кавычек в том числе такие штуки $_GET["$query"], три тернарных оператора

Программа написанная в таком стиле вызывает ОЧЕНЬ большие трудности с её понимаем.

кроме того
строка $var1 = sql_guard('POST', 'input1'); вызовет ошибку.

PS: читайте Макконнелла «Совершенный код»
Ответ написан
Zazza
@Zazza
сервер без pdo очень странная штука, нужно ли такое чудо?
Ответ написан
@resurection
Если заменить запись
$var2 = sql_guard('POST', 'input2', 'int');
на
$var2 = (int) sql_guard('POST', 'input2'); // эта конструкция короче на одну запятую

то вашу ф-цию можно будет сократить в 2 раза выкинув все тернарные условия.

А ещё можно заменить:
$var1 = sql_guard('POST', 'input1');
на
$var1 = sql_guard($POST['input1']);

Тогда ваша ф-ция превратится в алиас и будет содержать всего один вызов addSlashes или mysql_real_escape_string
Ответ написан
zexel
@zexel
mysql_real_escape_string
intval
Только этими функциями пользоваться нужно, intval для цифр, а вот mysql_real_escape_string для всех остальных видов… даю гарантии что подобным образом не будет sql injection
Ответ написан
— Все данные, которые не должны содержать кавычек, режу фильтрацией по белому списку.
— Данные, которые могут быть с кавычками и которые могут быть порезаны фильтрацией, обрабатываю функцией mysql_real_escape_string.

В вашем методе возможны проблемы с кодировкой.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы