首页 / 知识
关于xss:使用Python清理用户输入
2023-04-12 13:28:00

Sanitising user input using Python清理基于Python的Web应用程序的用户输入的最佳方法是什么? 是否有一个函数可以删除HTML字符和任何其他必要的字符组合,以防止XSS或SQL注入攻击?
这是一个片段,它将删除不在白名单上的所有标签,并且所有标签属性都不在attribues白名单上(因此您不能使用
它是http://www.djangosnippets.org/snippets/205/的修改版本,其中包含属性值的正则表达式以防止人们使用 如您所见,它使用(真棒)BeautifulSoup库。
正如其他海报所说的那样,几乎所有的Python数据库都会处理SQL注入,因此这应该会覆盖你。 编辑:漂白是html5lib的包装,这使得它更容易用作基于白名单的杀菌剂。
现在我在Stack Overflow clone的 http://code.google.com/p/soclone/source/browse/trunk/soclone/utils/html.py 我抛出ha.ckers.org的XSS Cheatsheet中列出的所有攻击(在使用python-markdown2执行Markdown到HTML转换之后可以轻松地以XML格式提供它,它似乎已经保持正常。 Stackoverflow目前使用的WMD编辑器组件是一个问题,但实际上我必须禁用JavaScript才能测试XSS Cheatsheet攻击,因为将它们全部粘贴到WMD中最终会给我提醒警告框并消隐页面。
防止XSS的最佳方法不是尝试过滤所有内容,而是简单地进行HTML实体编码。例如,自动转入
如果您只是构建一个查询字符串,SQL注入与其他观点相反仍然是可能的。例如,如果您只是将传入参数连接到查询字符串,那么您将拥有SQL注入。防止这种情况的最佳方法也不是过滤,而是虔诚地使用参数化查询并且永远不会连接用户输入。
这并不是说过滤不是最佳实践,但就SQL注入和XSS而言,如果您虔诚地使用参数化查询和HTML实体编码,您将受到更多保护。
Jeff Atwood自己描述了StackOverflow.com如何在Stack Overflow博客上清理用户输入(以非语言特定术语):http://blog.stackoverflow.com/2008/06/safe-html-and-xss/
但是,正如Justin指出的那样,如果您使用Django模板或类似的东西,那么他们可能无论如何都要清理您的HTML输出。
SQL注入也不应该是一个问题。所有Python的数据库库(MySQLdb,cx_Oracle等)总是清理你传递的参数。所有Python的对象关系映射器(例如Django模型)都使用这些库,因此您不必担心那里的卫生设施。
我不再进行Web开发,但是当我这样做时,我做了类似的事情:
当没有解析应该发生时,我通常只是逃避数据,以便在我存储数据时不干扰数据库,并且从数据库中读取所有内容,以便在显示时不干扰html(cgi.escape()inPython)。
有可能,如果有人试图输入html字符或东西,他们实际上希望无论如何都要显示为文本。如果他们没有,那就太难了:)
总之,总是逃避可能影响当前数据目标的东西。
当我确实需要一些解析(标记或其他)时,我通常会尝试将该语言保存在与html不相交的集合中,因此我仍然可以将其存储为适当的转义(在验证语法错误之后)并在显示时将其解析为html不得不担心用户放在那里干扰你的HTML的数据。
另请参阅转义HTML
要清理要存储到数据库的字符串输入(例如客户名称),您需要将其转义或从中明确删除任何引号(',")。这有效地防止了经典SQL注入,如果您正在从用户传递的字符串中组装SQL查询。
例如(如果可以完全删除引号):
如果您使用的是像django这样的框架,框架可以使用标准过滤器轻松地为您完成此操作。事实上,我很确定django会自动执行它,除非你告诉它不要。 否则,我建议在接受表单输入之前使用某种正则表达式验证。我不认为你的问题有灵丹妙药,但使用re模块,你应该能够构建你需要的东西。 |
最新内容
相关内容
python读入不定行字符的问题
python读入不定行字符的问题,培训,字符,问题,方法,头尾,示例,空格,字符串,序列,结尾,python读入不定行字符的问题解决:stdin.readline()会读取python如何检测字符串是不是全为字
python如何检测字符串是不是全为字母?,检测,培训,字符串,字母,方法,字符,示例,语法,以上,更多,python中可以使用isalpha()方法检测字符串是不Python文件如何转换为字符串
Python文件如何转换为字符串,数据,主体,名字,培训,文件,字符串,末尾,方法,对象,语句,python文件如何转换为字符串的方法:一、最方便的方法是一python如何输入序列
python如何输入序列,名称,数据,合法,培训,列表,函数,赋值,序列,变量,语法,Python创建列表在Python中,创建列表的方法可分为2种,下面分别进行介python如何输入坐标
python如何输入坐标,对比,培训,坐标,直角坐标,表示,增减,字典,下面,方向,以上,python利用元组、字典可以表示坐标增减,具体做法为:defchange_dipython中字符串怎么转换成int
python中字符串怎么转换成int,情况,培训,字符串,浮点,错误,类型,不是,臣妾,字面,函数,将字符串转换成,整型,从字面理解很容易让人误会。比如,要python如何判断字符不为空
python如何判断字符不为空,培训,字符串,字符,类型,变量,以上,方式,方法,更多,内容,python中判断字符串是否为空的方法变量为字符串类型(优雅python怎样计算输入的字符串的长度
python怎样计算输入的字符串的长度,培训,字符串,长度,字典,函数,列表,空格,语法,字符,实例,python中的字符串。可以使用len()函数来计算长度,python如何截断字符串
python如何截断字符串,培训,位置,字符,字符串,索引,倒数,依此类推,方括号,后面,表示,字符串本质上就是由多个字符组成的,Python允许通过索引来python字符串怎么替换
python字符串怎么替换,培训,字符串,参数,函数,方法,使用方法,语法,实例,以上,以下,python中的字符串替换,主要是使用replace()函数。replace()python怎么循环输入
python怎么循环输入,培训,语句,条件,双数,表达式,详解,两者,命令,下面,次数,python中的循环语句,可使用for循环,或者while循环。两者的区别是,fopython如何判断输入是不是数字
python如何判断输入是不是数字,数字,异常,培训,字符,表示,字符串,不是,正则,方法,字母,python判断输入是不是数字的方法:在接收raw_input方法