Если вы разрешаете вводить информацию пользователям, ее обязательно надо проверять. В простейшем случае можно просто обрезать все теги, как было показано в статье о валидации . Но, что, если некоторые теги (картинки, жирный, наклон, и т.д.), все-таки нужно разрешить? Хорошим примером проверки форм, служит 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>
Метки:appengine, HTML, OpenSource, Python
Похожие статьи
- 2 апреля 2010 -- AppEngine изучаем Request и globals (0)
- 2 апреля 2010 -- AppEngine валидация полей базы и формы (1)
- 19 мая 2010 -- Сюрприз от App Engine — Server Error (1)
- 30 июля 2010 -- DLR 1.0 на примере IronPython 2.6 (0)
- 31 марта 2010 -- Чистка тестовой App Engine базы. (0)


5 апреля, 2010 at 14:29
Попробуем на досуге :-). Интересный сайт stackoverflow.com, будем теперь ссылки спамеров только так вырезать.
14 мая, 2010 at 18:57
в рунете тоже есть сайт как stackoverflow, askdev.ru называется.
16 мая, 2010 at 17:15
В целом неплохо. Интересно было почитать
18 мая, 2010 at 13:06
Даже ссылки с href=»javascript:» не чистит. Или <IMG SRC=»jav ascript:alert(‘XSS’);»>. (это я немножко сам санитизировал — не знаю, как коммент будет выглядеть) Не говоря уже о том, что XSS можно сделать кодом, который html5lib не распарсит (а браузеры будут показывать). почитайте, много интересного узнаете. И это только начало.
18 мая, 2010 at 18:27
Странно, у меня чистит. Проверьте настройки.
19 мая, 2010 at 22:20
Еще раз на всякий случай проверил:
''' 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<SCRIPT DEFER>alert("XSS")</SCRIPT>"> <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
ascript:alert('XSS');"> <IMG SRC="jav	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 < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < \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> <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> <t:set attributename="innerHTML" to="XSS&lt;SCRIPT DEFER&gt;alert("XSS")&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> <img><script>alert("XSS")</script>"> <img> <img> <img> <a href="//google">XSS</a> <frameset><frame src="javascript:alert('XSS');"></frameset> <br> < %3C < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < \u003c \u003C <link rel="stylesheet" href="http://ha.ckers.org/xss.css"> <table> </table> <table><tbody><tr><td></td></tr></tbody></table> </div> tests.sanitize_test.sanitize_test ... ok ---------------------------------------------------------------------- Ran 1 test in 0.250s OK