龙卷风:get_argument - 我应该自己逃避输入吗?

时间:2012-11-14 13:21:22

标签: python database sql-injection tornado

我正在为单页应用程序运行Tornado Web服务器。客户端正在POST到服务器,我正在使用tornado.web.RequestHandler.get_argument()来获取输入。

测试时,我似乎无法强制SQL注入错误。看起来get_argument()以某种方式逃脱了输入。从登录表单(用户名+密码)进行POST时,我尝试了各种技巧来强制进行简单的SQL注入,但无济于事。

EDIT2:

HAH!我最终设法做了一个SQL注入:D我URL转义了一些输入,我可以看到注入的SQL语句一直到数据库模块。 我从登录表单生成的查询没有被提交,因为它应该是一个SELECT语句 - 所以我实际上无法改变数据库。

如果查询永远不会被提交并且整个查询的输出(包括注入的)被隐藏,那么可以造成什么样的损害?

例如,如果该查询应该是,请说SELECT * FROM Users WHERE UserID='USERNAME' AND Password='PASSWORD';但是用户名的输入已注入INSERT,因此USERNAME变为USERNAME'; INSERT INTO Users (UserID, Password) VALUES ('hacker', 'hacked'); --我们最终得到:

SELECT * FROM Users WHERE UserID='USERNAME'; INSERT INTO Users (UserID, Password) VALUES ('hacker', 'hacked'); --' AND Password='PASSWORD';

我一般都知道SQL注入的危险,我对这个细节很好奇。我也知道我应该哈希和盐密码,上面的代码是为了示例的简化。

1 个答案:

答案 0 :(得分:5)

Tornado只会逃避模板中的字符串以避免HTML问题。如果您只是执行print self.get_argument('ihack')之类的操作,您将获得发送的原始字符串。

你应该使用带有注入预防的MySQLdb:

 cursor.execute("SELECT * FROM user_info WHERE email = %s", email)

而不是:

 cursor.execute("SELECT * FROM user_info WHERE email = %s" % email)   # BAD!

这将保护您的SQL,就像模板保护您的HTML一样。