我正在为单页应用程序运行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注入的危险,我对这个细节很好奇。我也知道我应该哈希和盐密码,上面的代码是为了示例的简化。
答案 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一样。