Регистрация  |  Вход

Output HTML escape=false когда очень нужно

Привет.
Подскажите с решением.

Есть пакет и там есть много мест где надо вывести html полученный из бэкенда.
Делается это просто <apex:outputText value="htmlStrig" escape="false" />

Теперь стоит вопрос чтобы пройти security code review. Первые попытки провалились и со стороны Salesforce прозвучала настоятельная просьба убрать все escape=false из пакета.

Как можно решить проблему с выводом html?

У кого есть какие решения из практики.

Пока вижу что можно выводить простым apex:outputText (естественно отрендерится как простой текст), а потом пройтись JS по таким элементам и заменить их на html. Что-то типо

jQuery('.htmlEl').each(function(){
jQuery(this).html(jQuery(this).text());
});

Ну и чтобы себя обезопасить найти какой-нибудь Sanitizer и пропускать через него

jQuery(this).html(Sanitize(jQuery(this).text()));

Как вы решали подобные проблемы на Security Review?

Привет.
Подскажите с решением.

Есть пакет и там есть много мест где надо вывести html полученный из бэкенда. 
Делается это просто <apex:outputText value="htmlStrig" escape="false" />

Теперь стоит вопрос чтобы пройти security code review. Первые попытки провалились и со стороны Salesforce прозвучала настоятельная просьба убрать все escape=false из пакета.

Как можно решить проблему с выводом html?

У кого есть какие решения из практики.

Пока вижу что можно выводить простым apex:outputText (естественно отрендерится как простой текст), а потом пройтись JS по таким элементам и заменить их на html. Что-то типо
[code]
jQuery('.htmlEl').each(function(){
    jQuery(this).html(jQuery(this).text());
});
[/code]

Ну и чтобы себя обезопасить найти какой-нибудь Sanitizer и пропускать через него 
[code]
jQuery(this).html(Sanitize(jQuery(this).text()));
[/code]

Как вы решали подобные проблемы на Security Review?

Dmitry Shnyrev
Привет.
Подскажите с решением.

Есть пакет и там есть много мест где надо вывести html полученный из бэкенда.
Делается это просто <apex:outputText value="htmlStrig" escape="false" />

Теперь стоит вопрос чтобы пройти security code review. Первые попытки провалились и со стороны Salesforce прозвучала настоятельная просьба убрать все escape=false из пакета.

Как можно решить проблему с выводом html?

У кого есть какие решения из практики.

Пока вижу что можно выводить простым apex:outputText (естественно отрендерится как простой текст), а потом пройтись JS по таким элементам и заменить их на html. Что-то типо

jQuery('.htmlEl').each(function(){
jQuery(this).html(jQuery(this).text());
});

Ну и чтобы себя обезопасить найти какой-нибудь Sanitizer и пропускать через него

jQuery(this).html(Sanitize(jQuery(this).text()));

Как вы решали подобные проблемы на Security Review?


Нужно посмотреть у себя, что-то не помню чтобы я на это обращал внимание.

[quote="Dmitry Shnyrev"]Привет.
Подскажите с решением.

Есть пакет и там есть много мест где надо вывести html полученный из бэкенда. 
Делается это просто <apex:outputText value="htmlStrig" escape="false" />

Теперь стоит вопрос чтобы пройти security code review. Первые попытки провалились и со стороны Salesforce прозвучала настоятельная просьба убрать все escape=false из пакета.

Как можно решить проблему с выводом html?

У кого есть какие решения из практики.

Пока вижу что можно выводить простым apex:outputText (естественно отрендерится как простой текст), а потом пройтись JS по таким элементам и заменить их на html. Что-то типо
[code]
jQuery('.htmlEl').each(function(){
    jQuery(this).html(jQuery(this).text());
});
[/code]

Ну и чтобы себя обезопасить найти какой-нибудь Sanitizer и пропускать через него 
[code]
jQuery(this).html(Sanitize(jQuery(this).text()));
[/code]

Как вы решали подобные проблемы на Security Review?[/quote]
Нужно посмотреть у себя, что-то не помню чтобы я на это обращал внимание.

Да, действительно, по всем пакетам есть escape="false".
Я даже хз, может при ревью правила изменились. А может escape="false" добавили после первого ревью)

Да, действительно, по всем пакетам есть escape="false".
Я даже хз, может при ревью правила изменились. А может escape="false" добавили после первого ревью)

Закодировать на сервере в base64 и положить в outputtext, на клиенте раскодировать назад джаваскриптом.

Закодировать на сервере в base64 и положить в outputtext, на клиенте раскодировать назад джаваскриптом.

Maxim Elets
А может escape="false" добавили после первого ревью)

Кстати, у кого есть опыт, как вообще проходят доработки пакета, который уже прошел security review?
Т.е. возможна такая ситуация, что я сделаю для первого раза все скромненько, а потом в рамках небольших доработок зафигачу весь злой функционал?

[quote="Maxim Elets"]А может escape="false" добавили после первого ревью)[/quote]
Кстати, у кого есть опыт, как вообще проходят доработки пакета, который уже прошел security review?
Т.е. возможна такая ситуация, что я сделаю для первого раза все скромненько, а потом в рамках небольших доработок зафигачу весь злой функционал?

Mike V
Закодировать на сервере в base64 и положить в outputtext, на клиенте раскодировать назад джаваскриптом.

В принципе я это и описал как решение в своем вопросе.

[quote="Mike V"]Закодировать на сервере в base64 и положить в outputtext, на клиенте раскодировать назад джаваскриптом.[/quote]
В принципе я это и описал как решение в своем вопросе.

Dmitry Shnyrev
Mike V
Закодировать на сервере в base64 и положить в outputtext, на клиенте раскодировать назад джаваскриптом.

В принципе я это и описал как решение в своем вопросе.

Только у тебя както все проще, без допила на стороне apex.)
Dmitry Shnyrev
Кстати, у кого есть опыт, как вообще проходят доработки пакета, который уже прошел security review?
Т.е. возможна такая ситуация, что я сделаю для первого раза все скромненько, а потом в рамках небольших доработок зафигачу весь злой функционал?

Ревью только для того, чтобы бабок срубить перед AppExchange, а потом ты просто будешь платить в год н-ную сумму. Но они могу проверить твой пакет в любое время). Но на escape=false точно никто не будет ругаться

[quote="Dmitry Shnyrev"][quote="Mike V"]Закодировать на сервере в base64 и положить в outputtext, на клиенте раскодировать назад джаваскриптом.[/quote]
В принципе я это и описал как решение в своем вопросе.[/quote]
Только у тебя както все проще, без допила на стороне apex.)
[quote="Dmitry Shnyrev"]Кстати, у кого есть опыт, как вообще проходят доработки пакета, который уже прошел security review? 
Т.е. возможна такая ситуация, что я сделаю для первого раза все скромненько, а потом в рамках небольших доработок зафигачу весь злой функционал?[/quote]
Ревью только для того, чтобы бабок срубить перед AppExchange, а потом ты просто будешь платить в год н-ную сумму. Но они могу проверить  твой пакет в любое время). Но на escape=false точно никто не будет ругаться
Кстати, совсем забыл
[url=http://security.force.com/security/tools/forcecom/scanner]http://security.force.com/security/tools/forcecom/scanner[/url]

Да знаю я про него
Кстати тоже интересный момент
The organization must contain less than 500,000 lines of code (excluding static resources and packages which are not scanned)
В нашем пакете уже больше поэтому платим денежки

Да знаю я про него :D
Кстати тоже интересный момент 
[b]The organization must contain less than 500,000 lines of code (excluding static resources and packages which are not scanned)[/b]
В нашем пакете уже больше :D поэтому платим денежки

Кстати товарищи из SF посоветовали еще один экзотический способ как вывести информацию в виде html.
есть такой замечательный тег

<apex:inputTextarea richText="true" />

Так вот он вставляет на страницу CkEditor и рендерит ваш html внутри себя, но рендерит хитро - убирая все лишнее (по ходу имеет внутри встроенный sanitizer). Посоветовали вставить его на страницу, а как он построится с помощью js выбрать контент из области редактирования или с помощью css спрятать все лишнее кроме области с нашим контентом. Интересное решение, и вроде как приемлемое для товарищей из SF.

Кстати товарищи из SF посоветовали еще один экзотический способ как вывести информацию в виде html.
есть такой замечательный тег
[code]
<apex:inputTextarea richText="true" />
[/code]
Так вот он вставляет на страницу CkEditor и рендерит ваш html внутри себя, но рендерит хитро - убирая все лишнее (по ходу имеет внутри встроенный sanitizer). Посоветовали вставить его на страницу, а как он построится с помощью js выбрать контент из области редактирования или с помощью css спрятать все лишнее кроме области с нашим контентом. Интересное решение, и вроде как приемлемое для товарищей из SF.

Dmitry Shnyrev
Кстати товарищи из SF посоветовали еще один экзотический способ как вывести информацию в виде html.
есть такой замечательный тег
<apex:inputTextarea richText="true" />

Так вот он вставляет на страницу CkEditor и рендерит ваш html внутри себя, но рендерит хитро - убирая все лишнее (по ходу имеет внутри встроенный sanitizer). Посоветовали вставить его на страницу, а как он построится с помощью js выбрать контент из области редактирования или с помощью css спрятать все лишнее кроме области с нашим контентом. Интересное решение, и вроде как приемлемое для товарищей из SF.

писец.......

[quote="Dmitry Shnyrev"]Кстати товарищи из SF посоветовали еще один экзотический способ как вывести информацию в виде html.
есть такой замечательный тег
[code]
<apex:inputTextarea richText="true" />
[/code]
Так вот он вставляет на страницу CkEditor и рендерит ваш html внутри себя, но рендерит хитро - убирая все лишнее (по ходу имеет внутри встроенный sanitizer). Посоветовали вставить его на страницу, а как он построится с помощью js выбрать контент из области редактирования или с помощью css спрятать все лишнее кроме области с нашим контентом. Интересное решение, и вроде как приемлемое для товарищей из SF.[/quote]
писец.......

! Товарищи просьба. Если отвечаете на предыдущее сообщение, просто сразу пишите ответ без цитаты. Очень не интересно видеть весь вопрос на страницу в виде цитаты и одно-два слова в ответе.
! Кто не знал, а еще и забыл. Можно выделить кусок текста в сообщении и нажать цитировать и в цитату попадет только этот выделенный текст.

[color=red]! Товарищи просьба. Если отвечаете на предыдущее сообщение, просто сразу пишите ответ без цитаты. Очень не интересно видеть весь вопрос на страницу в виде цитаты и одно-два слова в ответе.
! Кто не знал, а еще и забыл. Можно выделить кусок текста в сообщении и нажать цитировать  и в цитату попадет только этот выделенный текст.[/color]

Dmitry Shnyrev
Как вы решали подобные проблемы на Security Review?

Когда-то была идея, правда хоть убей не помню проверял я её и работает ли она, но чем чёрт не шутит
Вместо прямого использования escape="true", сделайте это завуалированно через переменную контроллера, т.е.
<apex:outputText value="{!html}" escape="{!escape}"/>

А в контроллере сделайте финт ушами, в оригинале у меня была идея сделать вот так:
...
public Boolean escape
{
get
{
return System.today() > someDay;//where someDay - это дата в будущем до которой точно произойдёт ревью
}
}
...

[quote="Dmitry Shnyrev"]Как вы решали подобные проблемы на Security Review?[/quote]
Когда-то была идея, правда хоть убей не помню проверял я её и работает ли она, но чем чёрт не шутит :)
Вместо прямого использования escape="true", сделайте это завуалированно через переменную контроллера, т.е.
[code]<apex:outputText value="{!html}" escape="{!escape}"/>[/code]
А в контроллере сделайте финт ушами, в оригинале у меня была идея сделать вот так:
[code]
...
public Boolean escape
{
    get
    {
        return System.today() > someDay;//where someDay - это дата в будущем до которой точно произойдёт ревью :)
    }
}
...
[/code]

