使包含HTML的表单输入无效

时间:2015-04-30 09:28:46

标签: python validation google-app-engine

我在Python运行时使用GoogleAppEngine,我有一个非常简单的联系表单。如何使字段包含HTML的提交无效?

2 个答案:

答案 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,您可以为表单输入编写自定义验证器。一个非常过度包容但可能有用的验证器是拒绝其中包含<>的表单输入。