Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Отличие в плане безопасности

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
RickMan
Отправлено: 15 Декабря, 2012 - 19:20:18
Post Id


Участник


Покинул форум
Сообщений всего: 1033
Дата рег-ции: Май 2012  


Помог: 30 раз(а)




Здравствуйте, не подскажете чем отличаются эти две строки?

1.
PHP:
скопировать код в буфер обмена
  1. mysql_query("UPDATE `table` SET `var`='".$_POST['var']."'   ");


2.
PHP:
скопировать код в буфер обмена
  1. $var=$_POST['var'];
  2. mysql_query("UPDATE `table` SET `var`='".$var."'   ");


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

(Отредактировано автором: 15 Декабря, 2012 - 19:20:41)

 
 Top
AlexAnder
Отправлено: 15 Декабря, 2012 - 19:27:43
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 915
Дата рег-ции: Авг. 2012  
Откуда: Россия


Помог: 34 раз(а)




PHP:
скопировать код в буфер обмена
  1. if(isset($_POST['var']))
  2. {
  3.     $var=mysql_real_escape_string($_POST['var']);
  4.     mysql_query("UPDATE `table` SET `var`='$var'");
  5. }

(Отредактировано автором: 15 Декабря, 2012 - 19:27:54)



-----
Оказывается, недостаточно читать справочники, чтобы правильно писать коды. sadex ©

Форумы стали местом обучения программированию, а не решения трудных вопросов. KingStar ©
 
 Top
OrmaJever Модератор
Отправлено: 15 Декабря, 2012 - 19:35:24
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




RickMan пишет:
Меня интересует разница в плане безопасности....по всем мануалам первый вариант категорически запрещен, а правильный второй...Но чем отличаются они, если все что в посте, помещается в другую переменную и она же идет в запрос?? Не подскажете?

Ничем, оба не безопастны Подмигивание Правельный вариант уже написали выше.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
KingStar
Отправлено: 15 Декабря, 2012 - 19:36:29
Post Id



Участник


Покинул форум
Сообщений всего: 1889
Дата рег-ции: Авг. 2011  
Откуда: Беларусь


Помог: 69 раз(а)




Правильный вариант перейти на MySQLi или PDO Язычок


-----
То что программа работает, не означает что она написана правильно!
 
 Top
RickMan
Отправлено: 15 Декабря, 2012 - 19:58:38
Post Id


Участник


Покинул форум
Сообщений всего: 1033
Дата рег-ции: Май 2012  


Помог: 30 раз(а)




Ну MYSQLI и PDO я наслышан но тут вопрос именно по MYSQL... про mysql_real_escape_string я понял, а возможно сделать так: в файле коннекта к базе прописать:


PHP:
скопировать код в буфер обмена
  1. function format_string(&$string){
  2.         return  mysql_real_escape_string($string);       
  3. }
  4.  
  5. array_walk($_REQUEST,"format_string");
  6. array_walk($_POST,"format_string");
  7. array_walk($_GET,"format_string");


В итоге все переменные гет и пост пройдут эту фильтрацию и вполне возможно сделать:

PHP:
скопировать код в буфер обмена
  1. mysql_query("UPDATE `table` SET `var`='".$_POST['var']."'   ");


Так нормально или нет?
 
 Top
LIME
Отправлено: 15 Декабря, 2012 - 20:17:44
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




KingStar и что?
код тс в pdo станет безопасным?


Отредактировано администратором: EuGen, 15 Декабря, 2012 - 20:26:56
Прошу относиться ко всем участникам конференции с уважением. Устное предупреждение
 
 Top
KingStar
Отправлено: 15 Декабря, 2012 - 20:48:37
Post Id



Участник


Покинул форум
Сообщений всего: 1889
Дата рег-ции: Авг. 2011  
Откуда: Беларусь


Помог: 69 раз(а)




LIME вообще-то это был сарказм, если в голове нет - то здесь ничто не поможет (((
(Добавление)
и судя по "Отредактировано администратором" и тебе того же, тем же, и по тому же месту Хм


-----
То что программа работает, не означает что она написана правильно!
 
 Top
Bio man
Отправлено: 15 Декабря, 2012 - 20:50:14
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




LIME, prepared statements и param binding сделает код более безопасным от инъекций чем всякие escape_string.

RickMan а почему бы не просто
PHP:
скопировать код в буфер обмена
  1. array_walk($_REQUEST,"mysql_real_escape_string");
  2. array_walk($_POST,"mysql_real_escape_string");
  3. array_walk($_GET,"mysql_real_escape_string");
?
 
 Top
DeepVarvar Супермодератор
Отправлено: 15 Декабря, 2012 - 20:55:15
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




RickMan пишет:
В итоге все переменные гет и пост пройдут эту фильтрацию
А потом вдруг где-нибудь выяснится, что понадобилось реальное не эскейпнутое значение какого-либо ключа. Что тогда делать будете?
 
 Top
armancho7777777 Супермодератор
Отправлено: 15 Декабря, 2012 - 20:55:22
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




Bio man пишет:
а почему бы не просто

Чтобы изменились значения элементов массива, надо их передавать в функцию (которая передаётся в array_walk() вторым аргументом) по ссылке.
 
 Top
Bio man
Отправлено: 15 Декабря, 2012 - 20:58:31
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




armancho7777777, в доки не смотрел, но логика подсказывает, что array_walk принимает
0. замикание
1. callable ф-цию одного аргумента, или просто имя ф-ции

так почему же? если можно передать "trim" то почему нельзя "mysql_real_escape_string"?

PS, глянул в доки, массив и так по ссылке передается.
(Добавление)
ладно, понял свою ошибку. но все же странно это...

(Отредактировано автором: 15 Декабря, 2012 - 21:00:01)

 
 Top
RickMan
Отправлено: 15 Декабря, 2012 - 21:10:39
Post Id


Участник


Покинул форум
Сообщений всего: 1033
Дата рег-ции: Май 2012  


Помог: 30 раз(а)




DeepVarvar пишет:
RickMan пишет:
В итоге все переменные гет и пост пройдут эту фильтрацию
А потом вдруг где-нибудь выяснится, что понадобилось реальное не эскейпнутое значение какого-либо ключа. Что тогда делать будете?


я думаю это единичный случай от силы...если такое нужно будет то тогда в функции format_string пропишу проверку на переменную и не буду её фильтровать...зато при горе переменных пост и гет, не надо выискивать каждую и чистить её...а их поверьте куча...
 
 Top
DeepVarvar Супермодератор
Отправлено: 15 Декабря, 2012 - 21:12:16
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Неверный подход у вас. Эскейпить нужно непосредственно перед запросом а не заранее.
 
 Top
tuareg
Отправлено: 15 Декабря, 2012 - 21:14:14
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


Помог: 69 раз(а)




Bio man пишет:
LIME, prepared statements и param binding сделает код более безопасным от инъекций чем всякие escape_string.

И замедлят выполнение запроса раза в полтора(+/-) Улыбка
 
 Top
RickMan
Отправлено: 15 Декабря, 2012 - 21:35:36
Post Id


Участник


Покинул форум
Сообщений всего: 1033
Дата рег-ции: Май 2012  


Помог: 30 раз(а)




DeepVarvar пишет:
Неверный подход у вас. Эскейпить нужно непосредственно перед запросом а не заранее.


в чем разница? если считать, что переменных много и рискованно каждую мусолить...
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB