-
Notifications
You must be signed in to change notification settings - Fork 275
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Implemented possible solution for path traversal #28
base: dev-0.3
Are you sure you want to change the base?
Conversation
… prevent path traversal attacks.
…g path does not exists to prevent internal error.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hey Chris, thanks for your PR. It looks good and you're solving a problem for the v0.3 release, thanks for that!
app/api/endpoints.py
Outdated
config_file = os.path.join(nginx_path, name) | ||
|
||
if not os.path.commonprefix(os.path.realpath(config_file), nginx_path): | ||
return flask.make_response({'success': False}), 200 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would choose a different status code. For example a 400 (Bad Request) or 403 (Forbidden).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Also note that os.path.commonprefix(("/a/b", "/c/d"))
returns "/"
which is truthy, so the condition is not met. And commonprefix
takes an iterable and not variadic arguments so I think this errors out. Maybe use something like os.path.realpath(config_file).startswith(os.path.realpath(nginx_path) + os.sep)
(though not as this ugly oneliner maybe).
app/api/endpoints.py
Outdated
@@ -57,6 +62,9 @@ def get_domains(): | |||
sites_available = [] | |||
sites_enabled = [] | |||
|
|||
if not os.path.exists(config_path): | |||
errorMessage = 'The config folder "{}" does not exists.'.format(config_path) | |||
return flask.render_template('domains.html', errorMessage=errorMessage, sites_available=(), sites_enabled=()), 200 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Classic case of Java developer. Lower CamelCase is uncommon in Python. error_message would be nice! :)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would also like to have the string formatting with f-string syntax. Then it will be consistent in the code.
error_message = f'The config folder "{config_path}" doesn't exists.'
@@ -1,6 +1,11 @@ | |||
<div class="column"> | |||
|
|||
<div class="ui cards" id="domain_cards"> | |||
{% if errorMessage %} | |||
<div> | |||
{{errorMessage}} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It is functional, but you could enhance it with a message from the semantic framework. Here is a link to the component: Error Messages
It seems like you addressed the path traversal issue only in a single endpoint. Looking through |
I added a new function to generate valid paths or return |
@chris18191 First of all, thank you very much for your efforts. I see you're using lower camel-case everywhere. I did not want to mention every method in the review. Could you adapt it to the Python convention? Unfortunately, I will not be able to do an extensive review before the weekend. |
No description provided.