【问题标题】:How to do neo4j parameter safe for Ruby on Rails?如何为 Ruby on Rails 做 neo4j 参数安全?
【发布时间】:2018-01-24 06:15:58
【问题描述】:
比如句子是"I'm playing football"
参数需要为"I\'m playing football",单引号指向neo4j架构...
我尝试了variable.html_safe,但不幸的是,它不起作用。
运行时信息:
Neo4j database version: neo4j 3.3.1
neo4j gem version: 9.0.7
neo4j-core gem version: 8.1.0
【问题讨论】:
标签:
ruby-on-rails
ruby
database
neo4j
nosql
【解决方案1】:
对于参考,这是在 an issue 的 neo4j 存储库中回答的。在此处复制/粘贴:
您可以做一些事情。我要说的第一件事是你永远不应该(或至少很少)将数据直接注入查询字符串。可以是:
- 如果您对字符串进行了不适当的转义,则会出现问题
- 很慢,因为 Neo4j 无法在查询字符串每次更改时优化查询计划
- 如果此数据来自用户,则不安全,因为他们可能会产生 Cypher 注入攻击
理想情况下,sqlParametre 应该是一个数组,以便您可以这样做:
tablo = Word.query_as(:w).where('w.ad IN {ads}').params(ads: sqlParametre)
# or as a shortcut:
tablo = Word.query_as(:w).where('w.ad IN ?', sqlParametre)
但是由于您有一个ActiveNode 模型,您还可以在更高级别上工作并将第 89 行和第 91 行替换为:
kayitSayisi = Word.as(:w).where(ad: sqlParametre).pluck('SUM(w)').first
请注意最后一行,如果 sqlParametre 是一个数组,neo4j gem 会自动检测并创建 Cypher 语法 WHERE w.ad IN {param} 而不是 WHERE w.ad = {param}