【发布时间】:2017-10-07 00:39:57
【问题描述】:
我一直在为 c# 使用带有 neo4j 客户端的 WithParams,但 withParams 不适用于标签或关系类型。
我当时想到的替代方法是连接我想要基于某个标签作为参数形成的字符串,然后构造密码查询。那就是:
string optionalMatchString = $"p =(n1)-[{relationshipsString}]-(n2)";
graphClient.Cypher.Match("(n1)")
.Where((Node n1) => n1.Identifier == identifier)
.OptionalMatch(optionalMatchString)
你可以猜到,relationshipString 是传递给我的一个参数。如果我使用 WithParams 查询将不会替换参数,所以现在我连接字符串,但这很容易受到攻击......(是吗?)
我了解了APOC,看到了this issue
这是我看到的一个例子this:
CALL db.labels() yield label
call apoc.cypher.run("MATCH (n:`"+label+"`) RETURN keys(n) as keys LIMIT 1",{}) yield value as row
RETURN label, row.keys as keys
显然,有一个名为 cypher.run 的 APOC 程序,我可以在其中将我的标签(或相关的关系)作为变量(来自参数),但据我所见,它们只是连接一个字符串......那和我一直在做的一样吗?或者 APOC 是否以某种方式在查询之上执行其他操作? APOC 程序对注射是否“安全”?
【问题讨论】:
-
您的数据库中是否有一组预定义的关系?如果这样做,您可以将关系类型列入白名单,即检查它是否是可能的关系类型的成员。如果不是,请拒绝该请求。
-
我有它作为备份,但我不想绕过那条路线。必须有一个 wat 来避免用这个来注入 neo4j...
标签: c# stored-procedures neo4j neo4jclient neo4j-apoc