3

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

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

编辑2:

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

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

例如,如果查询应该是,但是用户名的SELECT * FROM Users WHERE UserID='USERNAME' AND Password='PASSWORD';输入有一个 INSERT 注入,所以我们最终得到:USERNAMEUSERNAME'; 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 注入的危险,我只是对这个细节感到好奇。我也知道我应该散列和加盐密码,上面的代码是为了示例而进行的简化。

4

1 回答 1

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 一样。

于 2012-11-14T23:31:13.643 回答