我正在编写一个快速的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正在处理卫生问题......还有其他人可以评论吗?
答案 0 :(得分:6)
http://webpy.org/cookbook/query说:
为防止SQL注入攻击,db.query也接受“vars” db.select中描述的语法:
results = db.query("SELECT * FROM users WHERE id=$id", vars={'id':10})
如果您信任“id”,这将逃脱用户输入 变量
所以我猜它就这么简单。
当然我意识到如果我要插入地方,我仍然需要验证用户输入......
答案 1 :(得分:4)
你看到的“很好转义的sql”无关紧要,因为它从未发送到数据库引擎。
在所有情况下,除非您手动将值插入SQL请求字符串,否则您可以安全地防止SQL注入。这包括select / insert / update / delete方法以及$variable_name
替换样式。在这两种情况下,SQL请求都没有完全组装为文本,而是正确转换为SQL预处理语句并由数据库引擎编译。只有在那之后,参数实际上才被替换为语句执行。因此,除非您使用不受信任的数据手动构建SQL查询字符串和/或部分内容,否则您将是安全的。
很遗憾,我无法提供超过the source code of the module的任何来源的链接,因为它是我唯一的信息来源。
答案 2 :(得分:-1)
是的,因为有些人可以改变变量,特别是如果它来自一个url来说“selecte * from table where table = [variable + DELETE TABLE [。这是一个sql注入的例子。这是特别关键的,如果用户知道您的后端数据对象的名称。
我不确定Python如何处理sql语句的变量参数化,但我必须为冷融合站点和ASP.net站点执行类似的安全修复。