Безопасность входящих данных для LIKE (SQL)
$full_search_mode и $clear_tags - два факультативных параметра. Первый заменяет * на % (для нестрого поиска), второй - над переменной выполняет функцию strip_tags.
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;
}
Зачем засовывать strip_tags внутрь функции? не проще ли использовать саму strip_tags там где это нужно? для чего нужна addCslashes????
mysql_real_escape_string тут вполне достаточно
менее быдлокодерский вариант выглядит так (хотя это тоже не образец для подражания):
{
if ($clear_tags) $sql_param = strip_tags($sql_param);
if($full_search_mode) $sql_param = str_replace('*', '%', $sql_param);
$sql_param = mysql_real_escape_string($sql_param);
return $sql_param;
}
А зачем нужна была проверка вот эта
else return false;
я вообще не понял - убрал ее.
Или просто автор не знает о существовании параметризованных запросов?
Поскольку в MySQL применяются правила экранирования в строках, применяемые в языке C (например, '\n'), необходимо дублировать все символы '\', используемые в строках функции LIKE.
Недостаточно. Поисковые запросы типа "%" не должны обрабатываться, т.к. при этом выводится содержимое всей таблицы. А экранизировать "%", "_" приходится вручную, если пользователю запрещается использовать литералы. Так что проверку длины строки вы зря в своей функции убрали))
За тем же, зачем и нужны другие функции - чтобы меньше приходилось дублировать код.
hardcase, по-моему это вы не знаете про SQL-инъекции и литералы в поисковых запросах :D
И это рассказывает человек который пишет в коде
Ну так вырезайте все невалидные символы. И вообще - вы запостили на форуме быдлокодерскую функцию и принимаете критику в штыки. Зачем вообще это например мне нужно? у меня таких умников 10 человек в отделе сидит.
Либо поясните подробнее, что вам нужно, либо я умываю руки и пишите свою [COLOR="Silver"]говно[/COLOR]функцию как хотите
И это рассказывает человек который пишет в коде
if($full_search_mode==true)
И что в этом такого? Для меня эта форма записи более читабильная. Вы уж не обижайтесь, но ваша критика ни о чем. Я прокомментировал все ваши замечания, потому что ни один из них, к сожалению, никаким боком не полезен. Вы мне ни раз помогали на этом форуме, но сейчас написали откровенный бред.
Вы не ответили на вопрос по поводу детального описания проблемы. Я так понимаю что тем самым вы говорите, что помощь вам больше не нужна?
В принципе, я получил уже достаточно комментариев.
В частности, заменить устаревшную eregi_replace на str_replace, увеличить максимальную длину запроса до 255, передвинуть проверку на длину строки в начало (для оптимизации нагрузки), так что тему можно считать закрытой. Всем спасибо.
Единственное, так и не понял - сначала нужно делать дублирование слэшей или выполнять функцию mysql_real_escape_string...
Ставьте хоть в начало хоть в конец - смысл не поменяется.
Я умываю руки. Удачи
Спасибо. Всегда ценил конструктивную критику.
У вас, видимо, какая-то личная обида на одну из функций, которую я использовал))
У вас, видимо, какая-то личная обида на одну из функций, которую я использовал))
Я уже все вам написал выше еще в первом сообщении. Если вы не читаете - это лично ваши проблемы.
Функция неверна в корне потому что решает проблему которой реально не существует. Но вы естественно старше, умнее и опытнее меня, поэтому вам виднее.