go - 需要使用golang从CQL映射中删除,但要避免CQL注入

  显示原文与译文双语对照的内容

我把东西存储在CQL的地图中,我想允许在地图中使用键删除特定的东西。 关键是通过 上面 从传入,所以客户端可以传递任何想要的东西。 下面是一段解释我的情况的代码 Fragment 。


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的地图上删除的一些 background: http://www.datastax.com/documentation/cql/3.0/cql/cql_using/use_map_t.html

这里有一些可能的解决方法,但是有什么更?

  • 有人只能通过单引号传入一个键,而且它会断开查询。 我可以用另一个单引号转义每个单引号,但这足够了? 因为gocql必须为每次删除的查询准备语句,所以这种方法是坏的?
  • 实际上获得内存并在内存中修改它并插入( 从而更新记录) 。 这里的缺点是写了更多的数据。
  • 有两个单独的查询( 一个对于要删除的特定键的情况,另一个用于删除整个地图的情况)的。 这里的缺点是代码复制。
时间: 原作者:

最好的是,目前,你必须自己构建查询,以便在Cassandra映射中执行补丁操作。

对于一般用途,最安全的方法是第二个建议;编组完整地图值,操纵它并执行插入/更新操作。

如果严格定义了地图 [x] y,换句话说,地图 [int] int i 将没有构建我自己的查询的问题。

...