我构建了一个简单的Python API,它接收来自客户端的字符串和数值的JSON字典。
为了保护我的系统并避免MySQL注入我在使用f.ex时错过了字符串:
jsonInput = request.get_json(force=True, silent=True) # INPUT FROM HTTP POST REQUEST
# ESCAPING STRING BY STRING
flowerColor = MySQLdb.escape_string(jsonInput['flowerColor'])
flowerSize = MySQLdb.escape_string(jsonInput['flowerSize'])
query = "SELECT * FROM flowers WHERE color='" + flowerColor + "' AND size='" + flowerSize + "'"
try:
conn = // CONNECT TO DB
cursor = conn.cursor()
cursor.execute(query)
return cursor.fetchall()
except MySQLdb.IntegrityError:
return False
在我看来,如果有一种方法可以立即转义整个输入,那么这将更容易,因此JSON中的每个字符串都可以在MySQL查询中的escape方法之后直接使用。例如:
jsonInput = request.get_json(force=True, silent=True) # INPUT FROM HTTP POST REQUEST
# ESCAPING WHOLE JSON AT ONCE
escapedJSON = escape_json_at_once(jsonInput)
query = "SELECT * FROM flowers WHERE color='" + escapedJSON['flowerColor'] + "' AND size='" + escapedJSON['flowerSize'] + "'"
try:
// EXECUTE THE QUERY
except MySQLdb.IntegrityError:
return False
// DO OTHER QUERIES WITH ESCAPED JSON DATA
我已经找到了方法MySQLdb.escape_dict()
,但在阅读文档时也无法使用它。
有人知道一次摆脱整个输入的方法吗?
答案 0 :(得分:2)
是的,确实有更好的方法
jsonInput = request.get_json(force=True, silent=True) # INPUT FROM HTTP POST REQUEST
query = "SELECT * FROM flowers WHERE color=%s AND size=%s"
try:
conn = // CONNECT TO DB
cursor = conn.cursor()
cursor.execute(query, ( jsonInput['flowerColor'],jsonInput['flowerSize']) )
return cursor.fetchall()
except MySQLdb.IntegrityError:
return False
使用这种方法,你根本不需要逃避任何东西,而且它更短更整洁。