【问题标题】:Need to delete from a CQL map using golang, but want to avoid CQL injection需要使用 golang 从 CQL 映射中删除,但希望避免 CQL 注入
【发布时间】: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


    【解决方案1】:

    据我所知,目前,您必须自己构建查询才能在 Cassandra 地图上执行修补操作。

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

    如果你的 map[x]y 是严格定义的;即 map[int]int 我构建自己的查询没有问题 - 但这还有其他问题,例如没有利用准备好的语句。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-13
      • 1970-01-01
      • 2020-10-05
      • 2018-04-18
      • 2012-10-24
      • 2014-10-18
      • 2013-10-04
      • 2015-01-22
      相关资源
      最近更新 更多