我在应用程序中使用了新的Neo4j 3.5全文搜索功能。目前,我是通过嵌入式API执行Cypher来实现的。
public Result search(String term, String index) {
// The query
String cypherQuery =
"CALL db.index.fulltext.queryNodes(\"" + index + "\", \"" + term + "\") YIELD node, score\n" +
"RETURN id(node), score";
// Execute query
return db.execute(cypherQuery);
}
我认为可以利用这种方法来注入Cypher。是否可以仅使用API来执行全文搜索?
答案 0 :(得分:1)
为避免Cypher注入攻击,您应将输入作为parameters传递,如下所示:
public Result search(String term, String index) {
// The query
String cypherQuery =
"CALL db.index.fulltext.queryNodes($index, $term) YIELD node, score\n" +
"RETURN id(node), score";
// Execute query
Map<String, Object> params = new HashMap<>();
params.put("term", term);
params.put("index", index);
return db.execute(cypherQuery, params);
}
[更新]
注意:neo4j正式建议使用参数。例如,引用Java驱动程序的StatementRunner的Javadoc:
强烈建议您使用参数,这有助于避免产生危险的密码 Neo4j可以进行注入攻击并提高数据库性能 重复使用查询计划。