#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 в свой текст.