Fix xss.
This commit is contained in:
parent
54d7d5b74e
commit
abce2e03d1
@ -69,10 +69,10 @@ class ChannelMessageService(BaseService):
|
|||||||
"color": user["color"],
|
"color": user["color"],
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
context['message'] = whitelist_attributes(context['message'])
|
||||||
try:
|
try:
|
||||||
template = self.app.jinja2_env.get_template("message.html")
|
template = self.app.jinja2_env.get_template("message.html")
|
||||||
model["html"] = template.render(**context)
|
model["html"] = template.render(**context)
|
||||||
model["html"] = whitelist_attributes(model["html"])
|
|
||||||
except Exception as ex:
|
except Exception as ex:
|
||||||
print(ex, flush=True)
|
print(ex, flush=True)
|
||||||
|
|
||||||
@ -118,6 +118,7 @@ class ChannelMessageService(BaseService):
|
|||||||
async def save(self, model):
|
async def save(self, model):
|
||||||
context = {}
|
context = {}
|
||||||
context.update(model.record)
|
context.update(model.record)
|
||||||
|
context['message'] = whitelist_attributes(context['message'])
|
||||||
user = await self.app.services.user.get(model["user_uid"])
|
user = await self.app.services.user.get(model["user_uid"])
|
||||||
context.update(
|
context.update(
|
||||||
{
|
{
|
||||||
@ -129,7 +130,6 @@ class ChannelMessageService(BaseService):
|
|||||||
)
|
)
|
||||||
template = self.app.jinja2_env.get_template("message.html")
|
template = self.app.jinja2_env.get_template("message.html")
|
||||||
model["html"] = template.render(**context)
|
model["html"] = template.render(**context)
|
||||||
model["html"] = whitelist_attributes(model["html"])
|
|
||||||
return await super().save(model)
|
return await super().save(model)
|
||||||
|
|
||||||
async def offset(self, channel_uid, page=0, timestamp=None, page_size=30):
|
async def offset(self, channel_uid, page=0, timestamp=None, page_size=30):
|
||||||
|
@ -79,44 +79,12 @@ emoji.EMOJI_DATA[
|
|||||||
] = {"en": ":a1:", "status": 2, "E": 0.6, "alias": [":a1:"]}
|
] = {"en": ":a1:", "status": 2, "E": 0.6, "alias": [":a1:"]}
|
||||||
|
|
||||||
|
|
||||||
ALLOWED_TAGS = list(bleach.sanitizer.ALLOWED_TAGS) + [
|
ALLOWED_TAGS = list(bleach.sanitizer.ALLOWED_TAGS) + ["picture"]
|
||||||
"img",
|
|
||||||
"video",
|
|
||||||
"audio",
|
|
||||||
"source",
|
|
||||||
"iframe",
|
|
||||||
"picture",
|
|
||||||
"span",
|
|
||||||
]
|
|
||||||
ALLOWED_ATTRIBUTES = {
|
|
||||||
**bleach.sanitizer.ALLOWED_ATTRIBUTES,
|
|
||||||
"img": ["src", "alt", "title", "width", "height"],
|
|
||||||
"a": ["href", "title", "target", "rel", "referrerpolicy", "class"],
|
|
||||||
"iframe": [
|
|
||||||
"src",
|
|
||||||
"width",
|
|
||||||
"height",
|
|
||||||
"frameborder",
|
|
||||||
"allow",
|
|
||||||
"allowfullscreen",
|
|
||||||
"title",
|
|
||||||
"referrerpolicy",
|
|
||||||
"style",
|
|
||||||
],
|
|
||||||
"video": ["src", "controls", "width", "height"],
|
|
||||||
"audio": ["src", "controls"],
|
|
||||||
"source": ["src", "type"],
|
|
||||||
"span": ["class"],
|
|
||||||
"picture": [],
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
def sanitize_html(value):
|
def sanitize_html(value):
|
||||||
return bleach.clean(
|
return bleach.clean(
|
||||||
value,
|
value,
|
||||||
tags=ALLOWED_TAGS,
|
protocols=list(bleach.sanitizer.ALLOWED_PROTOCOLS) + ["data"],
|
||||||
attributes=ALLOWED_ATTRIBUTES,
|
|
||||||
protocols=bleach.sanitizer.ALLOWED_PROTOCOLS + ["data"],
|
|
||||||
strip=True,
|
strip=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -132,50 +100,8 @@ def set_link_target_blank(text):
|
|||||||
|
|
||||||
return str(soup)
|
return str(soup)
|
||||||
|
|
||||||
|
|
||||||
SAFE_ATTRIBUTES = {
|
|
||||||
"href",
|
|
||||||
"src",
|
|
||||||
"alt",
|
|
||||||
"title",
|
|
||||||
"width",
|
|
||||||
"height",
|
|
||||||
"style",
|
|
||||||
"id",
|
|
||||||
"class",
|
|
||||||
"rel",
|
|
||||||
"type",
|
|
||||||
"name",
|
|
||||||
"value",
|
|
||||||
"placeholder",
|
|
||||||
"aria-hidden",
|
|
||||||
"aria-label",
|
|
||||||
"srcset",
|
|
||||||
"target",
|
|
||||||
"rel",
|
|
||||||
"referrerpolicy",
|
|
||||||
"controls",
|
|
||||||
"frameborder",
|
|
||||||
"allow",
|
|
||||||
"allowfullscreen",
|
|
||||||
"referrerpolicy",
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
def whitelist_attributes(html):
|
def whitelist_attributes(html):
|
||||||
soup = BeautifulSoup(html, "html.parser")
|
return sanitize_html(html)
|
||||||
|
|
||||||
for tag in soup.find_all():
|
|
||||||
if hasattr(tag, "attrs"):
|
|
||||||
if tag.name in ["script", "form", "input"]:
|
|
||||||
tag.replace_with("")
|
|
||||||
continue
|
|
||||||
attrs = dict(tag.attrs)
|
|
||||||
for attr in list(attrs):
|
|
||||||
# Check if attribute is in the safe list or is a data-* attribute
|
|
||||||
if not (attr in SAFE_ATTRIBUTES or attr.startswith("data-")):
|
|
||||||
del tag.attrs[attr]
|
|
||||||
return str(soup)
|
|
||||||
|
|
||||||
|
|
||||||
def embed_youtube(text):
|
def embed_youtube(text):
|
||||||
|
Loading…
Reference in New Issue
Block a user