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

Mor*_*sen 3 python database sql-injection tornado

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

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

EDIT2:

哈!我最终设法做了一个SQL注入:DI 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注入的危险,我只是对这个细节感到好奇.我也知道我应该哈希和盐密码,上面的代码是为了示例的简化.

kob*_*las 5

Tornado只会逃避模板中的字符串以避免HTML问题.如果您正在做类似的事情,print self.get_argument('ihack')您将获得发送的原始字符串.

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

 cursor.execute("SELECT * FROM user_info WHERE email = %s", email)
Run Code Online (Sandbox Code Playgroud)

而不是:

 cursor.execute("SELECT * FROM user_info WHERE email = %s" % email)   # BAD!
Run Code Online (Sandbox Code Playgroud)

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