Т.е. на код ревью это будет false, а уже после Часа Ч будет True?
Идея интересная, но я думаю врядли рабочая. Мне кажется товарищи из SF реагируют не на то что стоит в значении escape, а на сам факт его наличия.

Т.е. на код ревью это будет false, а уже после Часа Ч будет True?
Идея интересная, но я думаю врядли рабочая. Мне кажется товарищи из SF реагируют не на то что стоит в значении escape, а на сам факт его наличия.

Dmitry Shnyrev
Т.е. на код ревью это будет false, а уже после Часа Ч будет True?
Идея интересная, но я думаю врядли рабочая. Мне кажется товарищи из SF реагируют не на то что стоит в значении escape, а на сам факт его наличия.

Я сильно сомневаюсь в том что они реагируют на факт его наличия, потому что не так давно (пару лет назад) поведение outputText поменялось - в предыдущих версиях по-умолчанию было поведение escape=false, а сейчас escape=true. Так что сам факт наличия этого аттрибута ничего не означает.

[quote="Dmitry Shnyrev"]Т.е. на код ревью это будет false, а уже после Часа Ч будет True?
Идея интересная, но я думаю врядли рабочая. Мне кажется товарищи из SF реагируют не на то что стоит в значении escape, а на сам факт его наличия.[/quote]

Я сильно сомневаюсь в том что они реагируют на факт его наличия, потому что не так давно (пару лет назад) поведение outputText поменялось - в предыдущих версиях по-умолчанию было поведение escape=false, а сейчас escape=true. Так что сам факт наличия этого аттрибута ничего не означает.

(предположение) Ну я просто ставлю себя на место security reviewers. Как можно проанализировать пакеты по 500000 строк кода, да при том что это дело еще идет на потоке. Я сам лично в одном пакете с которым сейчас работаю еще за пару месяцев не разобрался. Поэтому логично предположить что у них поиск уязвимых месте производится автоматически. И я далек от мысли что они трассируют приложение а не тупо натравливают сканер на исходники в поисках "escape"

(предположение) Ну я просто ставлю себя на место security reviewers. Как можно проанализировать пакеты по 500000 строк кода, да при том что это дело еще идет на потоке. Я сам лично в одном пакете с которым сейчас работаю еще за пару месяцев не разобрался. Поэтому логично предположить что у них поиск уязвимых месте производится автоматически. И я далек от мысли что они трассируют приложение а не тупо натравливают сканер на исходники в поисках "escape"