У меня есть некоторые aspx-страницы, созданные пользователем из шаблона. Включена некоторая замена строки (anyting с ${fieldname}), поэтому часть шаблона выглядит так:
<%
string title = @"${title}";
%>
<title><%=HttpUtility.HtmlEncode(title) %></title>
Когда из этого шаблона создается aspx файл, значение ${title} заменяется значением, введенным пользователем.
Но, очевидно, они могут вводить произвольный HTML, просто закрывая двойную кавычку в своей строке ввода. Как мне обойти это? Я чувствую, что это должно быть очевидно, но я не могу понять, как это сделать.
Я не контролирую процесс создания шаблона - мне нужно принять это как заданное.
Можете ли вы сохранить их значения в другом файле (возможно, xml) или в базе данных? Таким образом, их вклад не компилируется на вашу страницу. Затем вы просто читаете данные в переменных. Тогда все, о чем вам нужно беспокоиться, это html, о котором позаботится ваш html-код.
Если они включают в свою строку двойную кавычку, которая не будет вводить произвольный HTML, а произвольный код, что еще хуже.
Вы можете использовать регулярное выражение для фильтрации входной строки. Я бы использовал всеохватывающее регулярное выражение, вместо того, чтобы исключать опасные символы. Разрешайте только A-Za-z0-9 и пробелы.
Не уверен, что я полностью понимаю, но...
Попробуйте использовать регулярное выражение для выделения 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>