2015-04-30 2 views
1

Я использую GoogleAppEngine со временем выполнения Python, и у меня очень простая форма контакта. Как я могу аннулировать представления, в которых поле содержит HTML?Недопустимый ввод формы, содержащий HTML

+0

Вы также должны искать синтаксис SQL. SQL-инъекция - очень распространенная проблема. – jirungaray

ответ

1

Попробуйте что-то вроде этого, используйте вход с поля и заполнить его в укусе, то вы можете удалить HTML теги из этой строки следующим образом:

Эта функция может лишить HTML для вас и приятно, поскольку она требует только STDLIB Python:

на Python 2

from HTMLParser import HTMLParser 

class MLStripper(HTMLParser): 
    def __init__(self): 
     self.reset() 
     self.fed = [] 
    def handle_data(self, d): 
     self.fed.append(d) 
    def get_data(self): 
     return ''.join(self.fed) 

def strip_tags(html): 
    s = MLStripper() 
    s.feed(html) 
    return s.get_data() 

Для Python 3

from html.parser import HTMLParser 

    class MLStripper(HTMLParser): 
     def __init__(self): 
     self.reset() 
     self.strict = False 
     self.convert_charrefs= True 
     self.fed = [] 
    def handle_data(self, d): 
     self.fed.append(d) 
    def get_data(self): 
     return ''.join(self.fed) 

def strip_tags(html): 
    s = MLStripper() 
    s.feed(html) 
    return s.get_data() 

Другой способ - пересечь начальные и конечные теги, найденные путем попытки проанализировать текст как HTML и пересечь этот набор с известным набором допустимых элементов HTML.

#!/usr/bin/env python 

from __future__ import print_function 

from HTMLParser import HTMLParser 


from html5lib.sanitizer import HTMLSanitizerMixin 


class TestHTMLParser(HTMLParser): 

    def __init__(self, *args, **kwargs): 
     HTMLParser.__init__(self, *args, **kwargs) 

     self.elements = set() 

    def handle_starttag(self, tag, attrs): 
     self.elements.add(tag) 

    def handle_endtag(self, tag): 
     self.elements.add(tag) 


def is_html(text): 
    elements = set(HTMLSanitizerMixin.acceptable_elements) 

    parser = TestHTMLParser() 
    parser.feed(text) 

    return True if parser.elements.intersection(elements) else False 


print(is_html("foo bar")) 
print(is_html("<p>Hello World!</p>")) 
print(is_html("<html><head><title>Title</title></head><body><p>Hello!</p></body></html>")) # noqa 

Выход:

$ python foo.py 
False 
True 
True 

Вы можете подтвердить представление в соответствии с истинным/ложным значением, возвращенным. Вам необходимо будет реализовать свою логику и процесс, конечно,

0

Вы должны посмотреть на wtforms. Это отличный инструмент для проверки форм и работает с GAE/P.

С помощью wtforms вы можете написать собственные валидаторы для ввода форм. Один очень всеобъемлющий, но потенциально используемый валидатор будет состоять в том, чтобы отклонить входы формы, которые содержат < или >.

Смежные вопросы