【问题标题】:How to protect my system, which runs the Sesame triplestore, from injections when querying using SPARQL?在使用 SPARQL 查询时,如何保护运行 Sesame Triplestore 的系统免受注入?
【发布时间】:2019-11-11 22:46:11
【问题描述】:

标题说明了一切。有没有相当于 SQL 的预处理语句的东西?

【问题讨论】:

  • 不是这样的。有一些引擎,比如我雇主的Virtuoso,为只读、读写等提供不同特权的端点,这些特权可能因用户而异。 Virtuoso 还支持 SPARQL-in-SQL,因此您可以在 SQL 中进行所有查询,这使您可以在客户端工具中使用准备好的语句,该工具可以通过 ODBC、JDBC、dotNET 等进行连接......复杂的答案,但它一个复杂的谜题!
  • 在 Apache Jena ParameterizedSparqlStringQueryBuilder 支持这一点。但仅来自Java代码afaik。在 RDF4J 中,还有一种准备查询的方法:rdf4j.org/documentation/programming/repository/… - 我不能说是否完成了内部注入测试。 Jeen Broekstra 很可能很快就会在这里给您答案
  • (不是一个完整的解决方案)对于 SPARQL,查询和更新是不同的语言。查询(仅限)端点将只接受查询。注入查询的更新将是语法错误。
  • @AndyS 所以最坏的情况是我的服务器抛出了一些异常?
  • 任意注入查询会使查询(非常、非常)缓慢。可能会发生系统异常(例如内存不足)。注入更新操作会导致 HTTP 响应为 400(错误请求)——这是一个错误的语法查询。

标签: sparql code-injection sesame


【解决方案1】:

(假设您使用的是最新版本的 RDF4J,而不是 Sesame)

为了防止由于注入导致的漏洞,一个简单的方法是使用prepared query,并使用Query#setBinding 将实际用户输入值注入到您的查询中。例如:

// some input keyword to inject
String keyword = "foobar";

TupleQuery query = con.prepareTupleQuery(
       "PREFIX ex: <htt://example.org/> " 
     + "SELECT ?document WHERE { ?document ex:keyword ?keyword . }");

// inject the input keyword
query.setBinding("keyword", factory.createLiteral(keyword));

// execute the query
TupleQueryResult result = query.evaluate();

对于更高级的控制,RDF4J 还具有SparqlBuilder,这是一个用于在 Java 中创建 SPARQL 查询的流畅 API,用于此目的。例如:

String keyword = "foobar";

Prefix ex = SparqlBuilder.prefix("ex", Rdf.iri("http://example.org/"));
Variable document = SparqlBuilder.var("document");

SelectQuery query = Queries.SELECT().prefix(ex).select(document)
        .where(GraphPatterns.tp(document, ex.iri("keyword"), Rdf.literalOf(keyword));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 2023-03-07
    • 1970-01-01
    • 2010-12-24
    相关资源
    最近更新 更多