Безопасность входящих данных для LIKE (SQL)

Valar

Новичок
Безопасность входящих данных для LIKE (SQL)

Большая просьба к опытными программистам, прокомментируйте мою функцию для фильтрования переменных, участвующих в поисковых SQL-запросах (LIKE)

$full_search_mode и $clear_tags - два факультативных параметра. Первый заменяет * на % (для нестрого поиска), второй - над переменной выполняет функцию strip_tags.

PHP:
function A_ProtectSqlSearchParam($sql_param, $full_search_mode="", $clear_tags="")
	{
	if ($clear_tags==true) $sql_param=strip_tags($sql_param);

	$sql_param=str_replace('\\','\\\\', $sql_param);
	$sql_param=addCslashes($sql_param, '_%');

	if ($full_search_mode==true) $sql_param=eregi_replace("\*", '%', $sql_param);

	$sql_param=mysql_real_escape_string($sql_param);

	if (strlen($sql_param)>3 and strlen($sql_param)<100) return $sql_param;
	else return false;
	}
 

King

Новичок
1. Вы не учитываете режим magic_quotes_gpc. Отсюда, очевидно, Вы по незнанию пишите такое:
PHP:
$sql_param=str_replace('\\','\\\\', $sql_param);
Так писать нельзя, Вы гробите строку.

2. eregi_replace(), во-первых, устарела (теперь желательно использовать PCRE), во-вторых, используйте str_replace().

3. Удаление тегов — довольно странная вещь, которая никоим образом не относится к правильной обработке поступающих данных. Скорее наоборот.

4. Не надо проверять длину строки.

P.S. Не стоит путать полнотекстовый поиск и поиск через LIKE.
 

Фанат

oncle terrible
Команда форума
нормальная, вроде, функция. только при чем тут strip_tags - непонятно.
и зачем ерегом заменять звезду на процент. чем обычный str_replace не устроил?
для оформления кода на форуме служит не тег
, а тег
PHP:
[b]fixxxer[/b], да читал он наверняка. если бы он сам писал, то у него слеши бы тоже любимый всеми ламерами ereg заменял. потому что в каком-то тыща деватьсот бородатом году какой-то умник написал, что стр_реплейс работает некорректно. и все составители руководств для чайников это до сих пор копируют.

[b]King[/b], сдается мне, что твоя квалификация не сильно соответствует темам, в которые ты берешься отвечать.
 

King

Новичок
King, сдается мне, что твоя квалификация не сильно соответствует темам, в которые ты берешься отвечать.
Мне сдаётся ты много любишь говорить в чей-либо адрес без какого-либо конструктивизма. Ты бы сказал, что тебе не понравилось в ответе.

P.S. Называть эту функцию, «вроде», нормальной тоже наводит на мысли. Ты вот этот кусок:
PHP:
$sql_param=str_replace('\\','\\\\', $sql_param);
как бы «нормальным» называешь? Зачем тут экранировать бекслеш?
То, что сначала экранируются «%» и «_», а далее применяется mysql_escape_real_string() -- тоже нормально?
 

Фанат

oncle terrible
Команда форума
затем, что так написано в мануале.
про процент правильно заметил, молодец, внимательный.

-~{}~ 28.04.09 15:03:

аффтар, вот это замечание имей в виду. хотя бы копировать научись нормально.

addCslashes должно идти ПОСЛЕ mysql_real_escape_string
 

Valar

Новичок
1. Вы не учитываете режим magic_quotes_gpc. Отсюда, очевидно, Вы по незнанию пишите такое:
В начале скрипта магические кавычки отключается, извиняюсь - забыл сказать :)

2. eregi_replace(), во-первых, устарела (теперь желательно использовать PCRE), во-вторых, используйте str_replace().
Спасибо :)


3. Удаление тегов — довольно странная вещь, которая никоим образом не относится к правильной обработке поступающих данных. Скорее наоборот.
Удаление тегов - факультативный параметр в функции. Просто, он нужен для некоторых случаев.

4. Не надо проверять длину строки.
Минимальная длина должна быть, все-таки. Почти на всех скриптах она установлена - не менее 3-4 символов. Чтобы была меньшая нагрузка на сервер. Не говоря уже об исключениях запросов аля "%".


P.S. Называть эту функцию, «вроде», нормальной тоже наводит на мысли. Ты вот этот кусок:$sql_param=str_replace('\\','\\\\', $sql_param);
Читаем из документации к php:
Поскольку в MySQL применяются правила экранирования в строках, применяемые в языке C (например, '\n'), необходимо дублировать все символы '\', используемые в строках функции LIKE.

аффтар, вот это замечание имей в виду. хотя бы копировать научись нормально.
Если бы я скопировал эту функцию, то не создавал бы тему.

addCslashes должно идти ПОСЛЕ mysql_real_escape_string
Не буду спорить. В документации я читал обратное и в таком порядке она отлично работает.
 

Фанат

oncle terrible
Команда форума
где ты читал обратное? если читал, то почему не будешь спорить?
для предыдущего ты привел цитату. а для этого где?
 
Сверху