【发布时间】:2014-11-11 16:36:33
【问题描述】:
我在 CQL 的地图中存储了一些东西,我想允许使用键删除该地图中的特定内容。密钥是通过 API 从上面传入的,因此客户端可以传入任何它想要的内容。这是解释我的情况的一段代码...
func GenerateTrackingIdForDelete(tracking_id string) string {
if (tracking_id == "") {
return ""
} else {
return "['" + tracking_id + "']"
}
}
func DeleteAllTrackingURLs(qstringVars map[UrlKey]interface{},reqVars map[string]string, filter string, tracking_id string) error {
derr := cpool_new.Query("DELETE tracking_urls" + GenerateTrackingIdForDelete(tracking_id) + ` FROM template WHERE vendor_id = ? and advertiser_id = ? and filter = ? and template_id = ? and inst_id = ?`, qstringVars[VendorKey], qstringVars[AdvertiserKey], filter, reqVars["template_id"], reqVars["inst_id"]).Exec()
if derr != nil {
return errors.New("Failed to delete all under inst_id/template_id/filter/advertiser_id/vendor_id " + reqVars["inst_id"] + "/" + reqVars["template_id"] + "/" + filter + "/" + strconv.Itoa(qstringVars[AdvertiserKey].(int)) + "/" + strconv.Itoa(qstringVars[VendorKey].(int)) + " with error " + derr.Error())
}
return nil
}
以下是在 CQL 中从地图中删除的一些背景知识:http://www.datastax.com/documentation/cql/3.0/cql/cql_using/use_map_t.html
这里有一些可能的解决方案,但是有什么更清洁的吗?
- 有人可以只传入一个带有单引号的键,它会中断查询。我可以用另一个单引号转义每个单引号,但这足够了吗?这种方法是否不好,因为 gocql 必须在每次删除时为查询准备语句?
- 实际上获取那里的内容并在内存中对其进行修改并插入(从而更新记录)。缺点是要写入更多数据。
- 有两个单独的查询(一个用于要删除特定键的情况,另一个用于要删除整个地图的情况)。这里的缺点是代码重复。
【问题讨论】:
标签: go escaping cql code-injection