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注入的危险,我只是对这个细节感到好奇.我也知道我应该哈希和盐密码,上面的代码是为了示例的简化.
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一样.
| 归档时间: |
|
| 查看次数: |
1991 次 |
| 最近记录: |