Проблеми със сигурността при HTML шаблоните на Mustache

Имам случай на употреба, при който съдържанието на HTML шаблона за мустаци може потенциално да идва от приложението/крайния потребител (т.е. съдържанието на маркера на скрипта в кодовия фрагмент по-долу.)

<script id="template" type="x-tmpl-mustache">
  Hello {{ name }}!
</script>

Тъй като това потенциално може да доведе до изпълнение на злонамерен код, аз го правя

  1. Разрешаване само на подмножество от HTML тагове и атрибути да бъдат добавени в шаблона (вътре в тага на скрипта)
  2. Разрешаването само на екранирани променливи в HTML, т.е. разрешено е само {{name}}, а не {{{name}}}.

Има ли нещо допълнително, което трябва да се вземе предвид за сигурността на приложението?


person Arjun    schedule 22.10.2015    source източник
comment
Това е интересен въпрос, но е труден за отговор: не може да има окончателен списък с потенциални проблеми със сигурността, защото някои действителни проблеми ще бъдат пренебрегнати, както и проста промяна в библиотеката с мустаци или кода на вашето приложение може да отвори изцяло нов набор от възможности за атака. Защо не отворите проблем в хранилището на moustache github, където авторите биха могли да разгледат въпроса ви с повече внимание?   -  person Gwendal Roué    schedule 25.10.2015
comment
без риск, без, нула, цип. тагът на скрипта е просто скрит таг, освен ако типът не е текст/javascript и mustache.js вече не изпълнява никакъв динамичен код, така че не може да е проблемът. сега, ако разрешите onmouseover и друго глупаво въвеждане, разбира се ще имате проблеми, но те нямат нищо общо с нефункциониращ таг на скрипт. използвайте ‹template›, ако се съмнявате...   -  person dandavis    schedule 28.10.2015
comment
Благодаря. Какво ще се случи след оценка на шаблон за дадените данни. Моля, имайте предвид, че както съдържанието на шаблона, така и данните идват от приложението. Що се отнася до onmouseover, разрешавам само бял списък с HTML елементи и атрибути, така че това не е проблем.   -  person Arjun    schedule 28.10.2015


Отговори (2)


Мисля, че не е проблем с "мустаците", ако следваме философията "малки, остри инструменти". След това, преди да картографирате незащитени данни (JSON на трета страна) към шаблон, трябва да потвърдите данните с други инструменти.

Най-простият подход, с който да започнете, е да замените низови полета, съдържащи незащитени данни.

function clearJson(userStringData){

  return JSON.parse(userStringData, function(k,v) { 
        // string values containg something like
        // html tags or js block braces will not pass
        return String(v).match('[<>{}]') ? 'UNSAFE' : v;
  });
}

Полето за въвеждане на код е твърде широко, за да има кратък отговор на вашия въпрос. Можете да приложите всеки подход, който е достатъчно напреднал за вашето приложение: дефинирайте форматите на данните, които приложението очаква от потребителя, и след това по време на изпълнение премахнете входящите подозрителни данни, които не съответстват на тези формати.

person diziaq    schedule 27.10.2015

Трябва да извършите user inputs на сървъра, а не "само" на клиента. Ако някой "лош код" ще бъде изпълнен на клиента, вече е твърде късно ;)

person webdeb    schedule 31.10.2015
comment
Да, дезинфекцията на входа на приложението, който ще стане част от шаблона, ще се извърши на сървъра. - person Arjun; 01.11.2015