Кавычки, слеши и безопасность скриптов

Фанат

oncle terrible
Команда форума
не понял.
ты для всех решил прослешивать подчёркивания и профенты, а не только для лайка?

альтернатива - всё пихать ,как строки
хотя, конечно, может, я и неправ
 

svetasmirnova

маленький монстрик
>я считаю, что насильственное приведение типов - баловство
+1
>альтернатива?
Ещё раз: проверка ручками. Или TypeHinting
 

krafty

new Exception
сделал
function for_like_expr($param)
{
$param=for_query($param,'str');
return addcslashes($param,'%_');
}
не работает. лишний слеш добавляется еще где-то до вызова addcslashes. но где? ведь в библиотеке удаляются все слеши.

>альтернатива - всё пихать ,как строки
у меня итак в запросе все параметры заключены в кавычки. или ты не это имел ввиду?

-~{}~ 01.09.05 20:59:

2master_x
а есть в твоем механизме часть, отвечающая за экранирование спецсимволов и прочие заманухи как у меня в библиотеке. или это все у тебя работает автономно?

сорри, ошибся в объявлении функции
 

Фанат

oncle terrible
Команда форума
у master_x его код вообще не имеет отношения к базе данных.
он писал только о приёме переменных в скрипт.


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

лишний слеш добавляется
разбирайся
выводи парам на всех этапах
 

krafty

new Exception
наблюдал я за парам. сразу после применения addcslaches выскакивает по два слеша. где то проблема глубже лежит.
получается так
1 берем из гет $text=$_GET['text']
2 дальше формируем запрос "......news_text LIKE '".for_like_expr("%$text%")."'"

function for_like_expr($param)
{
$param=for_query($param,'str'); //после этого вызова %text%
return addcslashes($param,'%_'); //а вот эта функция возвращает \\%text\\%
}

ок буду разбирать дальше
 

Фанат

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

krafty

new Exception
тьфуууууу!!!!
невнимательность моя неизлечима! я сам принцип не понял. надо же использовать ф. только для пользователя. вобщем так как svetasmirnova написала. е маё перегрелся я сегодня. но все-равно пресловутый addcslashes неправильно работает.

ладно, пошел я домой наверно. всем спасибо!

-~{}~ 02.09.05 18:17:

Я постарался учесть замечания и пожелания. Вот что получилось.

Я немного изменил функцию for_query
PHP:
function for_query($param,$type,&$err)
{
    switch ($type) {
      case 'int': if (is_integer($param)) $err=0; break;
      case 'float': if (is_float($param)) $err=0; break;
      case 'date': 
        $dt_elements = explode('-',$str);
        if ((preg_match('/^[0-9]{4,4}-[0-9]{1,2}-[0-9]{1,2}$/',$str))and
            (checkdate($dt_elements[1],$dt_elements[2],$dt_elements[0]))) 
            $err=0;
      break;       
    }  
    return mysql_real_escape_string($param);
}
применяю так. при формировании запроса где нужны проверки делаем вызовы:
PHP:
$q0="SELECT * FROM news WHERE ";
////////////////////
$q1="date1>='".for_query($date1,'date',$err_sql)."' AND date1<='".for_query($date2,'date',$err_sql)."'";
/////////////
$q2=" AND header LIKE '%".for_like_expr("$header")."%'";
//собственно сам запрос
if ($err_sql==0) mysql_query($q0.$q1.$q2)
получается немного громоздко...
 

Ринат

Новичок
поясните зачем 3 переменные $q0 $q1 $q2 в данном примере, можно одной обойтись в принципе, для удобства
$q0 = "...";
$q0. = "...":
поправтье, если неправ
 

krafty

new Exception
прав! а если по сути?
кстати можно еще в библиотеку функцию добавить
function do_query($query)
{
global $err_sql;
if ($err_sql==0)
return mysql_query($query);
else {
echo "Неверные параметры запроса";
die();
}
}

только вот хотелось бы еще передавать в нее и список действий, которые нужно выполнять при ошибки (die или инклуд какой-нибудь)
 

Фанат

oncle terrible
Команда форума
ты неправильно понимаешь смысл функций is
при работе с формой они у тебя будут свистеть почём зря.
тебе надо проверять не тип, а состав, то есть нужны функции ctype
 

Ринат

Новичок
вопрос по этому моменту
PHP:
$dt_elements = explode('-',$str);
if ((preg_match('/^[0-9]{4,4}-[0-9]{1,2}-[0-9]{1,2}$/',$str))and
(checkdate($dt_elements[1],$dt_elements[2],$dt_elements[0])))
зачем preg_match, ибо если там не цифры, а строчные символы, checkdate по-любому вернет FALSE
имхо тогда лучше сначала проверять на наличие тех самый символов "-" , для последующего explode, и лимит поставить 3 (в explode=
 

Фанат

oncle terrible
Команда форума
получается немного громоздко...
а ты либо делай так:
$q="SELECT * FROM news WHERE
date1>='".mysql_real_escape_string($date1)."' AND
date1<='".mysql_real_escape_string($date2)."' AND
header LIKE '%".for_like_expr("$header")."%'";
mysql_query($q) or my_err();
либо почитай таки снова про плейсхолдеры =)
 

Фанат

oncle terrible
Команда форума
вообще, ты неправильно понял советы Светы.

проверять правильность ввода надо не перед зхапросом.
пойми, что это совершенго разные вещи.
у тебя должна быть абстрактная функция для корректного составления запросов.
Это - первое.
Вротое:
по желанию! ты можешь проверять приходящие данные и ПО СМЫСЛУ определять - корректные они или нет.
ДО запроса.
то есть, Светины советы относятся ко второму варианту.
и мешать их с запросом не надо.

-~{}~ 02.09.05 20:20:

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

$var="123";
echo is_int($var);
 

krafty

new Exception
т.е. состав - это или цифры или буквы или цифры с точкой.
а тип - это понятно. тип, скажем так, более узкое понятие.

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

по поводу ВТОРОГО (то что по-желанию). если здесь не проверять, то нужно подавить все ошибки, чтобы они не выводились в браузер

ничего не напутал?
 

Фанат

oncle terrible
Команда форума
ну все равно нужно, чтобы в запрос шли уже проверенные на состав данные
нет не нужно.
запросу - ПО БАРАБАНУ

если тебе нужно - ту и проверяй
а запрос не трожь.

по поводу ВТОРОГО (то что по-желанию). если здесь не проверять, то нужно подавить все ошибки, чтобы они не выводились в браузер
что за бред?
откуда там ошибки возьмутся?
а ошибки надо не подавлять (это идиотизм), а отключать их вывод в браузер.
 

krafty

new Exception
>откуда там ошибки возьмутся?
если какому-то идиоту захочется в адр. строке вместо num=5 написать num=s

> а отключать их вывод в браузер
я это и имел в виду

>нет не нужно. запросу - ПО БАРАБАНУ
а как же моя функция: если все правильно, то делаем запрос, если нет - то сообщение об ошибке
 
Сверху