diff --git a/RESOURCES/FEATURE_FLAGS.md b/RESOURCES/FEATURE_FLAGS.md
index 4a078d6325f2d..5c286ffa96487 100644
--- a/RESOURCES/FEATURE_FLAGS.md
+++ b/RESOURCES/FEATURE_FLAGS.md
@@ -86,7 +86,6 @@ These features flags currently default to True and **will be removed in a future
- DASHBOARD_CROSS_FILTERS
- DASHBOARD_FILTERS_EXPERIMENTAL
- DASHBOARD_NATIVE_FILTERS
-- ENABLE_EXPLORE_JSON_CSRF_PROTECTION
- ENABLE_JAVASCRIPT_CONTROLS
- GENERIC_CHART_AXES
- KV_STORE
diff --git a/UPDATING.md b/UPDATING.md
index ccafa2c5c4939..7e5e2ea472d75 100644
--- a/UPDATING.md
+++ b/UPDATING.md
@@ -30,6 +30,7 @@ assists people when migrating to a new version.
### Breaking Changes
+- [26344](https://github.com/apache/superset/issues/26344): Removes the deprecated `ENABLE_EXPLORE_JSON_CSRF_PROTECTION` feature flag. The previous value of the feature flag was `False` and now the feature is permanently removed.
- [26345](https://github.com/apache/superset/issues/26345): Removes the deprecated `ENABLE_TEMPLATE_REMOVE_FILTERS` feature flag. The previous value of the feature flag was `True` and now the feature is permanently enabled.
- [26346](https://github.com/apache/superset/issues/26346): Removes the deprecated `REMOVE_SLICE_LEVEL_LABEL_COLORS` feature flag. The previous value of the feature flag was `False` and now the feature is permanently removed.
- [26348](https://github.com/apache/superset/issues/26348): Removes the deprecated `CLIENT_CACHE` feature flag. The previous value of the feature flag was `False` and now the feature is permanently removed.
diff --git a/docs/docs/installation/configuring-superset.mdx b/docs/docs/installation/configuring-superset.mdx
index 820feaeec9434..30bc2f281cd36 100644
--- a/docs/docs/installation/configuring-superset.mdx
+++ b/docs/docs/installation/configuring-superset.mdx
@@ -358,7 +358,6 @@ You can enable or disable features with flag from `superset_config.py`:
```python
FEATURE_FLAGS = {
- 'ENABLE_EXPLORE_JSON_CSRF_PROTECTION': False,
'PRESTO_EXPAND_DATA': False,
}
```
diff --git a/superset/config.py b/superset/config.py
index 3999edb35af19..e750b2f09a887 100644
--- a/superset/config.py
+++ b/superset/config.py
@@ -409,14 +409,6 @@ class D3Format(TypedDict, total=False):
# editor no longer shows. Currently this is set to false so that the editor
# option does show, but we will be depreciating it.
"DISABLE_LEGACY_DATASOURCE_EDITOR": True,
- # For some security concerns, you may need to enforce CSRF protection on
- # all query request to explore_json endpoint. In Superset, we use
- # `flask-csrf `_ add csrf protection
- # for all POST requests, but this protection doesn't apply to GET method.
- # When ENABLE_EXPLORE_JSON_CSRF_PROTECTION is set to true, your users cannot
- # make GET request to explore_json. explore_json accepts both GET and POST request.
- # See `PR 7935 `_ for more details.
- "ENABLE_EXPLORE_JSON_CSRF_PROTECTION": False, # deprecated
"ENABLE_TEMPLATE_PROCESSING": False,
# Allow for javascript controls components
# this enables programmers to customize certain charts (like the
diff --git a/superset/views/core.py b/superset/views/core.py
index 5d23164fabb37..febebed34bf9f 100755
--- a/superset/views/core.py
+++ b/superset/views/core.py
@@ -15,6 +15,7 @@
# specific language governing permissions and limitations
# under the License.
# pylint: disable=invalid-name
+# pylint: disable=too-many-lines
from __future__ import annotations
import contextlib
@@ -238,19 +239,24 @@ def explore_json_data(self, cache_key: str) -> FlaskResponse:
except SupersetException as ex:
return json_error_response(utils.error_msg_from_exception(ex), 400)
- EXPLORE_JSON_METHODS = ["POST"]
- if not is_feature_enabled("ENABLE_EXPLORE_JSON_CSRF_PROTECTION"):
- EXPLORE_JSON_METHODS.append("GET")
-
@api
@has_access_api
@handle_api_exception
@event_logger.log_this
@expose(
"/explore_json///",
- methods=EXPLORE_JSON_METHODS,
+ methods=(
+ "GET",
+ "POST",
+ ),
+ )
+ @expose(
+ "/explore_json/",
+ methods=(
+ "GET",
+ "POST",
+ ),
)
- @expose("/explore_json/", methods=EXPLORE_JSON_METHODS)
@etag_cache()
@check_resource_permissions(check_datasource_perms)
@deprecated(eol_version="4.0.0")
diff --git a/tests/integration_tests/core_tests.py b/tests/integration_tests/core_tests.py
index c4a0897332b38..6d1a62c7f2fc8 100644
--- a/tests/integration_tests/core_tests.py
+++ b/tests/integration_tests/core_tests.py
@@ -559,8 +559,15 @@ def test_comments_in_sqlatable_query(self):
self.assertEqual(clean_query, rendered_query)
def test_slice_payload_no_datasource(self):
+ form_data = {
+ "viz_type": "dist_bar",
+ }
self.login(username="admin")
- data = self.get_json_resp("/superset/explore_json/", raise_on_error=False)
+ rv = self.client.post(
+ "/superset/explore_json/",
+ data={"form_data": json.dumps(form_data)},
+ )
+ data = json.loads(rv.data.decode("utf-8"))
self.assertEqual(
data["errors"][0]["message"],