замена строки на странице, созданной из шаблона

2

У меня есть некоторые aspx-страницы, созданные пользователем из шаблона. Включена некоторая замена строки (anyting с ${fieldname}), поэтому часть шаблона выглядит так:

<% 
  string title = @"${title}";
%>
<title><%=HttpUtility.HtmlEncode(title) %></title>

Когда из этого шаблона создается aspx файл, значение ${title} заменяется значением, введенным пользователем.

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

Я не контролирую процесс создания шаблона - мне нужно принять это как заданное.

Теги:
string
templates
escaping

3 ответа

1
Лучший ответ

Можете ли вы сохранить их значения в другом файле (возможно, xml) или в базе данных? Таким образом, их вклад не компилируется на вашу страницу. Затем вы просто читаете данные в переменных. Тогда все, о чем вам нужно беспокоиться, это html, о котором позаботится ваш html-код.

  • 0
    Кажется, это единственный способ, которым он может работать - значение помещается в какую-то область хранения, а затем отдельный процесс считывает и внедряет его в шаблон aspx.
0

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

Вы можете использовать регулярное выражение для фильтрации входной строки. Я бы использовал всеохватывающее регулярное выражение, вместо того, чтобы исключать опасные символы. Разрешайте только A-Za-z0-9 и пробелы.

  • 0
    Вы правы, они могут вставить либо код, либо HTML, либо один. Как и в моем комментарии к другому ответу, я не могу получить его в переменную для начала, так что трудно обработать это после факта. Эта операция будет выполняться зарегистрированными пользователями, а не пользователями, поэтому я могу просто жить с этим. Но я надеялся, что есть способ обойти это, просто чтобы избежать краж со стороны ИТ-персонала.
  • 0
    Вы не контролируете код, который применяет переменные к шаблону?
0

Не уверен, что я полностью понимаю, но...

Попробуйте использовать регулярное выражение для выделения html из заголовка вместо html, кодирующего его:

public string StripHTML(string text)
{
    return Regex.Replace(text, @"<(.|\n)*?>", string.Empty);
}

Возможно ли это?

<% 
  string title = Regex.Replace(@"${title}", @"<(.|\n)*?>", string.Empty);
%>

или

<title><%=HttpUtility.HtmlEncode(System.Text.RegularExpressions.Regex.Replace(title, @"<(.|\n)*?>", string.Empty)) %></title>
  • 0
    И как мне безопасно получить замененный текст шаблона в переменную «текст»? Вот и вся проблема!
  • 0
    Как конечные пользователи создают шаблоны? Почему вы можете фильтровать содержимое при сохранении, а не на дисплее?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню