Update Security.
This commit is contained in:
		
							parent
							
								
									c60f9ff4d3
								
							
						
					
					
						commit
						1a034041ab
					
				| @ -62,6 +62,7 @@ from snek.webdav import WebdavApplication | |||||||
| from snek.system.template import sanitize_html | from snek.system.template import sanitize_html | ||||||
| from snek.sgit import GitApplication | from snek.sgit import GitApplication | ||||||
| SESSION_KEY = b"c79a0c5fda4b424189c427d28c9f7c34" | SESSION_KEY = b"c79a0c5fda4b424189c427d28c9f7c34" | ||||||
|  | from snek.system.template import whitelist_attributes | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @web.middleware | @web.middleware | ||||||
| @ -285,9 +286,9 @@ class Application(BaseApplication): | |||||||
|      |      | ||||||
|     async def handle_test(self, request): |     async def handle_test(self, request): | ||||||
| 
 | 
 | ||||||
|         return await self.render_template( |         return await whitelist_attributes(self.render_template( | ||||||
|             "test.html", request, context={"name": "retoor"} |             "test.html", request, context={"name": "retoor"} | ||||||
|         ) |         )) | ||||||
| 
 | 
 | ||||||
|     async def handle_http_get(self, request: web.Request): |     async def handle_http_get(self, request: web.Request): | ||||||
|         url = request.query.get("url") |         url = request.query.get("url") | ||||||
| @ -358,7 +359,9 @@ class Application(BaseApplication): | |||||||
|         rendered = await super().render_template(template, request, context) |         rendered = await super().render_template(template, request, context) | ||||||
| 
 | 
 | ||||||
|         self.jinja2_env.loader = self.original_loader |         self.jinja2_env.loader = self.original_loader | ||||||
| 
 |          | ||||||
|  |         #rendered.text = whitelist_attributes(rendered.text) | ||||||
|  |         #rendered.headers['Content-Lenght'] = len(rendered.text) | ||||||
|         return rendered |         return rendered | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,4 +1,5 @@ | |||||||
| from snek.system.service import BaseService | from snek.system.service import BaseService | ||||||
|  | from snek.system.template import whitelist_attributes | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class ChannelMessageService(BaseService): | class ChannelMessageService(BaseService): | ||||||
| @ -28,6 +29,7 @@ class ChannelMessageService(BaseService): | |||||||
|         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,7 +118,24 @@ def set_link_target_blank(text): | |||||||
|         element.attrs["rel"] = "noopener noreferrer" |         element.attrs["rel"] = "noopener noreferrer" | ||||||
|         element.attrs["referrerpolicy"] = "no-referrer" |         element.attrs["referrerpolicy"] = "no-referrer" | ||||||
|         element.attrs["href"] = element.attrs["href"].strip(".").strip(",") |         element.attrs["href"] = element.attrs["href"].strip(".").strip(",") | ||||||
|  |      | ||||||
|  |     return str(soup) | ||||||
| 
 | 
 | ||||||
|  | SAFE_ATTRIBUTES = { | ||||||
|  |     'href', 'src', 'alt', 'title', 'width', 'height', 'style', 'id', 'class',  | ||||||
|  |     'rel', 'type', 'name', 'value', 'placeholder', 'aria-hidden', 'aria-label', 'srcset' | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | def whitelist_attributes(html): | ||||||
|  |     soup = BeautifulSoup(html, 'html.parser') | ||||||
|  | 
 | ||||||
|  |     for tag in soup.find_all(): | ||||||
|  |         if isinstance(tag, Tag): | ||||||
|  |             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) |     return str(soup) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user