Как удалить опасные символы (т.е. теги script)?

Я задаюсь вопросом, там какой-либо вид класса C# или сторонней библиотеки, которая удаляет опасные символы, такие как теги script?

Я знаю, что можно использовать regex, но я также знаю, что люди могут записать их тегам script столько способов, которыми можно дурачить regex, заставляя думать, он в порядке.

Я также слышал, что Пакет Гибкости HTML хорош, таким образом, я задаюсь вопросом, там какой-либо класс удаления сценария, сделанный для него?

Править

http://htmlagilitypack.codeplex.com/Thread/View.aspx?ThreadId=24346

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

Яркий пример (почти), Спасибо! Несколько способов сделать это более сильным, который я видел, хотя:

1) Используйте поиск без учета регистра при поиске ссылок с "JavaScript": "vbscript": "jscript":. например, исходный пример не удалил бы HTML:

click> me

2) Удалите любые атрибуты стиля, которые содержат правило выражения. Internet Explorer оценивает экспресс правила CSS как сценарий. Например, следующее было бы продукт окно сообщения:

bad> code

3) Также удалите теги

Я честно понятия не имею, почему "выражение" не было удалено из IE - главный дефект, по-моему. (Попробуйте пример отделения в Internet Explorer, и Вы будете видеть почему - даже IE8.) Мне просто жаль, что не было более легкого/стандартного пути к вводу HTML очистки от пользователя.

Вот код, обновленный с этими улучшениями. Сообщите мне, видите ли Вы что-то не так:

    public string ScrubHTML(string html)
    {
        HtmlDocument doc = new HtmlDocument();
        doc.LoadHtml(html);

        //Remove potentially harmful elements
        HtmlNodeCollection nc = doc.DocumentNode.SelectNodes("//script|//link|//iframe|//frameset|//frame|//applet|//object|//embed");
        if (nc != null)
        {
            foreach (HtmlNode node in nc)
            {
                node.ParentNode.RemoveChild(node, false);

            }
        }

        //remove hrefs to java/j/vbscript URLs
        nc = doc.DocumentNode.SelectNodes("//a[starts-with(translate(@href, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'javascript')]|//a[starts-with(translate(@href, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'jscript')]|//a[starts-with(translate(@href, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'vbscript')]");
        if (nc != null)
        {

            foreach (HtmlNode node in nc)
            {
                node.SetAttributeValue("href", "#");
            }
        }


        //remove img with refs to java/j/vbscript URLs
        nc = doc.DocumentNode.SelectNodes("//img[starts-with(translate(@src, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'javascript')]|//img[starts-with(translate(@src, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'jscript')]|//img[starts-with(translate(@src, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'vbscript')]");
        if (nc != null)
        {
            foreach (HtmlNode node in nc)
            {
                node.SetAttributeValue("src", "#");
            }
        }

        //remove on handlers from all tags
        nc = doc.DocumentNode.SelectNodes("//*[@onclick or @onmouseover or @onfocus or @onblur or @onmouseout or @ondoubleclick or @onload or @onunload]");
        if (nc != null)
        {
            foreach (HtmlNode node in nc)
            {
                node.Attributes.Remove("onFocus");
                node.Attributes.Remove("onBlur");
                node.Attributes.Remove("onClick");
                node.Attributes.Remove("onMouseOver");
                node.Attributes.Remove("onMouseOut");
                node.Attributes.Remove("onDoubleClick");
                node.Attributes.Remove("onLoad");
                node.Attributes.Remove("onUnload");
            }
        }

        // remove any style attributes that contain the word expression (IE evaluates this as script)
        nc = doc.DocumentNode.SelectNodes("//*[contains(translate(@style, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'expression')]");
        if (nc != null)
        {
            foreach (HtmlNode node in nc)
            {
                node.Attributes.Remove("stYle");
            }
        }

        return doc.DocumentNode.WriteTo();
    } 

7
задан Erik Philips 6 July 2012 в 15:21
поделиться

1 ответ

Я бы использовал встроенные методы. На мой взгляд, если пользователь захочет сломать вашу программу, он найдет способ это сделать. Но если вы объедините несколько методов очистки пользовательского ввода, ваша программа станет только более безопасной.

Например, для строковой переменной с именем «myString» я бы совмещал удаление символов REGEX с обычным ручным удалением символов вручную, на всякий случай.

Это удалит все, что не является буквенно-цифровым.

myString = Regex.Replace(myString, "[^a-z0-9]", "", RegexOptions.CaseInsensitive);
myString = myString.replace("/","");
myString = myString.replace("<","");

и т. Д.

Вы также можете расширить это действие, удалив текст между символами «<» и «>», а затем между «>» и «<».

Я предпочитаю не использовать внешние сторонние библиотеки - если в этом нет необходимости - потому что вы также должны распространять библиотеку, вы полагаетесь на чужую программу, чтобы обезопасить свою, и если в их программном обеспечении есть уязвимость ваш тоже уязвим.

-2
ответ дан 8 December 2019 в 01:54
поделиться