python - Tornado :get_argument——我应该自己转义输入吗?

标签 python database sql-injection tornado

我正在为单页应用程序运行 Tornado 网络服务器。客户端正在向服务器发送消息,我正在使用 tornado.web.RequestHandler.get_argument() 获取输入。

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

编辑2:

哈哈!我终于设法进行了一次 SQL 注入(inject) :D 我对一些输入进行了 URL 转义,我可以看到注入(inject)的 SQL 语句一直到 DB 模块。 我从登录表单生成的查询没有被提交,因为它只是一个 SELECT 语句——所以我实际上不能改变数据库。

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

例如,如果查询应该是 SELECT * FROM Users WHERE UserID='USERNAME' AND Password='PASSWORD'; 但是用户名的输入注入(inject)了 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 密码='密码';

我知道一般的 SQL 注入(inject)的危险,我只是对这个细节感到好奇。我也知道我应该散列和加盐密码,上面的代码是为了示例而进行的简化。

最佳答案

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

您应该使用带有注入(inject)预防功能的 MySQLdb:

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

而不是:

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

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

关于python - Tornado :get_argument——我应该自己转义输入吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13379631/

相关文章:

python - 用空格替换前导和尾随连字符?

python - 计算 Pandas 中最小值和最大值之间的行数

database - 尝试使用随机数据更新列时出现 ORA-06502

python - 如何测量 Python 请求 POST 请求的服务器响应时间

python - 如何填充python中几条曲线之间的区域?

.net - 将图像存储在数据库或系统文件中?

两个FK有关系时的数据库设计和规范化

php - 如果我在执行函数中绑定(bind)参数,我的PDO准备语句是否安全?

php - 基本的 SQL 注入(inject)?

java - JAVA 字符串的 SQL 注入(inject)模拟