向Elasticsearch插入JSON格式字符串是否安全?

时间:2016-03-15 23:34:31

标签: php elasticsearch

我使用的是最后一个Elasticsearch(v.2.1.1)。

当用户搜索各种产品时,我的应用程序会提供搜索引擎。我使用Elasticsearch PHP Client构建搜索参数(变量$ params包含有关索引,类型和查询的所有信息):

$params = [
 'index' => 'myindex',
 'type' => 'mytype',
];

$params['body']['query']['filtered']['filter']['bool']['must'][]['match']['ref'] = array("query" => 'Foo bar', "operator" => "and");

我需要的是保存用户进行的每次搜索。我发现最简单的方法是:

转换JSON格式字符串中的$ params数组:

$output = array();
foreach($params['body'] as $v) {
$output[key($v)] = current($v);
}

$params_json = json_encode($output);

现在$ params_json变量包含JSON格式的字符串(用户执行的搜索参数):

{"filtered":{"filter":{"bool":{"must":[{"match":{"fulltext.phonetic":{"query":"Foo bar","operator":"and"}}}]}}},"ts":{"order":"desc"}}

实际上,我们有所谓的USER INPUT,据我所知,我们永远不应该相信它,至少在MySQL数据库的旧世界中(是的,着名的sql注入)。

所以我的问题是 - 在Elasticsearch数据库中保存这种类型的数据(带有USER INPUT的JSON格式化字符串)是否安全(或者,更有弹性,索引)?

我已经应用的工作解决方案是:

1)创建索引并应用此映射(对象类型并禁用我们将插入JSON字符串的字段):

... query: { type: "object", enabled: false } ...

2)使用脚本在该字段中插入JSON字符串(如果该记录不存在则会插入,如果该记录不存在则会插入;如果已存在则会更新(更新)例如,一个计数器(执行搜索的次数):

$params2 = [
 'index' => 'searches',
 'type' => 'queries',
 'id' => md5($params_json),
 'body' => [
    'script' => 'ctx._source.counter += count',
    'params' => [
        'count' => 1
    ],
    'upsert' => [
        'query' => $params_json,
        'ts' => time(),
        'counter' => 1
    ]
 ]
];

$result = $this->db->update($params2);

如果您在Elasticsearch中没有使用脚本时有其他解决方案(您应该知道该脚本非常危险,如果您不知道自己在做什么,则应该禁用该脚本。)

请在此发表您对此方法的看法?这样安全吗?

它运行正常,我可以使用JSON中的数据稍后使用它来执行搜索但问题是 - 它是否真的安全,如果不是为什么我应该避免它?

我不想要一些"脚本小子"会打破我的应用程序的安全性。

如果您愿意分享您的意见,我将非常感激。

0 个答案:

没有答案