- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
public static MvcHtmlString TextWithLinks(this HtmlHelper helper, string inputStr)
{
string html = String.Empty;
Uri url;
string[] arr = inputStr.Split(' ');
for (int i = 0; i < arr.Length; i++)
{
if (i != 0)
{
html += " ";
}
if (Uri.TryCreate(arr[i],UriKind.Absolute, out url))
{
html += String.Format("<a href='{0}' target='_blank'>{0}</a>", url.AbsoluteUri);
}else
{
html += arr[i];
}
}
return new MvcHtmlString(html);
}
P.S. Это я так понимаю обработка ссылок в чем-то типа BB кодов?
Но строка 17 - эталонный ГК. Если не распарсился URL - строка вставляется в HTML как есть, со всеми <script> и прочими радостями жизни.
Ну опять же все зависит от того, насколько эта строка отфильтрована заранее, до вызова этой функции. Если в ней уже успели похерить все открывающие угловые скобки - то абсолютно ничего страшного.
а если нет, см. альтернативную ветку, где все скобки выживают
> где все скобки выживают
Я все-таки имел в виду, что скобки уже успели похерить ДО вызова TextWithLinks, а не в ней... Но тут я тупанул в плане амперсанда - его тоже нужно экранировать, но если его заэкранировать заранее - испортятся сложные URL'ы, в которых больше одного параметра. Единственное место, где можно адекватно заэкранировать амперсанд - как раз строка 17 ;(
P.S. Или & допустим в href и обработается корректно?
по-хорошему, надо отдельно эскейпить текст и урлы
я в свое время тоже писал что-то подобное сабжу (выделение ссылок) и тоже столкнулся с такой проблемой
http://stackoverflow.com/questions/3705591/do-i-encode-ampersands-in-a-href
Т.е. получается, что все-таки можно заэкранировать все к хуям в самом начале обработки текста, задолго ДО обработки ссылок. Другое дело, что тогда Uri.TryCreate может поломаться из-за &'ов и < в нем.
Percent-encoding должен был применить тот, кто отправлял текст (ну или браузер, из которого он копировал ссылку), т.к. в рассматриваемом коде мы уже никак не сможем отличить амперсанды внутри параметров от амперсандов между параметров (если постер не применил percent encoding сам).
(блин, что-то я сегодня жестко туплю)
Да я тоже не лучше... Просто тут любому крышу снесет этими многоуровневыми экранами. Самое противное - в вебе всё работает почти как надо, даже если я делаю кучу вещей неправильно. Вот за это я и ненавижу веб, хтмл, и всё, что с ними связано.
в вебе ничего не ломается с сегфолтом, а спокойно себе криво-косо работает (что-то вроде "чувак, ты же именно на это рассчитывал")
а потом смотришь - а у тебя база дропнута, мыло-пассы уведены, сервак зомбирован в ботнет. а все потому, что где-то забыл что-то экранировать, понадеявшись, что это уже было сделано предыдущим слоем
У нас на внутрикорпоративном сайте была бага - половина таблиц и дивов была не закрыта. Но эксплорер отлично показывал и печатал эту страничку. И всем было хорошо. А вот опера с фуррифоксом показывали, но не могли напечатать ;) Причем опера показывала просто чудеса ебанутости - в preview все было нормально, а в распечатках была полная срань ;)
Вам зачем боги абстракцию дали?
нафига над строками аппендом манипулировать, если можно строить дерево в памяти и всю логику рендеринга и экранирования поместить один раз туда?
и вообще, я за event-driven
Ну а незаэкранированный жабоскрипт тогда что сделает? ;)
распидорасит страницу
--------
<a href=https://bezopasnik24.ru>контроль доступа турникеты</a> | https://bezopasnik24.ru