Эволюция getBody :)

Вероломство

PHP:
  1. function getMethod()
  2. {
  3.     return strtolower($_SERVER[‘REQUEST_METHOD’]);
  4. }
  5.  
  6. // РАЗ
  7. function getBody()
  8. {
  9.     $body = [];
  10.  
  11.     if (getMethod() === ‘get’) {
  12.         foreach ($_GET as $key => $value) {
  13.             //$body[$key] = filter_input(INPUT_GET, $key, FILTER_SANITIZE_SPECIAL_CHARS);
  14.             $body[$key] = filter_var($value, FILTER_SANITIZE_SPECIAL_CHARS);
  15.         }
  16.     }
  17.  
  18.     if (getMethod() === ‘post’) {
  19.         foreach ($_POST as $key => $value) {
  20.             //$body[$key] = filter_input(INPUT_POST, $key, FILTER_SANITIZE_SPECIAL_CHARS);
  21.             $body[$key] = filter_var($value, FILTER_SANITIZE_SPECIAL_CHARS);
  22.         }
  23.     }
  24.  
  25.     return $body;
  26. }
  27.  
  28. var_dump(getBody());
  29.  
  30. // ДВА
  31. function getBody2()
  32. {
  33.     $body = [];
  34.  
  35.     foreach ($_GET as $key => $value) {
  36.         $body[$key] = filter_var($value, FILTER_SANITIZE_SPECIAL_CHARS);
  37.     }
  38.  
  39.     foreach ($_POST as $key => $value) {
  40.         $body[$key] = filter_var($value, FILTER_SANITIZE_SPECIAL_CHARS);
  41.     }
  42.  
  43.     return $body;
  44. }
  45.  
  46. var_dump(getBody2());
  47.  
  48. // ТРИ — финал
  49. function getBody3()
  50. {
  51.     $body = [];
  52.  
  53.     foreach ($_GET + $_POST as $key => $value) {
  54.         $body[$key] = filter_var($value, FILTER_SANITIZE_SPECIAL_CHARS);
  55.     }
  56.  
  57.     return $body;
  58. }
  59.  
  60. var_dump(getBody3());
  61.  
  62. ?>
  63. <form action=«?a=<script></script>&b=2» method=«post»>
  64.     <button name=«test» value=«<script></script>»>Send</button>
  65. </form>

выхлоп

Код (Text):
  1. array (size=1)
  2.   ‘test’ => string ‘&#60;script&#62;&#60;/script&#62;’ (length=33)
  3.  
  4. array (size=3)
  5.   ‘a’ => string ‘&#60;script&#62;&#60;/script&#62;’ (length=33)
  6.   ‘b’ => string ‘2’ (length=1)
  7.   ‘test’ => string ‘&#60;script&#62;&#60;/script&#62;’ (length=33)
  8.  
  9. array (size=3)
  10.   ‘a’ => string ‘&#60;script&#62;&#60;/script&#62;’ (length=33)
  11.   ‘b’ => string ‘2’ (length=1)
  12.   ‘test’ => string ‘&#60;script&#62;&#60;/script&#62;’ (length=33)

Я правильно рассуждаю? :)

 

Drunkenmunky

Работает?
Быстро работает?
Безопасно?
Понятно самому же через пару месяцев?

Если всё — да, то правильно.

 

mkramer

Ты уверен, что это всегда нужно? Хотя, тут споры. Лично я предпочитаю хранить всё, как оно пришло от пользователя, а всяким экранированием заниматься при выводе
— Добавлено —
В базе оно безвредно

 

MouseZver

$_REQUEST

 

Вероломство

@MouseZver хорошая напоминалка, спс…
— Добавлено —

на всякий случай, вдруг где вывод из БД забыл почистить, так теги и улетят во вьюху, а так-то я понимаю, что в БД можно грузить как есть, спс

 

mkramer

Ну у меня, как поклонника ларавеля, таких проблем нету — Blade сам всё чистит. Хотя, и без ларавеля это не трудно сделать

 

don.bidon

В базе оно вредно, так как может перестать влазить в длину строковых/текстовых полей )

ТС, преобразовывать нужно при выводе, сомневаюсь, что в ближайшее время упрётесь в нагрузку из-за преобразований.
Шаблонизатор какой-нить типа Twig используйте, там при выводе данных всякие полезные преобразователи есть.

 

Вероломство

смотри что ты написал:

1. Сначала ты говоришь, что в базе оно вредно, то есть предлагаешь чистить ДО записи в БД.
2. Теперь ты пишешь, что мне нужно преобразовывать ПРИ выводе, то есть получается, что писать в БД нужно как есть, что противоречит пункту 1.

 

miketomlin

@Вероломство, он недопонял цитируемого. Хотел сказать, что твой вариант вреден. Вредно, когда «перестает влезать», а когда просто не влезает в исходном виде, это нормально :)
— Добавлено —
Я, как активный пользователь/наблюдатель обоих способов, могу с уверенностью сказать, что когда пишут «преобразовывать нужно при выводе», они другой способ толком не пробовали и не понимают, про что он.
— Добавлено —
Там, кстати, тоже нет 100-процентного кодирования текстовых полей при вводе. Обычно тоже «смесь», но с уклоном в кодирование при вводе.

 

Вероломство

суть вопроса не в чистке, а в эволюции метода из выбирающего ТОЛЬКО POST ИЛИ ТОЛЬКО GET, в метод выбирающий $_REQUEST, я там даже html-форму привёл, чтобы было понятно, что при ПЕРВОМ варианте метода этой формой будет получен только POST, а ведь в форме action содержит GET-параметры :)

вот в чём суть

 

MouseZver

Админ: — Петь, зачем ты преобразуешь html строку перед сохранением в БД ?
Петя: — Чтобы защититься от XSS
Админ: — А когда нужно смайлы и ББ теги преобразовать, ты снова преобразуешь в html сущность ?
Петя: — Угу !
Админ: — А после снова преобразуешь, чтобы защититься от XSS ?
Петя: — … Что ты от меня хочешь ? Хватит умничать !

Админ: — Петь, зачем ты преобразуешь html строку перед сохранением в БД ?

 

don.bidon

Не приписывайте мне того, чего я не писал )
Я писал, что обработанные данные вредны в БД (конечно, бывают исключения, но сейчас речь не о том), так как в поле из, скажем, 32 символов не войдут 32 htmlencoded-апострофа. По поводу обрезания исходных данных — если не проверять длину данных перед записью в БД, то ССЗБ.

 

Вероломство

вопрос вообще не про это :)

 

don.bidon

Мой первый ответ был на посты
https://php.ru/forum/threads/ehvoljucija-getbody.91434/#post-639923
https://php.ru/forum/threads/ehvoljucija-getbody.91434/#post-639926

 

Вероломство

так там не вопрос, там просто перекинулись мнением о фильтре, который в примере :)

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *