【发布时间】:2017-10-10 14:02:27
【问题描述】:
我有一个不寻常的场景,但除了我的sql 参数之外,我还需要让用户/API 定义表列名称。我对params 的问题是查询结果:
SELECT device_id, time, 's0' ...
而不是
SELECT device_id, time, s0 ...
还有其他方法可以通过raw 做到这一点,还是我需要自己转义该列?
queryset = Measurement.objects.raw(
'''
SELECT device_id, time, %(sensor)s FROM measurements
WHERE device_id=%(device_id)s AND time >= to_timestamp(%(start)s) AND time <= to_timestamp(%(end)s)
ORDER BY time ASC;
''', {'device_id': device_id, 'sensor': sensor, 'start': start, 'end': end})
【问题讨论】:
-
允许用户指定模式元素(而不是查询值)通常是使用字符串连接的原因,即使我们都经常被告知“永远不要这样做”。好消息是模式元素的超集是有限的。因此,您实际上不必包含未转义的用户输入。您可以根据已知的模式元素(硬编码或从数据库中动态查询)创建“有效”用户输入列表,将用户输入与该列表进行比较,如果找到匹配项,则将该匹配值连接到原始 SQL。
-
这是一个好主意,我实际上可以用一个简单的正则表达式来实现。
-
哦,如果这就是你要找的东西,那么我可以把它写下来作为答案。
标签: python django postgresql django-rest-framework sql-injection