C# 使用neo4jclient搜索任意节点属性

C# 使用neo4jclient搜索任意节点属性,c#,.net,neo4j,neo4jclient,C#,.net,Neo4j,Neo4jclient,我有一个数据访问功能,比如 public IList<NodeType> GetNodesByProperties(IDictionary<string, string> properties) 它返回所有属性匹配的所有neo4j节点 我找不到通过neo4jclient进行此类搜索的任何官方方法。我编写了如下函数: public IList<NodeType> GetNodesByProperties(IDictionary<string, strin

我有一个数据访问功能,比如

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;
}
这确实有效,但这会带来明显的密码注入攻击风险,因为该函数将原始文本直接插入密码查询


如何安全地搜索任何节点属性?

如果不想构建/连接字符串,可以在查询过程中将节点和关系用作属性映射。例如:

:param prop: "login"
:param login: "ikwattro"
-

这将起作用,但您将使用索引用法:/

我相信,虽然应用程序不应允许用户输入任何他想要的内容,但您可以通过内置过程获得有关模式的大量信息,然后可以将用户输入与可能的值列表进行比较


如果这不是输入属性键的用户,则不存在使用字符串连接的问题。

您可能已经对此进行了研究,但是否搜索了Neo4jClient和参数?关于这方面的几个问题+答案,这似乎是一个反对注入的解决方案。我已经看到了许多关于如何使用.WithParam安全地搜索属性值的答案,但我还没有看到任何在搜索中安全指定属性键的解决方案。
MATCH (n:User) WHERE n[$prop] = $login RETURN n