Disable JSONP by default

By default, disable the option to use JSONP in our REST layer
closes #6795
This commit is contained in:
Shay Banon 2014-07-09 12:02:00 +02:00
parent b301132d7b
commit 8910e09beb
4 changed files with 22 additions and 11 deletions

View File

@ -241,17 +241,19 @@ document indexed.
[float] [float]
=== JSONP === JSONP
By default JSONP resposes are enabled. All REST APIs accept a `callback` parameter By default JSONP responses are disabled by default. coming[1.3,Previously JSONP was enabled by default]
resulting in a http://en.wikipedia.org/wiki/JSONP[JSONP] result. You can disable
When enabled, all REST APIs accept a `callback` parameter
resulting in a http://en.wikipedia.org/wiki/JSONP[JSONP] result. You can enable
this behavior by adding the following to `config.yaml`: this behavior by adding the following to `config.yaml`:
http.jsonp.enable: false http.jsonp.enable: true
Please note, due to the architecture of Elasticsearch, this may pose a security Please note, when enabled, due to the architecture of Elasticsearch, this may pose
risk. Under some circumstances, an attacker may be able to exfiltrate data in your a security risk. Under some circumstances, an attacker may be able to exfiltrate
Elasticsearch server if they're able to force your browser to make a JSONP request data in your Elasticsearch server if they're able to force your browser to make a
on your behalf (e.g. by including a <script> tag on an untrusted site with a JSONP request on your behalf (e.g. by including a <script> tag on an untrusted site
legitimate query against a local Elasticsearch server). with a legitimate query against a local Elasticsearch server).
[float] [float]
=== Request body in query string === Request body in query string

View File

@ -43,6 +43,8 @@ import static org.elasticsearch.rest.RestStatus.FORBIDDEN;
*/ */
public class RestController extends AbstractLifecycleComponent<RestController> { public class RestController extends AbstractLifecycleComponent<RestController> {
public static final String HTTP_JSON_ENABLE = "http.jsonp.enable";
private final PathTrie<RestHandler> getHandlers = new PathTrie<>(RestUtils.REST_DECODER); private final PathTrie<RestHandler> getHandlers = new PathTrie<>(RestUtils.REST_DECODER);
private final PathTrie<RestHandler> postHandlers = new PathTrie<>(RestUtils.REST_DECODER); private final PathTrie<RestHandler> postHandlers = new PathTrie<>(RestUtils.REST_DECODER);
private final PathTrie<RestHandler> putHandlers = new PathTrie<>(RestUtils.REST_DECODER); private final PathTrie<RestHandler> putHandlers = new PathTrie<>(RestUtils.REST_DECODER);
@ -140,7 +142,7 @@ public class RestController extends AbstractLifecycleComponent<RestController> {
public void dispatchRequest(final RestRequest request, final RestChannel channel) { public void dispatchRequest(final RestRequest request, final RestChannel channel) {
// If JSONP is disabled and someone sends a callback parameter we should bail out before querying // If JSONP is disabled and someone sends a callback parameter we should bail out before querying
if (!settings.getAsBoolean("http.jsonp.enable", true) && request.hasParam("callback")){ if (!settings.getAsBoolean(HTTP_JSON_ENABLE, false) && request.hasParam("callback")){
try { try {
XContentBuilder builder = channel.newBuilder(); XContentBuilder builder = channel.newBuilder();
builder.startObject().field("error","JSONP is disabled.").endObject().string(); builder.startObject().field("error","JSONP is disabled.").endObject().string();

View File

@ -22,6 +22,7 @@ package org.elasticsearch.options.jsonp;
import org.elasticsearch.common.settings.ImmutableSettings; import org.elasticsearch.common.settings.ImmutableSettings;
import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.http.HttpServerTransport; import org.elasticsearch.http.HttpServerTransport;
import org.elasticsearch.rest.RestController;
import org.elasticsearch.rest.helper.HttpClient; import org.elasticsearch.rest.helper.HttpClient;
import org.elasticsearch.rest.helper.HttpClientResponse; import org.elasticsearch.rest.helper.HttpClientResponse;
import org.elasticsearch.test.ElasticsearchIntegrationTest; import org.elasticsearch.test.ElasticsearchIntegrationTest;
@ -39,8 +40,13 @@ public class JsonpOptionDisabledTest extends ElasticsearchIntegrationTest {
// Build our cluster settings // Build our cluster settings
@Override @Override
protected Settings nodeSettings(int nodeOrdinal) { protected Settings nodeSettings(int nodeOrdinal) {
// false is the default!
if (randomBoolean()) {
logger.info("using default jsonp settings (should be false)");
return super.nodeSettings(nodeOrdinal);
}
return ImmutableSettings.settingsBuilder() return ImmutableSettings.settingsBuilder()
.put("http.jsonp.enable", false) .put(RestController.HTTP_JSON_ENABLE, false)
.put(super.nodeSettings(nodeOrdinal)) .put(super.nodeSettings(nodeOrdinal))
.build(); .build();
} }

View File

@ -22,6 +22,7 @@ package org.elasticsearch.options.jsonp;
import org.elasticsearch.common.settings.ImmutableSettings; import org.elasticsearch.common.settings.ImmutableSettings;
import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.http.HttpServerTransport; import org.elasticsearch.http.HttpServerTransport;
import org.elasticsearch.rest.RestController;
import org.elasticsearch.rest.helper.HttpClient; import org.elasticsearch.rest.helper.HttpClient;
import org.elasticsearch.rest.helper.HttpClientResponse; import org.elasticsearch.rest.helper.HttpClientResponse;
import org.elasticsearch.test.ElasticsearchIntegrationTest; import org.elasticsearch.test.ElasticsearchIntegrationTest;
@ -40,7 +41,7 @@ public class JsonpOptionEnabledTest extends ElasticsearchIntegrationTest {
@Override @Override
protected Settings nodeSettings(int nodeOrdinal) { protected Settings nodeSettings(int nodeOrdinal) {
return ImmutableSettings.settingsBuilder() return ImmutableSettings.settingsBuilder()
.put("http.jsonp.enable", true) .put(RestController.HTTP_JSON_ENABLE, true)
.put(super.nodeSettings(nodeOrdinal)) .put(super.nodeSettings(nodeOrdinal))
.build(); .build();
} }