【问题标题】:appengine datastore query escaping single quote (')appengine 数据存储区查询转义单引号 (')
【发布时间】:2012-03-04 03:28:32
【问题描述】:

我在这里使用过 javax.jdo.Query JDO for Google App Engine: escaping quotes。然而,我的带有单引号 (') 的查询字符串一直在爆炸。

Query query = pm.newQuery("select from " + Book.class.getName() + " where mArtist== '"+ artist + "' &&  mTitle=='" + title + "'");

这里是例外

javax.jdo.JDOUserException: Portion of expression could not be parsed: 't Give Up' 
org.datanucleus.store.query.QueryCompilerSyntaxException: Portion of expression could not be parsed: 't Give Up'

这是 query.toString()

SELECT FROM com.example.Book WHERE mArtist== 'Famous Writer' &&  mTitle=='We Won''t Give Up'

是的,我什至根据 appengine 文档用双单引号转义了单引号(')

a str literal, as a single-quoted string. Single-quote characters in the string must be escaped as ''. For example: 'Joe''s Diner'

【问题讨论】:

  • “爆炸”是什么意思?到底发生了什么?
  • 对不起。有点戏剧性,忘记触发的异常。我已经用异常更新了帖子。

标签: java sql google-app-engine jdo


【解决方案1】:

通过字符串连接构建查询几乎总是有风险的事情,即使 SQL 注入攻击是不可能的。 (他们不使用 GAE。)

请参阅http://code.google.com/appengine/docs/java/datastore/jdo/queries.html#Introducing_Queries 并注意“参数替换”部分。

【讨论】:

    【解决方案2】:

    文档中的示例代码仅涉及单个参数替换。这里还有一点。

    Query query = pm.newQuery(Book.class);
    query.setFilter("mArtist == artist && mTitle == title");
    query.declareParameters("String artist,String title");              
    List<Book> list = (List<Book>) query.execute("Famous Writer","We Won't Give Up");
    

    一些值得一读的 SO 问题:

    How to dynamically build JDO Queries on multiple parameters

    Google Datastore problem with query on *User* type

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-16
      • 2012-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多