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
Форумы портала PHP.SU :: Версия для печати :: Отличие в плане безопасности
Форумы портала PHP.SU » » Вопросы новичков » Отличие в плане безопасности

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

1. RickMan - 15 Декабря, 2012 - 19:20:18 - перейти к сообщению
Здравствуйте, не подскажете чем отличаются эти две строки?

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."'   ");


Меня интересует разница в плане безопасности....по всем мануалам первый вариант категорически запрещен, а правильный второй...Но чем отличаются они, если все что в посте, помещается в другую переменную и она же идет в запрос?? Не подскажете?
2. AlexAnder - 15 Декабря, 2012 - 19:27:43 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. if(isset($_POST['var']))
  2. {
  3.     $var=mysql_real_escape_string($_POST['var']);
  4.     mysql_query("UPDATE `table` SET `var`='$var'");
  5. }
3. OrmaJever - 15 Декабря, 2012 - 19:35:24 - перейти к сообщению
RickMan пишет:
Меня интересует разница в плане безопасности....по всем мануалам первый вариант категорически запрещен, а правильный второй...Но чем отличаются они, если все что в посте, помещается в другую переменную и она же идет в запрос?? Не подскажете?

Ничем, оба не безопастны Подмигивание Правельный вариант уже написали выше.
4. KingStar - 15 Декабря, 2012 - 19:36:29 - перейти к сообщению
Правильный вариант перейти на MySQLi или PDO Язычок
5. RickMan - 15 Декабря, 2012 - 19:58:38 - перейти к сообщению
Ну 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']."'   ");


Так нормально или нет?
6. LIME - 15 Декабря, 2012 - 20:17:44 - перейти к сообщению
KingStar и что?
код тс в pdo станет безопасным?
7. KingStar - 15 Декабря, 2012 - 20:48:37 - перейти к сообщению
LIME вообще-то это был сарказм, если в голове нет - то здесь ничто не поможет (((
(Добавление)
и судя по "Отредактировано администратором" и тебе того же, тем же, и по тому же месту Хм
8. Bio man - 15 Декабря, 2012 - 20:50:14 - перейти к сообщению
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");
?
9. DeepVarvar - 15 Декабря, 2012 - 20:55:15 - перейти к сообщению
RickMan пишет:
В итоге все переменные гет и пост пройдут эту фильтрацию
А потом вдруг где-нибудь выяснится, что понадобилось реальное не эскейпнутое значение какого-либо ключа. Что тогда делать будете?
10. armancho7777777 - 15 Декабря, 2012 - 20:55:22 - перейти к сообщению
Bio man пишет:
а почему бы не просто

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

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

PS, глянул в доки, массив и так по ссылке передается.
(Добавление)
ладно, понял свою ошибку. но все же странно это...
12. RickMan - 15 Декабря, 2012 - 21:10:39 - перейти к сообщению
DeepVarvar пишет:
RickMan пишет:
В итоге все переменные гет и пост пройдут эту фильтрацию
А потом вдруг где-нибудь выяснится, что понадобилось реальное не эскейпнутое значение какого-либо ключа. Что тогда делать будете?


я думаю это единичный случай от силы...если такое нужно будет то тогда в функции format_string пропишу проверку на переменную и не буду её фильтровать...зато при горе переменных пост и гет, не надо выискивать каждую и чистить её...а их поверьте куча...
13. DeepVarvar - 15 Декабря, 2012 - 21:12:16 - перейти к сообщению
Неверный подход у вас. Эскейпить нужно непосредственно перед запросом а не заранее.
14. tuareg - 15 Декабря, 2012 - 21:14:14 - перейти к сообщению
Bio man пишет:
LIME, prepared statements и param binding сделает код более безопасным от инъекций чем всякие escape_string.

И замедлят выполнение запроса раза в полтора(+/-) Улыбка
15. RickMan - 15 Декабря, 2012 - 21:35:36 - перейти к сообщению
DeepVarvar пишет:
Неверный подход у вас. Эскейпить нужно непосредственно перед запросом а не заранее.


в чем разница? если считать, что переменных много и рискованно каждую мусолить...

 

Powered by ExBB FM 1.0 RC1