Neo4j:身份验证 - 仅允许读取Cypher查询

3
我正在使用neo4j 1.9.4,并希望使用neo4jphp在(公共)网站上显示有关图形的一些信息。为了获取一些数据,我在neo4jphp中使用cypher查询。这些查询显然仅从图表中读取数据。
我必须确保网站访问者无法修改图表中的任何数据。因此,我设置了authentication-extension插件,并创建了两个用户(一个具有只读“RO”权限,另一个具有读写“RW”权限),如文档中所述。但是,neo4jphp中的cypher查询仅适用于具有RW权限的用户,而不适用于具有RO权限的用户。
我知道http://docs.neo4j.org/chunked/stable/security-server.html#_security_in_depth几乎解释了如何保护neo4j,但我绝对不知道如何做到这一点。特别是“arbitrary_code_execution”部分似乎很有趣,但我不知道如何利用它。
我该如何实现从Web服务器执行Cypher查询?另外:Web服务器(用于显示一些结果)和neo4j运行在不同的机器上。 我会感激任何帮助,谢谢! 编辑:我的情况实际上并不那么复杂,所以我相信一定有解决方案:从本地主机可以获得任何访问(读写)权限,而来自远程Web服务器的访问受到图形阅读的限制。我怎样能做到这一点?如果这不可能:我怎么才能限制远程Web服务器对一些预定义的(Cypher)查询的访问,其中用户只能提供一些参数?
2个回答

1
你应该按照http://docs.neo4j.org/chunked/stable/security-server.html#_security_in_depth中所述使用Apache代理。
你需要的信息是发布Cypher查询的URL:
http://localhost:7474/db/data/cypher  

neo4php仅是一个包装器,最终将发布到该URL。您可以在此处找到更多详细信息:http://docs.neo4j.org/chunked/milestone/rest-api-cypher.html 基本上,这意味着您只允许使用cypher URL的查询访问neo4j服务器。
关于只读Cypher查询:
我没有使用neo4jphp进行检查,但是如果您直接使用REST API,可以通过将以下内容添加到conf/neo4j.properties中将数据库设置为read_only:
read_only=true

您可以在Web管理界面中检查服务器是否处于只读模式

enter image description here

刚刚测试过,服务器只接受读取查询:

enter image description here

并将返回以下响应。
{
"message": "Expected to be in a transaction at this point",
"exception": "InternalException",
"fullname": "org.neo4j.cypher.InternalException",
"stacktrace":
[...],
"fullname" : "org.neo4j.graphdb.NotInTransactionException"
}

谢谢您的建议。然而,这种方法对我限制读取赛弗查询的访问并没有帮助,对吧?至少我看不出如何区分读取和写入赛弗查询的方式。 - user2752625
你可以在编辑中看到只读的密匙答案。如果neo4jphp不能让您这样做,您将需要编写自己的包装器来使用cypher查询。这应该不是很难。我想你可以用php和curl。 - bendaizer
再次感谢。我已经考虑过这种方法,但如果我没记错的话,read_only 是一个全局设置,它也限制了对本地主机的访问 - 而这正是我想要允许写入访问的地方。所以我认为这并没有真正帮助我。 - user2752625
是的,这是一个全局设置!在这种情况下,唯一剩下的就是使用诸如拥有一组禁止单词来检查每个查询之类的技巧。或者您不应该让用户编写自定义Cypher查询,而只需访问一组预定义的查询。 - bendaizer
2
好的,我要做的就是:提供预定义的查询。我认为限制对neo4j服务器的访问比在网站上对输入进行净化更容易实现,而且肯定更安全。谢谢! - user2752625
哦,谢谢您接受了这个答案 :) 即使它不完全符合您的期望! - bendaizer

1

另一种解决方法是使用Cypher-RS插件。有一个1.9分支。

这允许您创建本质上是单个Cypher查询的端点。 (因此,查询必须预定义)。

您可以使用mod代理来限制仅针对这些预定义查询。 我不确定mod代理是否允许您仅限于GET请求,但如果它可以,您可以允许对插件的GET请求进行访问,因为它不会允许修改查询成为GET请求。

https://github.com/jexp/cypher-rs


这听起来确实很有趣。我会尝试一下的,感谢您的发布! - user2752625

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接