我在Python运行时使用GoogleAppEngine,我有一个非常简单的联系表单。如何使字段包含HTML的提交无效?
答案 0 :(得分:1)
尝试这样的事情,使用字段中的输入并将其填充到sting中然后您可以从该字符串中删除HTML标记,如下所示:
这个函数可以为你剥离HTML并且很好,因为它只需要Python stdlib:
在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
然后,您可以根据返回的true / false值验证提交。您必须实现自己的逻辑和过程
答案 1 :(得分:0)
你应该看看wtforms。它是验证表单的一个很好的工具,它适用于GAE / P.
使用wtforms,您可以为表单输入编写自定义验证器。一个非常过度包容但可能有用的验证器是拒绝其中包含<
或>
的表单输入。