Tinkerpop GroovyTranslator 是否可以防止 Gremlin 脚本注入攻击?
Does Tinkerpop GroovyTranslator protect against Gremlin script injection attacks?
我知道直接的 gremlin 脚本容易受到注入攻击,参数化它们是最好的选择。
我的问题是如果创建一个 GraphTraversal
对象并 运行 它通过 GroovyTranslator
到达 Gremlin 脚本是否也容易受到注入?
从 Gremlin 注入的角度来看,像下面这样的东西安全吗?
final String script = GroovyTranslator.of("g").translate(traversal .asAdmin().getBytecode());
Client.submitAsync(script);
Translator
实现不会对检测到的恶意注入做任何特别的事情,但我也无法想象构造的 traversal
将如何最终处于构造的 Gremlin 字符串的状态由它产生的将包含类似的东西。 Translator
不评估遍历中任何步骤的任何参数。换句话说,如果你有:
gremlin> translator = GroovyTranslator.of('g')
==>translator[g:gremlin-groovy]
gremlin> x = "'bob');g.V().drop()"
==>'bob');g.V().drop()
gremlin> traversal = g.V().has('name',x)
gremlin> translator.translate(traversal)
==>g.V().has("name","'bob');g.V().drop()")
gremlin> x = "\");g.V().drop()"
==>");g.V().drop()
gremlin> traversal = g.V().has('name',x)
gremlin> translator.translate(traversal)
==>g.V().has("name","""\");g.V().drop()""")
如您所见,在上面的示例中,Translator
只是将 x
的值完全视为 String
。然而,Translator
将评估 Bytecode
对象作为参数,但这是预期的,因为某些步骤确实接受 Traversal
作为参数。因此,如果您自己评估了一个 x
输入到 Bytecode
,那么我想有人可能会漏掉一些东西。这似乎不太可能。当然,这意味着您从用户那里接受的输入将使他们能够从本质上编写自己的 Gremlin,所以我真的不认为这是注入场景。
一般来说,我认为您主要 运行 注入各种攻击的方式与您 运行 使用 SQL 注入攻击的方式相同,其中您手动构建 Gremlin 字符串并且不检查输入。我想说的是,在任何情况下验证您的输入并且不直接动态评估任何输入仍然是最佳实践(除非您允许用户出于某种原因提交他们自己的 Gremlin 查询,在这种情况下您可能需要额外的保护措施,具体取决于你的用例)。
我知道直接的 gremlin 脚本容易受到注入攻击,参数化它们是最好的选择。
我的问题是如果创建一个 GraphTraversal
对象并 运行 它通过 GroovyTranslator
到达 Gremlin 脚本是否也容易受到注入?
从 Gremlin 注入的角度来看,像下面这样的东西安全吗?
final String script = GroovyTranslator.of("g").translate(traversal .asAdmin().getBytecode());
Client.submitAsync(script);
Translator
实现不会对检测到的恶意注入做任何特别的事情,但我也无法想象构造的 traversal
将如何最终处于构造的 Gremlin 字符串的状态由它产生的将包含类似的东西。 Translator
不评估遍历中任何步骤的任何参数。换句话说,如果你有:
gremlin> translator = GroovyTranslator.of('g')
==>translator[g:gremlin-groovy]
gremlin> x = "'bob');g.V().drop()"
==>'bob');g.V().drop()
gremlin> traversal = g.V().has('name',x)
gremlin> translator.translate(traversal)
==>g.V().has("name","'bob');g.V().drop()")
gremlin> x = "\");g.V().drop()"
==>");g.V().drop()
gremlin> traversal = g.V().has('name',x)
gremlin> translator.translate(traversal)
==>g.V().has("name","""\");g.V().drop()""")
如您所见,在上面的示例中,Translator
只是将 x
的值完全视为 String
。然而,Translator
将评估 Bytecode
对象作为参数,但这是预期的,因为某些步骤确实接受 Traversal
作为参数。因此,如果您自己评估了一个 x
输入到 Bytecode
,那么我想有人可能会漏掉一些东西。这似乎不太可能。当然,这意味着您从用户那里接受的输入将使他们能够从本质上编写自己的 Gremlin,所以我真的不认为这是注入场景。
一般来说,我认为您主要 运行 注入各种攻击的方式与您 运行 使用 SQL 注入攻击的方式相同,其中您手动构建 Gremlin 字符串并且不检查输入。我想说的是,在任何情况下验证您的输入并且不直接动态评估任何输入仍然是最佳实践(除非您允许用户出于某种原因提交他们自己的 Gremlin 查询,在这种情况下您可能需要额外的保护措施,具体取决于你的用例)。