какой самый безопасный способ задать входное значение с помощью liquid?

#javascript #shopify #xss #liquid

#javascript #Shopify #xss #liquid

Вопрос:

вот что я делаю:

 <input value="{{ value | strip_html | escape }}">
 

глядя на примеры, кажется, что escape может быть достаточно

https://github.com/Shopify/liquid/search?p=1amp;q=escapeamp;unscoped_q=escape

но он не экранируется < , > , и " , например.

(очевидно, что выход не приводит к XSS)

Я использую последнюю версию liquidjs

Ответ №1:

Я обновлю этот ответ, если ситуация изменится, но, похоже | escape , этого достаточно, и нет способа выйти из атрибута с двойными кавычками ( "" ) без двойных кавычек, мне просто нужно убедиться, что я использую двойные кавычки. так что этого должно быть достаточно:

 <input value="{{ value | escape }}">
 

чтобы быть ясным <input value="{{ value }}"> , это подвергает вас уязвимости XSS.

вы можете сами увидеть различия: https://jsfiddle.net/h80radfu /

Ответ №2:

Другие экранирующие фильтры, которые могут удовлетворить ваши потребности::

  • handle (или handleize ): форматирует строку в дескриптор.
  • url_encode : Преобразует любые небезопасные для URL-адреса символы в строке в процентах. кодированные символы.
  • url_escape : Определяет все символы в строке, которые не разрешены в URL-адресах, и заменяет символы их экранированными вариантами.
  • url_param_escape : Заменяет все символы в строке, которые не разрешены в URL-адресах, их экранированными вариантами, включая амперсанд (amp;) .
  • json : Преобразует строку в формат JSON. (Примечание: простые переменные, такие как строки, становятся экранируемыми строками, заключенными в двойные кавычки)

Попробуйте их и посмотрите, соответствуют ли какие-либо из них вашим требованиям.

Источники: https://help.shopify.com/en/themes/liquid/filters/string-filters
https://help.shopify.com/en/themes/liquid/filters/additional-filters

Комментарии:

1. значение представляет собой ранее предоставленный пользовательский ввод в произвольной форме, handle/url encode/escape/etc./json изменит результирующее значение. Я просто хочу экранировать значение, чтобы не было XSS.

2. При вводе необработанной формы XSS не будет. Он обрабатывается как необработанный текст и не интерпретируется синтаксическим анализатором HTML в браузере. Вам нужно только избегать пользовательского ввода, когда вы отображаете этот пользовательский ввод в HTML-элементе.

3. Тогда, если единственное, что вас беспокоит, это двойная кавычка ( " ), просто используйте {{ value | replace: '"', 'amp;quot;' }} , нет? Кроме того, дважды проверьте, что escape это не выполняет свою работу — теперь, когда я думаю об этом, я видел довольно много сайтов, которые используют конструкции, подобные data-something="{{ complex_thing | escape }}" , и кавычки экранируются правильно. Инструменты разработчика вашего браузера могут показывать вам проанализированные значения, даже если базовый HTML-код фактически экранирован


Ответ №3:

Shopify по умолчанию экранирует большинство значений. Однако многие библиотеки Liquid (например, Ruby Gem) не используют и потребуют явного использования | escape фильтра.

Итак, в Shopify этого будет достаточно

 <input value="{{ value }}">
 

Для любой другой реализации Liquid выполните

 <input value="{{ value | escape }}">
 

Вам не нужен strip_html as, который искажает ваш пользовательский ввод, если пользователю нужно вставить символы HTML в свой текст.