XSS на стороне клиента

ITFrogs

Что-то я совсем запутался с этим xss. Прошу наставить на путь истиный.

Есть платежный плагин, который имеет печатную форму. В этой печатной форме перед выводом на принтер есть инпут для редактирования номера счета перед печатью. Чисто на всякий случай. Эти данные никуда не сохраняются и на сервер никак не передаются.

Получаю отказ по следующей причине:

Оставляем галочку возможности редактирования счета, вставляем в номер счета '"></textarea><script>alert(1)</script>
и получаем...правильно, XSS

И какой смысл в подобной атаке? Хакер поломает сам себя? Или принтер взломает свой?

Я должен думать о том, что сделает клиент на своей стороне? А если он фаербагом себе вредоносный код внедрит? Тоже как-то его защищать? Может еще в прошлое отправиться и Кеннеди спасти?

Короче кто-то тут не прав. Прошу помочь разобраться.

6 мая 2016
  • info@ravencode.ru 6 мая 2016 17:02

    Ты видимо не совсем понимаешь что данный скрипт будет выполняться на стороне клиента и он может пересылать третьим лицам данные форм\куки т.е. владелец сайта перешел по такой вот ссылочке на свой же сайт, скрипт добавил отслеживание входа в систему и благополучно отправляет данные злоумышленнику (ajax запрос). Но данном конкретном случае данные не передаются на сервер и поэтому действительно не понятно зачем тут экранирование, тем более если оно реализовано на уровне html его легко можно обойти.

  • ITFrogs 6 мая 2016 17:49

    В том то и дело, что данные не передаются.

  • info@ravencode.ru 6 мая 2016 18:01

    Добавь экранирование исходных данных т.е. {$order.id|escape}, WA вкорячивают его везде -видимо сработал рефлекс :) это не смотря на то, что можно сразу экранировать данные при их инициализации в smarty https://github.com/webasyst/webasyst-framework/blo...

  • ITFrogs 6 мая 2016 18:07

    Id генерит движок, а не пользователь. Эскейпить его совершенно не нужно.

  • Если вы точно уверены, что отказ был дан неправомерно, наверное, стоит отправить продукт на повторную модерацию, снабдив его соответствующим комментарием. Если ваши доводы разумны, они будут приняты во внимание. В крайнем случае вы получите повторный отказ с расширенным объяснением причин.

  • ITFrogs 10 мая 2016 05:09

    Меня волнует не отказ, а сам принцип. Хочу определить что для вас xss. И может ли быть xss чисто на стороне клиента.

  • Если действительно исключена возможность для пользователя нечаянно навредить самому себе или намеренно либо случайно навредить другим пользователям, то отказ в вашем случае выглядит как недостаточно обоснованный. Но его можно использовать как прививку самому себе от небезопасного программирования, когда вы изначально сознательно пишете код, в работе которого в принципе исключены подобные ситуации. Это будет в некоторой степени лишняя работа, но она заставит вас всегда помнить о безопасности вводимых пользователем данных. Но можно и спокойно протестовать против необоснованного отказа, и в некотором виртуальном суде "модератор против разработчика" свой иск вы скорее всего выиграете.

  • ITFrogs 10 мая 2016 06:21

    Я не знаю методов защиты от xss на стороне клиента. Поэтому, как прививку, это использовать не получится. А так бы с удовольствием конечно.

    Еще я искренне не понимаю когда делаю запрос в базу, получаю айдишники и тут же новый запрос по этим айдишникам с применением IN(). Модераторы зачем-то заставляют и это эскейпить.

  • Передавайте их в виде плейсхолдеров. Тоже хорошая привычка.

  • ITFrogs 10 мая 2016 07:44

    Пытаюсь понять как.

    Сейчас я пишу так:

    ' WHERE p.sku_id IN(' . $this->escape(implode(',', $skus_ids)) . ')'

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

  • ITFrogs 10 мая 2016 07:45

    Если неименованным плейсхолдером, то я замучаюсь в сложных запросах считать запятые.

    А именованного без кавычек я у вас не нашел.

  • Алексей Webasyst 10 мая 2016 08:39

    https://developers.webasyst.ru/basics/classes/waMo... метод exec там описание обычные и именованные.

    'WHERE p.sku_id IN(' . $this->escape(implode(',', $skus_ids)) . ')'

    В большинстве случаев можно же заменить на

    'WHERE p.sku_id IN(?)',$skus_ids

    А там уже автоматически применится implode\escape и т.д.

  • Да и именованные можно вполне использовать:

    $model->query('SELECT * FROM shop_product WHERE id IN (i:ids)', array('ids' => $ids)
  • ITFrogs 10 мая 2016 09:06

    Снова отказ с формулировкой

    "в теме вам ответили"

    Что считать ответом? Я считаю ответом пост Михаила Ушенина о том, что отказ не обоснован и надо послать еще раз. Вот и послали :)

  • ITFrogs 10 мая 2016 09:09

    Михаил, мы тут съехали с темы в сторону плейсхолдеров. Спасибо конечно за ответ. Не догадался применить i:

    Но а что же с инпутом в печатной форме, который никуда не отправляется? Два отказа уже из-за него. Как проверять xss на стороне клиента, чтобы модератор был доволен?

  • Видимо, "протестовать против необоснованного отказа" запросом в службу поддержки или таки добавить фильтрацию введённых пользователем данных, чтобы данная претензия оказалась удовлетворена.

  • ITFrogs 10 мая 2016 09:28

    Я же на этот форум вылез чтобы мне подсказали как фильтровать данные, которые никогда никуда не передаются.

    А еще зачем фильтровать данные, которые никогда никуда не передаются? Какой в этом смысл?

    Я написал запрос в службу техподдержки. Но от этого легче не становится.

  • ITFrogs 10 мая 2016 10:36

    Нашел способ как экранировать на фронтенде через jquery. Может кому пригодится:


           function htmlspecialchars(string)  {
                return $('<span>').text(string).html()
            }
  • Алексей Webasyst 10 мая 2016 12:10

    AFAIK. Только этот код не экранирует кавычки и апострофы, если я правильно могу судить по источнику http://stackoverflow.com/questions/24816/escaping-...

  • ITFrogs 10 мая 2016 12:35

    Я вот это проверил

    Вбейте в строку Номер счета "<ooo> roga & copbITA <50>", что вы получите? Не тоже самое, а это плохо для, к примеру, менеджера магазина, который не столь близко знаком с языками программирования.

    Работает. На этом и успокоился.

    А так конечно ждал что вы какое-нибудь идеальное решение предложите в виде кода.



Чтобы добавить комментарий, зарегистрируйтесь или войдите