Core Rule Set: Ghost posts and code injection take a script element (closes #358)
check / check (push) Waiting to run
check / check (push) Waiting to run
While bodies are read, 941110 refused a `<script>` element in an HTML card that embeds a widget, and in code injection that loads analytics. The new exclusion 900366 switches 941110 off on the Admin API for `lexical`, `mobiledoc` and `html` of posts and pages, their `codeinjection_head` and `codeinjection_foot`, and settings `value`. Snippets, a newsletter's footer and every other field and path still refuse it; `javascript:` links stay refused everywhere. Model: opus-5-5
This commit is contained in:
1 parent
0cb6dded98
commit
47f6132026
3 files changed
+142
-18
No files matched your search
@@ -153,8 +153,8 @@ SecRule REQUEST_FILENAME "@rx ^/ghost/api/admin/users/[0-9a-f]{24}/$" \
|
||||
# snippets.<n>.lexical and snippets.<n>.mobiledoc, a part of a post saved for
|
||||
# reuse
|
||||
# newsletters.<n>.footer_content, the footer of a newsletter
|
||||
# A <script> element (941110) and a javascript: link (941170, 941210) are still
|
||||
# refused in them.
|
||||
# A javascript: link (941170, 941210) is still refused in them. A <script>
|
||||
# element (941110) passes only in posts and pages, by 900366.
|
||||
SecRule REQUEST_FILENAME "@beginsWith /ghost/api/admin/" \
|
||||
"id:900355,phase:1,pass,nolog,chain"
|
||||
SecRule &ARGS_GET:/^json\.(?:(?:posts|pages)\.\d+\.(?:lexical|mobiledoc|html)|snippets\.\d+\.(?:lexical|mobiledoc)|newsletters\.\d+\.footer_content)$/ "@eq 0" \
|
||||
@@ -184,7 +184,8 @@ SecRule REQUEST_FILENAME "@beginsWith /ghost/api/admin/" \
|
||||
# These fields hold it, and skip the rules anywhere on the Admin API:
|
||||
# posts.<n>.codeinjection_head and _foot, and the same fields of pages
|
||||
# settings.<n>.value, the value of a setting
|
||||
# A <script> element and a javascript: link are still refused in them.
|
||||
# A javascript: link is still refused in them, and a <script> element passes
|
||||
# by 900366.
|
||||
SecRule REQUEST_FILENAME "@beginsWith /ghost/api/admin/" \
|
||||
"id:900356,phase:1,pass,nolog,chain"
|
||||
SecRule &ARGS_GET:/^json\.(?:(?:posts|pages)\.\d+\.codeinjection_(?:head|foot)|settings\.\d+\.value)$/ "@eq 0" \
|
||||
@@ -200,6 +201,21 @@ SecRule REQUEST_FILENAME "@beginsWith /ghost/api/admin/" \
|
||||
ctl:ruleRemoveTargetById=941160;ARGS:/^json\.(?:(?:posts|pages)\.\d+\.codeinjection_(?:head|foot)|settings\.\d+\.value)$/,\
|
||||
ctl:ruleRemoveTargetById=941270;ARGS:/^json\.(?:(?:posts|pages)\.\d+\.codeinjection_(?:head|foot)|settings\.\d+\.value)$/"
|
||||
|
||||
# A <script> element skips 941110 in posts, pages and code injection, on the
|
||||
# Admin API, which refused:
|
||||
# an HTML card that embeds a widget with its script
|
||||
# code injection that loads analytics,
|
||||
# <script defer src="https://analytics.example.com/script.js"></script>
|
||||
# These fields take a <script> element on purpose:
|
||||
# posts.<n>.lexical, mobiledoc and html, and the same fields of pages
|
||||
# posts.<n>.codeinjection_head and _foot, and the same fields of pages
|
||||
# settings.<n>.value, the value of a setting
|
||||
# Snippets and a newsletter's footer still refuse it.
|
||||
SecRule REQUEST_FILENAME "@beginsWith /ghost/api/admin/" \
|
||||
"id:900366,phase:1,pass,nolog,chain"
|
||||
SecRule &ARGS_GET:/^json\.(?:(?:posts|pages)\.\d+\.(?:lexical|mobiledoc|html|codeinjection_(?:head|foot))|settings\.\d+\.value)$/ "@eq 0" \
|
||||
"ctl:ruleRemoveTargetById=941110;ARGS:/^json\.(?:(?:posts|pages)\.\d+\.(?:lexical|mobiledoc|html|codeinjection_(?:head|foot))|settings\.\d+\.value)$/"
|
||||
|
||||
# Saving a staff user's profile sends the field profile_image, whose name holds
|
||||
# .profile, a file the list of system files names (930120).
|
||||
SecRule REQUEST_FILENAME "@rx ^/ghost/api/admin/users/[0-9a-f]{24}/$" \
|
||||
|
||||
Reference in new issue
Block a user