一次逃脱整个字典/ JSON

时间:2017-01-05 11:51:57

标签: python mysql json dictionary

我构建了一个简单的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(),但在阅读文档时也无法使用它。

有人知道一次摆脱整个输入的方法吗?

1 个答案:

答案 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

使用这种方法,你根本不需要逃避任何东西,而且它更短更整洁。