Картинка блога

Если вы разрешаете вводить информацию пользователям, ее обязательно надо проверять. В простейшем случае можно просто обрезать все теги, как было показано в статье о валидации . Но, что, если некоторые теги (картинки, жирный, наклон, и т.д.), все-таки нужно разрешить? Хорошим примером проверки форм, служит stackoverflow.com и конечно сотни тысяч других. Первый меня заинтересовал прежде всего по тому, что существует его свободный клон на Python (оригинал-же работает на технологии .NET).

Основная задача санитара HTML — пропустить теги и аттрибуты, которые присутствуют в белом листе, и исключить или преобразовать все остальные. Из Питонового клона stackoverflow нас интересует конфигурация дезинфицирования HTML. Он работает использую библиотеку html5lib, логическое продолжение BeautyfulSoup. Качаем все это дело к себе в проект.

Кстати, с самого начала я нашел appengine-html-whitelist. — этот дезинфектор выполнен как сервис, которые получает HTML как параметр и возвращает очищенный на основе правил HTML в разных форматах. Проверьте, возможно это то, что вам надо.

Использовать санитара очень просто:

def sanitize(request):
 data = request.POST.get('data', None)
 if data: data = utility.html.sanitize_html(data)
 return utility.respond(request, "internal/sanitize.html", {"data":data})

И соответственно шаблон:


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
{{ data }}
<form method="post" action="">
<textarea name="data" COLS=40 ROWS=6>{{ data }}</textarea>
<input type="submit" value="submit">
</form>
</body>
</html>

Метки:, , ,

