使用 web.py 的 web.database 时应该如何防止滥用?

Posted

技术标签:

【中文标题】使用 web.py 的 web.database 时应该如何防止滥用?【英文标题】:How should I prevent abuse when using web.py's web.database? 【发布时间】:2012-01-16 21:20:00 【问题描述】:

我正在编写一个快速的 web.py 应用程序并从 web.input 中获取数据...

import web
urls = (
    '/', 'something',
)
app = web.application(urls, globals())
db = web.database(dbn='postgres', db='database', user='username', password='password', host='127.0.0.1')
class something:
    def GET(self):
        i = web.input()
        return db.select('foo.table', where="column=$variable", vars='variable':i.input, )
if __name__ == "__main__": app.run()

我是否应该担心将 i.input 传递给 db.select(或查询等),就像我作为 vars 的一部分一样? SQL 注入的可能性等?


编辑: 我自己一直在玩这个,试图让一些讨厌的事情发生。例如,使用引用http://localhost:8080/?id=13' or 'x' ='x 会在异常中显示很好的转义 sql:

<sql: 'select * from foo.table where id = "13\' or \'x\'=\'x"'>

我尝试了互联网提出的其他一些常见测试,并认为我很高兴 web.py 正在处理卫生问题......还有其他人可以发表评论吗?

【问题讨论】:

【参考方案1】:

http://webpy.org/cookbook/query 说:

为防止 SQL 注入攻击,db.query 还接受“vars” db.select 中描述的语法:

results = db.query("SELECT * FROM users WHERE id=$id", vars='id':10)

如果您信任他们的“id”,这将转义用户输入 变量。

所以我想就这么简单。

当然,我意识到如果我要在某些地方插入用户输入,我仍然需要验证用户输入...

【讨论】:

【参考方案2】:

您看到的“很好地转义的 sql”并不重要,因为它从未发送到数据库引擎。

在所有情况下,除非您手动将值插入 SQL 请求字符串,否则您可以安全地抵御 SQL 注入。这包括选择/插入/更新/删除方法以及$variable_name 替换样式。在这两种情况下,SQL 请求都没有完全组装为文本,而是正确地转换为 SQL 准备语句并由数据库引擎编译。只有在此之后,参数才会实际替换为语句执行。因此,除非您使用不受信任的数据手动构建 SQL 查询字符串和/或其中的一部分,否则您是安全的。

很遗憾,我无法提供比 the source code of the module 更好的任何来源的链接,因为它是我唯一的信息来源。

【讨论】:

【参考方案3】:

是的,因为有人可以更改变量,特别是如果它来自一个 url,例如“selecte * from table where id = [ variable + DELETE TABLE[。这是 sql 注入的一个示例。如果用户知道您的后端数据对象的名称。

我不确定 Python 将如何处理 sql 语句的变量参数化,但我必须对冷融合站点和 ASP.net 站点执行类似的安全修复。

【讨论】:

您提供的是通用答案,还是基于对 web.py 的真实了解?编辑:我从您的编辑中看到,这不是基于 web.py 知识...我怀疑发生的事情比我们知道的要多。 查看我对问题的编辑,例如,肯定有一些清理工作正在进行。我知道我可以遵循“查询方式”,但我不能指望知道如何测试每个可能的 SQL 注入。我正在寻找关于前者的建议,而不是后者。 如果你的web.py db模块正确,是不可能有SQL注入攻击的。 谢谢阿南德,但我问这个问题的全部目的是为了学习正确的方法......

以上是关于使用 web.py 的 web.database 时应该如何防止滥用?的主要内容,如果未能解决你的问题,请参考以下文章

web.py数据库操作方法指南 -《狗嗨默示录》-

webpy使用mysql数据库操作(web.database)

python--web.py使用

Python之Web2py框架使用

html5 web database

使用 web3.py 解码智能合约的返回值?