我有像
这样的数据访问功能public IList<NodeType> GetNodesByProperties(IDictionary<string, string> properties)
返回所有属性匹配的所有neo4j节点。
我找不到任何通过neo4jclient进行此类搜索的官方方法。我写了一个函数:
public IList<NodeType> GetNodesByProperties(IDictionary<string, string> properties)
{
var baseQuery = neo4jclient.Cypher
.Match("(node:NodeType)")
.Where("true");
foreach (var tupple in properties)
baseQuery = baseQuery.AndWhere($"node.{tupple.Key} = \"{tupple.Value}\"");
var resultQuery = baseQuery
.Return(node => node.As<NodeType>());
return resultQuery.Results;
}
哪种方法有效,但这会产生明显的Cypher注入攻击风险,因为该函数会将原始文本直接插入到Cypher查询中。
如何安全地搜索任何节点属性?
答案 0 :(得分:1)
如果您不想构建字符串/连接,则可以在查询期间将节点和关系用作属性映射。例如:
:param prop: "login"
:param login: "ikwattro"
-
MATCH (n:User) WHERE n[$prop] = $login RETURN n
哪个会起作用,但您将使用索引用法:/
我相信虽然您的应用程序不应该允许用户输入他想要的任何内容,但您可以使用内置过程获得有关模式的大量信息,然后您可以将用户输入与列表可能的价值观。
如果这不是用户输入属性键,则不存在使用字符串连接的问题。