6 комментариев в “Чистим HTML в AppEngine (Sanitize HTML)”

  1. Попробуем на досуге :-). Интересный сайт stackoverflow.com, будем теперь ссылки спамеров только так вырезать.

  2. в рунете тоже есть сайт как stackoverflow, askdev.ru называется.

  3. В целом неплохо. Интересно было почитать

  4. Александр Ходырев
    18 мая, 2010 at 13:06

    Даже ссылки с href=»javascript:» не чистит. Или <IMG SRC=»jav ascript:alert(‘XSS’);»>. (это я немножко сам санитизировал — не знаю, как коммент будет выглядеть) Не говоря уже о том, что XSS можно сделать кодом, который html5lib не распарсит (а браузеры будут показывать). http://ha.ckers.org/xss.html почитайте, много интересного узнаете. И это только начало.

  5. Странно, у меня чистит. Проверьте настройки.

  6. Еще раз на всякий случай проверил:

    '''
    Created on 19.05.2010
    
    @author: Ikutsin
    '''
    from utility import html
    from nose.tools import eq_
    from nose.plugins.attrib import attr
    
    
    @attr('debug')
    def sanitize_test():
        data = '''
    <!--[if gte IE 4]>
    <SCRIPT>alert('XSS');</SCRIPT>
    <![endif]-->
    <DIV STYLE="background-image:\0075\0072\006C\0028'\006a\0061\0076\0061\0073\0063\0072\0069\0070\0074\003a\0061\006c\0065\0072\0074\0028.1027\0058.1053\0053\0027\0029'\0029">
    <OBJECT classid=clsid:ae24fdae-03c6-11d1-8b76-0080c744f389><param name=url value=javascript:alert('XSS')></OBJECT>
    <EMBED SRC="http://ha.ckers.org/xss.swf" AllowScriptAccess="always"></EMBED>
    <EMBED SRC="data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hs aW5rIiB2ZXJzaW9uPSIxLjAiIHg9IjAiIHk9IjAiIHdpZHRoPSIxOTQiIGhlaWdodD0iMjAw IiBpZD0ieHNzIj48c2NyaXB0IHR5cGU9InRleHQvZWNtYXNjcmlwdCI+YWxlcnQoIlh TUyIpOzwvc2NyaXB0Pjwvc3ZnPg==" type="image/svg+xml" AllowScriptAccess="always"></EMBED>
    <?xml:namespace prefix="t" ns="urn:schemas-microsoft-com:time">
    <?import namespace="t" implementation="#default#time2">
    <t:set attributeName="innerHTML" to="XSS&lt;SCRIPT DEFER&gt;alert(&quot;XSS&quot;)&lt;/SCRIPT&gt;">
    <IMG SRC="http://www.thesiteyouareon.com/somecommand.php?somevariables=maliciouscode">
    <A HREF="http://%77%77%77%2E%67%6F%6F%67%6C%65%2E%63%6F%6D">XSS</A>
    <SCRIPT SRC=http://ha.ckers.org/xss.js></SCRIPT>
    <IMG SRC=javascript:alert('XSS')>
    <IMG """><SCRIPT>alert("XSS")</SCRIPT>">
    <IMG SRC="jav&#x0A;ascript:alert('XSS');">
    <IMG SRC="jav&#x09;ascript:alert('XSS');">
    <IMG SRC="jav    ascript:alert('XSS');">
    <A HREF="//google">XSS</A>    
    <TABLE BACKGROUND="javascript:alert('XSS')">
    <FRAMESET><FRAME SRC="javascript:alert('XSS');"></FRAMESET>
    <BR SIZE="&{alert('XSS')}">
    <
    %3C
    &lt
    &lt;
    &LT
    &LT;
    &#60
    &#060
    &#0060
    &#00060
    &#000060
    &#0000060
    &#60;
    &#060;
    &#0060;
    &#00060;
    &#000060;
    &#0000060;
    &#x3c
    &#x03c
    &#x003c
    &#x0003c
    &#x00003c
    &#x000003c
    &#x3c;
    &#x03c;
    &#x003c;
    &#x0003c;
    &#x00003c;
    &#x000003c;
    &#X3c
    &#X03c
    &#X003c
    &#X0003c
    &#X00003c
    &#X000003c
    &#X3c;
    &#X03c;
    &#X003c;
    &#X0003c;
    &#X00003c;
    &#X000003c;
    &#x3C
    &#x03C
    &#x003C
    &#x0003C
    &#x00003C
    &#x000003C
    &#x3C;
    &#x03C;
    &#x003C;
    &#x0003C;
    &#x00003C;
    &#x000003C;
    &#X3C
    &#X03C
    &#X003C
    &#X0003C
    &#X00003C
    &#X000003C
    &#X3C;
    &#X03C;
    &#X003C;
    &#X0003C;
    &#X00003C;
    &#X000003C;
    \x3c
    \x3C
    \u003c
    \u003C
    <LINK REL="stylesheet" HREF="http://ha.ckers.org/xss.css">
    <TABLE><TD BACKGROUND="javascript:alert('XSS')">
    <TABLE><TD BACKGROUND="javascript:alert('XSS')"></td></table>
    '''
        print (html.sanitize_html(data)) 
    

    На выходе:

    
    
    <div>
    &lt;object classid="clsid:ae24fdae-03c6-11d1-8b76-0080c744f389"&gt;&lt;param name="url" value="javascript:alert('XSS')"&gt;&lt;/object&gt;
    &lt;embed src="http://ha.ckers.org/xss.swf" allowscriptaccess="always"&gt;&lt;/embed&gt;
    &lt;embed src="data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hs aW5rIiB2ZXJzaW9uPSIxLjAiIHg9IjAiIHk9IjAiIHdpZHRoPSIxOTQiIGhlaWdodD0iMjAw IiBpZD0ieHNzIj48c2NyaXB0IHR5cGU9InRleHQvZWNtYXNjcmlwdCI+YWxlcnQoIlh TUyIpOzwvc2NyaXB0Pjwvc3ZnPg==" type="image/svg+xml" allowscriptaccess="always"&gt;&lt;/embed&gt;
    
    
    &lt;t:set attributename="innerHTML" to="XSS&amp;lt;SCRIPT DEFER&amp;gt;alert("XSS")&amp;lt;/SCRIPT&amp;gt;"&gt;
    <img src="http://www.thesiteyouareon.com/somecommand.php?somevariables=maliciouscode">
    <a href="http://%77%77%77%2E%67%6F%6F%67%6C%65%2E%63%6F%6D">XSS</a>
    &lt;script src="http://ha.ckers.org/xss.js"&gt;&lt;/script&gt;
    <img>
    <img>&lt;script&gt;alert("XSS")&lt;/script&gt;"&gt;
    <img>
    <img>
    <img>
    <a href="//google">XSS</a>    
    &lt;frameset&gt;&lt;frame src="javascript:alert('XSS');"&gt;&lt;/frameset&gt;
    <br>
    &lt;
    %3C
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    &lt;
    \u003c
    \u003C
    &lt;link rel="stylesheet" href="http://ha.ckers.org/xss.css"&gt;
    <table>
    </table>
    <table><tbody><tr><td></td></tr></tbody></table>
    </div>
    tests.sanitize_test.sanitize_test ... ok
    
    ----------------------------------------------------------------------
    Ran 1 test in 0.250s
    
    OK