From 54828ad616dfa6873e27a60dcab3486c3184f329 Mon Sep 17 00:00:00 2001 From: Ben Jones Date: Wed, 9 Oct 2024 13:20:36 +1100 Subject: [PATCH] initial commit --- .devcontainer/devcontainer.json | 55 +++ .student_resources/CSRF/README.md | 45 ++ .student_resources/SQL_Injection/README.md | 17 + .student_resources/XFS/README.md | 23 + .student_resources/XFS/index.html | 35 ++ .student_resources/XSS/README.md | 54 +++ .../content_security_policy/README.md | 48 ++ .../defensive_data_handling/README.md | 28 ++ .../__pycache__/data_handler.cpython-312.pyc | Bin 0 -> 3026 bytes .../defensive_data_handling/data_handler.py | 75 +++ .../defensive_data_handling/main.py | 34 ++ .../defensive_data_handling/security_log.log | 0 .../encrypting_passwords/README.md | 54 +++ .../encrypting_passwords/example.py | 29 ++ .../encrypting_passwords/salt+hash.png | Bin 0 -> 28385 bytes .student_resources/flask_safe_API/README.md | 36 ++ .../database_management.cpython-312.pyc | Bin 0 -> 746 bytes .../flask_safe_API/database_management.py | 19 + .student_resources/flask_safe_API/index.html | 195 ++++++++ .student_resources/flask_safe_API/main.py | 38 ++ .../secure_form_attributes/README.md | 45 ++ .../security_testing_approaches/README.md | 103 +++++ .../2FA_Phone_QRCode.py | 35 ++ .../two_factor_authentication/2FA_Python.py | 33 ++ .../two_factor_authentication/README.md | 150 ++++++ .../__pycache__/app.cpython-310.pyc | Bin 0 -> 1894 bytes .../emailVerify/app.py | 53 +++ .../emailVerify/templates/index.html | 23 + .../emailVerify/templates/success.html | 18 + .../emailVerify/templates/verifypage.html | 30 ++ .../images/new_page.png | Bin 0 -> 21198 bytes .vscode/settings.json | 12 + LICENSE | 437 ++++++++++++++++++ README.md | 79 ++++ __pycache__/userManagement.cpython-312.pyc | Bin 0 -> 2480 bytes databaseFiles/database.db | Bin 0 -> 16384 bytes databaseFiles/myQueries.sql | 11 + main.py | 52 +++ requirements.txt | 1 + static/css/.DS_Store | Bin 0 -> 6148 bytes static/css/style.css | 153 ++++++ static/icons/icon-128x128.png | Bin 0 -> 8153 bytes static/icons/icon-192x192.png | Bin 0 -> 24966 bytes static/icons/icon-384x384.png | Bin 0 -> 24966 bytes static/icons/icon-512x512.png | Bin 0 -> 16972 bytes static/icons/screenshot.png | Bin 0 -> 89151 bytes static/images/favicon.png | Bin 0 -> 15523 bytes static/images/logo.svg | 1 + static/js/app.js | 8 + static/js/serviceWorker.js | 56 +++ static/manifest.json | 68 +++ templates/index.html | 15 + templates/layout.html | 37 ++ templates/partials/sucess_feedback.html | 6 + templates/signup.html | 22 + templates/sucess.html | 20 + userManagement.py | 48 ++ 57 files changed, 2301 insertions(+) create mode 100644 .devcontainer/devcontainer.json create mode 100644 .student_resources/CSRF/README.md create mode 100644 .student_resources/SQL_Injection/README.md create mode 100644 .student_resources/XFS/README.md create mode 100644 .student_resources/XFS/index.html create mode 100644 .student_resources/XSS/README.md create mode 100644 .student_resources/content_security_policy/README.md create mode 100644 .student_resources/defensive_data_handling/README.md create mode 100644 .student_resources/defensive_data_handling/__pycache__/data_handler.cpython-312.pyc create mode 100644 .student_resources/defensive_data_handling/data_handler.py create mode 100644 .student_resources/defensive_data_handling/main.py create mode 100644 .student_resources/defensive_data_handling/security_log.log create mode 100644 .student_resources/encrypting_passwords/README.md create mode 100644 .student_resources/encrypting_passwords/example.py create mode 100644 .student_resources/encrypting_passwords/salt+hash.png create mode 100644 .student_resources/flask_safe_API/README.md create mode 100644 .student_resources/flask_safe_API/__pycache__/database_management.cpython-312.pyc create mode 100644 .student_resources/flask_safe_API/database_management.py create mode 100644 .student_resources/flask_safe_API/index.html create mode 100644 .student_resources/flask_safe_API/main.py create mode 100644 .student_resources/secure_form_attributes/README.md create mode 100644 .student_resources/security_testing_approaches/README.md create mode 100644 .student_resources/two_factor_authentication/2FA_Phone_QRCode.py create mode 100644 .student_resources/two_factor_authentication/2FA_Python.py create mode 100644 .student_resources/two_factor_authentication/README.md create mode 100644 .student_resources/two_factor_authentication/emailVerify/__pycache__/app.cpython-310.pyc create mode 100644 .student_resources/two_factor_authentication/emailVerify/app.py create mode 100644 .student_resources/two_factor_authentication/emailVerify/templates/index.html create mode 100644 .student_resources/two_factor_authentication/emailVerify/templates/success.html create mode 100644 .student_resources/two_factor_authentication/emailVerify/templates/verifypage.html create mode 100644 .student_resources/two_factor_authentication/images/new_page.png create mode 100644 .vscode/settings.json create mode 100644 LICENSE create mode 100644 README.md create mode 100644 __pycache__/userManagement.cpython-312.pyc create mode 100644 databaseFiles/database.db create mode 100644 databaseFiles/myQueries.sql create mode 100644 main.py create mode 100644 requirements.txt create mode 100644 static/css/.DS_Store create mode 100644 static/css/style.css create mode 100644 static/icons/icon-128x128.png create mode 100644 static/icons/icon-192x192.png create mode 100644 static/icons/icon-384x384.png create mode 100644 static/icons/icon-512x512.png create mode 100644 static/icons/screenshot.png create mode 100644 static/images/favicon.png create mode 100644 static/images/logo.svg create mode 100644 static/js/app.js create mode 100644 static/js/serviceWorker.js create mode 100644 static/manifest.json create mode 100644 templates/index.html create mode 100644 templates/layout.html create mode 100644 templates/partials/sucess_feedback.html create mode 100644 templates/signup.html create mode 100644 templates/sucess.html create mode 100644 userManagement.py diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..8d43c5f --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,55 @@ +{ + "name": "Python Flask Development Container", + "image": "mcr.microsoft.com/devcontainers/universal:2", + "hostRequirements": { + "cpus": 4 + }, + "waitFor": "onCreateCommand", + "updateContentCommand": "pip install -r requirements.txt", + "postCreateCommand": "", + "postAttachCommand": {}, + "portsAttributes": { + "5000": { + "label": "Application", + "onAutoForward": "openPreview" + } + }, + "customizations": { + "vscode": { + "settings": { + "files.autoSave": "onFocusChange", + "editor.formatOnPaste": true, + "editor.formatOnSave": true, + "editor.defaultFormatter": "esbenp.prettier-vscode", + "[python]": { + "editor.defaultFormatter": "ms-python.black-formatter" + }, + "editor.fontSize": 18, + "terminal.integrated.defaultProfile.windows": "Git Bash", + "window.restoreWindows": "preserve", + "workbench.editorAssociations": { + "*.md": "vscode.markdown.preview.editor" + } + }, + "extensions": [ + "McCarter.start-git-bash", + "alexcvzz.vscode-sqlite", + "medo64.render-crlf", + "ecmel.vscode-html-css", + "ms-vscode.js-debug", + "dbaeumer.vscode-eslint", + "miramac.vscode-exec-node", + "yy0931.vscode-sqlite3-editor", + "oderwat.indent-rainbow", + "ritwickdey.LiveServer", + "tomoki1207.pdf", + "ms-vscode-remote.remote-containers", + "ms-vscode-remote.remote-wsl", + "GitHub.codespaces", + "ms-vscode-remote.remote-wsl", + "ms-azuretools.vscode-docker" + ] + } + }, + "forwardPorts": [5000] +} diff --git a/.student_resources/CSRF/README.md b/.student_resources/CSRF/README.md new file mode 100644 index 0000000..95c63bd --- /dev/null +++ b/.student_resources/CSRF/README.md @@ -0,0 +1,45 @@ +# Cross-Site Request Forgery (CSRF) + +Cross-Site Request Forgery (CSRF) is an attack that forces an end user to execute unwanted actions on a web application in which they’re currently authenticated. With a little help of social engineering (such as sending a link via email or chat), an attacker may trick the users of a web application into executing actions of the attacker’s choosing. If the victim is a normal user, a successful CSRF attack can force the user to perform state-changing requests like transferring funds, changing their email address, and so forth. If the victim is an administrative account, CSRF can compromise the entire web application. A CSRF attack generally requires an internal threat actor to provide insight into the internal workings of the API or system, which makes it one of the more challenging cyber vulnerabilities to mitigate. + +## How to secure against this attack + +Implement [Flask WTForms](https://flask-wtf.readthedocs.io/en/1.2.x/), which generates and requires a unique secret key by default. +- Implement business knowledge access levels. +- End-user education. +- HTTPS encryption. +- End-user education. +- Implement a CORS Content Security Policy (CSP). +- Understand how the attack can be executed in the specific context of the application and user, then code review with specific scenarios in mind. +- Implement three-factor authentication (3FA) for administrative operations. +- Separate production and development environments. +- White-list firewall policies + +## Example Attack Code + +> [!NOTE] +> Due to the specific, targeted and complex nature of a CSRF it is difficult to demonstrate this attack beyond the below code snippets practically. When reading them, you should assume that the code is executed from a side attack email or document (usually a \*.PDF or macro-enabled \*.xlsx) where the user has already authenticated to the API or system and the code will be validated `True` by the API or system allowing the malicious code to execute successfully. + +```html + View my Pictures! +``` + +``` html + + +``` + +```html +
+ + + +
+``` diff --git a/.student_resources/SQL_Injection/README.md b/.student_resources/SQL_Injection/README.md new file mode 100644 index 0000000..b0a28a5 --- /dev/null +++ b/.student_resources/SQL_Injection/README.md @@ -0,0 +1,17 @@ +# SQL Injection + +A SQL injection attack consists of inserting or " injecting " a SQL query via the input data from the client to the application. A successful SQL injection exploit can read sensitive data from the database and modify database data (Insert/Update/Delete). SQL injection attacks are a type of injection attack in which SQL commands are injected into data-plane input to affect the execution of predefined SQL commands. + +# Examples of SQL injections +[W3Schools has a range of SQL Injection examples](https://www.w3schools.com/sql/sql_injection.asp) + +## How to secure against this attack + +- Code review +- Avoid languages like PHP +- Use API with built-in security as the interface to the SQL database +- Defensive data handling +- Require authentication before accepting any text form data +- Never construct queries with concatenating and binary comparison +- Use query parameters ie `cur.execute('SELECT * FROM users WHERE username == ? AND password == ?', (username, password))`. +- Salt database table names with 5-character random string diff --git a/.student_resources/XFS/README.md b/.student_resources/XFS/README.md new file mode 100644 index 0000000..46d4456 --- /dev/null +++ b/.student_resources/XFS/README.md @@ -0,0 +1,23 @@ +# Cross Frame Scripting + +Cross-frame scripting (XFS) is an attack that combines malicious JavaScript with an iframe that loads a legitimate page in an effort to steal data from an unsuspecting user. This attack is usually only successful when combined with social engineering. An example would consist of an attacker convincing the user to navigate to a web page the attacker controls. The attacker’s page then loads malicious JavaScript and an HTML iframe pointing to a legitimate site. Once the user enters credentials into the legitimate site within the iframe, the malicious JavaScript steals the keystrokes. + +[This example](index.html) demonstrates how easy it is to spoof a webpage, in this case, the Unsecure PWA. + +This attack is particularly effective on mobile devices, as the browser hides most of the URL, and the spoofing page only requires some HTML and some inline JS. That is why XFS coupled with SMS scams are some of the most successful. + +> [!NOTE] +> Make sure the Unsecure PWA is being served at [http://127.0.0.1](http://127.0.0.1) before opening the demonstration page. +> `python main.py` + +As a more sophisticated attack, the threat actors would: + +1. Serve both sites through a proxy circumventing any CORS CSP policy +2. Have a back-to-base script that intercepts and transmits input data (username, password, credit card, etc) without the user knowing. +3. Have a threat actor listening for inputs and interacting/handling the victim, which is how 2FA is often bypassed. + +How to secure against this attack + +1. End user education. +2. Monitor HTTP logs for unusually repetitive GET calls. +3. Implement a Content Security Policy (CSP) preventing ` + + + + + + \ No newline at end of file diff --git a/.student_resources/XSS/README.md b/.student_resources/XSS/README.md new file mode 100644 index 0000000..bd33e03 --- /dev/null +++ b/.student_resources/XSS/README.md @@ -0,0 +1,54 @@ +# Cross Site Scripting (XSS) + +Cross-site scripting (XSS) attacks are a type of injection in which malicious scripts are injected into otherwise benign and trusted websites. XSS attacks occur when an attacker uses a web application to send malicious code, generally in the form of a browser-side script, to a different end user. Flaws that allow these attacks to succeed are quite widespread and occur anywhere a web application uses input from a user within the output it generates without validating or encoding it. + +## Software Engineering Course Specifications + +_"Cross-site scripting (XSS) involves injecting malicious code into an otherwise safe website. It is usually done through user input that is not sufficiently sanitised before being processed and stored on the server._ +_Students should be able to interpret fragments of JavaScript related to cross-site scripting."_ + +Either an internal threat actor has intentionally or unintentionally inserted the malicious code into the code base or an SQL/XXS vulnerability has been exploited to insert the malicious code into the code base. Students should be able to identify that an unknown script has been executed or that a POST request has been made to an unknown URL. + +```html + + + Welcome to yourWebsite + + + +

Your Website

+ + + or + + + + +``` + +## Non-destructive XSS Test Scripts + +To use these scripts, paste them into any input boxes or after the URL in the browser address bar and see what gets executed or saved to the HTML. + +1. `` +2. `` +3. `` +4. `` + +## How to secure against this attack + +1. Regular code reviews +2. Only known and secure third-party libraries should be externally linked. Preferably, third-party libraries should be locally served after a code review. +3. Monitor 3rd party libraries for known vulnerabilities and on discovery. +4. Defensive data handling. +5. Declare the language ``. +6. Delare charset ``. +7. Content Security Policy (CSP) Blocking `` and ` + +### What is BCrypt? +The BCrypt Algorithm is a Python library used to hash and salt passwords securely. It enables the creation of a password protection layer that can develop local hardware innovation to protect against long-term hazards or threats, such as attackers having the computational capacity to guess passwords twice as efficiently. + +All the necessary code snippets for this task are found in [example.py](example.py). diff --git a/.student_resources/encrypting_passwords/example.py b/.student_resources/encrypting_passwords/example.py new file mode 100644 index 0000000..e365dda --- /dev/null +++ b/.student_resources/encrypting_passwords/example.py @@ -0,0 +1,29 @@ +########################################################################### +# Beginner code snippets, the bcrypt library has a range of other methods # +# https://pypi.org/project/bcrypt/ # +########################################################################### + +import bcrypt + +# Plain text password +my_password = "I Am All The Jedi" + +# UTF-8 is the default Python chaarcter set +my_encoded_password = my_password.encode() + +# Salt to add to password before Hashing +salt = b"$2b$12$ieYNkQp8QumgedUo30nuPO" + +# Hashed Password +hashed_password = bcrypt.hashpw(password=my_encoded_password, salt=salt) + +print(f"How actual password will appear in logs etc: {my_encoded_password.hex()}") + +# Python print statement will decode it but if the variable is logged, it will be logged as a string of bytes +print(f"Actual Password: {my_encoded_password.decode()}") + +# Print Hashed Password +print(f"Hashed Password: {hashed_password.decode()}") + +# Check if a plain text password matches a hashed password. It returns a Boolean value. +print(f"Are they the same password: {bcrypt.checkpw(my_encoded_password, hashed_password)}") diff --git a/.student_resources/encrypting_passwords/salt+hash.png b/.student_resources/encrypting_passwords/salt+hash.png new file mode 100644 index 0000000000000000000000000000000000000000..6212e7ba5cb0667c7ed04f10cdf0fbd960c50876 GIT binary patch literal 28385 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 literal 0 HcmV?d00001 diff --git a/.student_resources/flask_safe_API/README.md b/.student_resources/flask_safe_API/README.md new file mode 100644 index 0000000..53782b3 --- /dev/null +++ b/.student_resources/flask_safe_API/README.md @@ -0,0 +1,36 @@ +# API + +API is the acronym for application programming interface — a software intermediary that allows two applications to talk to each other. APIs are an accessible way to extract and share data within and across organizations. + +> [!NOTE] +> The [W3C defines API's as best pratice](https://www.w3.org/TR/dwbp/#accessAPIs) in making data available. + +This example, safe API, is a basic implementation for a random movie generator. The API will randomly select a film for its database and return it as JSON. An API argument call can return whether the movie was liked or disliked. A new movie can also be added to the database through the POST method with a JSON file to the API. + +To allow cross origins, you need to install the flask CORS library. + +> [!IMPORTANT] +> This is an example of how to create a secure API in a development environment. A secure public API would have the following additional features: +> +> - HTTPS encryption +> - A CSP policy that enforces HTTPS for all communication +> - API rate limits, for example, [Flask Limiter](https://flask-limiter.readthedocs.io/en/stable/) +> - Detailed logging of all POST and GET requests for security analysis + +```bash + pip install flask_cors +``` + +| API Call | Result | +| --- | --- | +| [http://127.0.0.1:1000/](http://127.0.0.1:1000/ ) | A random movie is selected from the database and returned to the user as a JSON file with a response code 200. | +| [http://127.0.0.1:1000/?dislike="123"](http://127.0.0.1:1000/?dislike="123") | A database entry is created recording a like for film_id "123" if the id exists and a response code 200 returned to the user. | +| [http://127.0.0.1:1000/?like="456"](http://127.0.0.1:1000/?like="456") | A database entry is created recording a dislike for film_id "456" if the id exists and a response code 200 returned to the user. | +| [http://127.0.0.1:1000/add_film](http://127.0.0.1:1000/add_film) | If the submitted JSON is correctly constructed and validated, then a film entry will be added to the films database, and a response code 201 returned to the user. | + +## Helpful Links + +- [Open Movie Database](https://www.omdbapi.com/) an example API interface. +- [Create a Python Flask API in 12 minutes](https://www.youtube.com/watch?v=zsYIw6RXjfM) a video tutorial. +- [Postman](https://www.postman.com/), an app to test your API. +- An alternative to [Postman](https://www.postman.com/) is to run the [index.html](/index.html) file from a local folder. The webpage allows you to test a POST, GET or HEAD request to the API and confirm the response. It is a handy utility if you are not able to install Postman. diff --git a/.student_resources/flask_safe_API/__pycache__/database_management.cpython-312.pyc b/.student_resources/flask_safe_API/__pycache__/database_management.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..252fc5c23b45440d673c7ec87c69cb7c2f4e80ad GIT binary patch literal 746 zcmb7BJ#W-N5Z(3Hoz7eW1R)|QC~=b?a70KECq9}Z0wPdk$=dVI1#|W~+O;D&RSNz? zDEI@{@h7NgptXdAlqwQMbk~K3nav?x2`kO>c)asw-t*UfzsK-=Ir}~N#Th%Jm%qnZ zCW{A{oHEHI&so9uIcL)O!1f*KBD&H;^rVmIH$l`nr?!Zkx)_T! z1mxrrS)}*LeZ?YwbdD>qHh7}TV^D1{%#4C2a$6^pt*1l*ZD6WeX620OkXSI-<@E6& z-ZP+0JO*_r;ui{rIy-`RSf+IWsxtA@ta?_Du@sdU3j;|ZlsEw5**a|6^#iC9EtD*aWRm5DCLyHAtRtMTpEox?zWsdX zdpP*!4fHjvr6g+gSp8(gDQnn_kF1m#8b*9cCJi;**L}n`)R2~1CV4gmy@8bu#)9C4 zT?EVz|6zo_j@RuFeFL*q`n4s!%#59I8^6=e#z#OgUhlv7@vnR2+vTz0pMQr0;<(s!{&PMLcM7cS@g2iu%` T4u3fBx;&is93Czxv!nh1WZ$Hy literal 0 HcmV?d00001 diff --git a/.student_resources/flask_safe_API/database_management.py b/.student_resources/flask_safe_API/database_management.py new file mode 100644 index 0000000..06b64d1 --- /dev/null +++ b/.student_resources/flask_safe_API/database_management.py @@ -0,0 +1,19 @@ +from flask import jsonify + +def get_random_film(): + #driver response only, to be implemented + return {"id": 1, "name": "Frozen", "studio": "Disney"} + +def record_like(film_id): + #print(f"You have liked the movie id={film_id}", file=sys.stderr) + #to be implemented + return + +def record_dislike(film_id): + #to be implemented + return + +def add_film(data): + # verify and sanitise JSON to be implemented + # Add film to database to be implemented + return \ No newline at end of file diff --git a/.student_resources/flask_safe_API/index.html b/.student_resources/flask_safe_API/index.html new file mode 100644 index 0000000..46910ed --- /dev/null +++ b/.student_resources/flask_safe_API/index.html @@ -0,0 +1,195 @@ + + + + + + Simple HTTP Request Tool + + + +
+
+

Simple HTTP Request Tool

+
+

Test your API with this POST, GET & HEAD application.

+

Cross-origin resource sharing must be enabled server side.

+

Verbose logs print to the console

+
+
+
+
+
+
+ + + +
+
+
+
+
+
+ + +
+
+ + +

Validate your JSON

+
+
+ +
+
+
+
+
+
+

Response

+
+
+
HTTP response status code:
+

Status code documentation

+
+
+
+
Response Body:
+ +
+
+ + + + + \ No newline at end of file diff --git a/.student_resources/flask_safe_API/main.py b/.student_resources/flask_safe_API/main.py new file mode 100644 index 0000000..ee89bb6 --- /dev/null +++ b/.student_resources/flask_safe_API/main.py @@ -0,0 +1,38 @@ +from flask import Flask +from flask import request +from flask import jsonify +import database_management as dbHandler +from flask_cors import CORS, cross_origin + +app = Flask(__name__) +cors = CORS(app) +app.config['CORS_HEADERS'] = 'Content-Type' + +@app.route('/', methods=['GET']) +def get_film(): + film = dbHandler.get_random_film() + # For security data is validated on entry + if request.args.get("like") and request.args.get("like").isdigit(): + film_id = request.args.get("like") + app.logger.info(f"You have liked the film id={film_id}") #debugging statement only + dbHandler.record_like(film_id) + # For security data is validated on entry + if request.args.get("dislike") and request.args.get("dislike").isdigit(): + film_id = request.args.get("dislike") + app.logger.critical(f"You have disliked the film id={film_id}") #debugging statement only + dbHandler.record_dislike(film_id) + return jsonify(film), 200 + + +@app.route('/add_film', methods=['POST', 'HEAD']) +def add_film(): + data = request.get_json() + info = dict(request.headers) + app.logger.critical(f"User {info}") + app.logger.critical(f"Has added the movie {data}") + dbHandler.add_film(data) + return data, 201 + +if __name__ == '__main__': + app.run(debug=True, host='0.0.0.0', port=1000) + diff --git a/.student_resources/secure_form_attributes/README.md b/.student_resources/secure_form_attributes/README.md new file mode 100644 index 0000000..252875b --- /dev/null +++ b/.student_resources/secure_form_attributes/README.md @@ -0,0 +1,45 @@ +# Form Atributes + +## Examples + +```html + +``` + +```html + +``` + +## Pattern Attribute + +```html + +``` + +The pattern attribute specifies a regular expression the form control's value should match. Read more about [form patterns here](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern). + +## Placeholder Attribute + +```html + +``` + +Places guiding text in the input field to help the user know what data is expected. This is a feature of a User Interface called 'type hints, ' which improves the user experience when completing the form. + +## Maxlength Attributes + +```html + +``` + +Maxlength sets the length a characters a user can input, the attribute helps secure against long strings containing scripts being entered. diff --git a/.student_resources/security_testing_approaches/README.md b/.student_resources/security_testing_approaches/README.md new file mode 100644 index 0000000..e16f99f --- /dev/null +++ b/.student_resources/security_testing_approaches/README.md @@ -0,0 +1,103 @@ +# Security Testing Approaches + +Software Engineers should consider security and privacy at every phase of the SDLC to ensure that security is an integral part of the development process. As an application moves through phases of the SDLC, the cost of patching a vulnerability increases. + +| Phase | Security by Design Processes | +| -------- | ------- | +| Requirements definition |
  • Gather specific security and privacy requirements
  • Vulnerability assessment
| +| Determining specifications |
  • Explict security and privacy specifications
  • Risk assessment
| +| Design |
  • Threat modelling
  • Security design review
  • Security tests included in test designs
| +| Development |
  • Code reviews
  • Static application security testing
| +| Integration |
  • Risk assessment
  • Code reviews
  • Dynamic application security testing
  • Grey-box penetration testing
| +| Testing and debugging |
  • Code reviews
  • Static application security testing
  • Dynamic application security testing
  • Penetration testing
| +| Installation |
  • Penetration testing
  • Vulnerability assessment
| + +## Code review +Code review is the process of thoroughly examining and evaluating an application's source code to identify potential security vulnerabilities at the code level. It is a manual approach to white-box testing. + +| Area of focus | Questions to ask | +| -------- | ------- | +| Privacy |
  • Is sensitive data stored that is not required for the application?
  • Is sensitive data in error logged to the log files?
  • Are passwords encryted before storage or use?
  • Can users download and delete their data?
  • Are users provided access to the privacy policy?
  • Are users who shouldn't have access to the log files able to access them (any or all employees)?
| +| Authentication |
  • Are application users authenticated, or are they all treated as anonymous users?
  • What factors are used for authentication (such as passwords, tokens, and certificates)?
  • If passwords are being used, are there any policies regarding complexity or age in place?
| +| Authorization |
  • Are there different roles that users can be given depending on the applications’ function?
  • Is the authorization data cached checked for each incoming request?
  • Are there any private, sensitive data files stored in the web root that are not authorized for the regular user?
| +| Data Validation |
  • Is the user-submitted data validated?
  • Is data validated as soon as it comes in from the user or when it is used by the code?
  • How is the data validation accomplished (whitelisting, blacklisting, min/max, etc.)?
  • Are you using a database? If so, are you passing arguements
| +| Exception/Error Handling |
  • What approach(s) for error handling is being used?
  • What kind of details about an error are displayed to the user?
  • Are errors logged with enough detail for analysis?
  • Are database errors logged with enough detail for analysis?
| +| Session Management |
  • Is there any way the application manages or stores session state, and if so, how?
  • How is the session id being generated?
  • Is the previous session deleted when a user logs into the site and creates a new session?
  • Are tokens used for session management? If yes, what algorithm is used?
  • Any timeouts for sessions?
| +| Logging |
    Is any logging being used within the code?
  • Where are generated log messages sent?
  • Are you logging any input that is not validated first or data that has failed validation?
  • Are log messages time-stamped?
  • Is any sensitive data written to a log (e.g., password, API key, etc.)?
| +| Encryption |
    Are there any encryption algorithms used within the code at all? (SSL, TLS, RSA?)
  • Are passwords encrypted before use with a 'salt' and a 'hash' algorithm>
  • Where did you get the library's implementation, and what version is it using?
| + +--- + +## Static application security testing (SAST) + +Static application security testing (SAST), or static analysis, is a testing methodology that analyzes source code to find security vulnerabilities. SAST usually is an automated approach to white-box testing that scans an application before the code is compiled. + +[List of SAST tools](https://owasp.org/www-community/Source_Code_Analysis_Tools) + +| *SAST advantages* | *SAST disadvantages* | +| -------- | ------- | +| - Reduction in manual effort | - Unable to detect business logic flaws | +| - Time efficient | - Cannot discover runtime issues | +| - Can be performed at the early stages of the SDLC | - Not well suited to track issues where user input is involved | +| - Offers 100% code coverage | - Requires access to the source code | +| - Provide an elaborate report | - Unable to provide application Specific Recommendations | + +--- + +## Dynamic application security testing (DAST) +Dynamic application security testing (DAST) is a testing methodology in which testers examine an application while it’s running but have no knowledge of the application’s internal interactions or designs at the system level and no access or visibility of application source code. This is an automated approach to “black-box”. + +[List of DAST tools](https://owasp.org/www-community/Vulnerability_Scanning_Tools) + +| *DAST advantages* | *DAST disadvantages* | +| -------- | ------- | +| Produces virtually no false positives | Requires working application to be tested | +| Can discover runtime issues | Needs special testing infrastructure and customization | +| Can discover issues based on user interaction with the software | Often performed towards the end of the software development cycle | +| Does not require access to the source code | Does not cover all code paths | + +## Vulnerability assessment + +A vulnerability assessment is a systematic review of security weaknesses in a system. It evaluates if the system is susceptible to any known vulnerabilities, assigns severity levels to those vulnerabilities, and recommends remediation or mitigation. The focus of a vulnerability assessment is infrastructure, processes and practices. It is more about the organisation than the source code of a single application. + +### Specific vulnerability assessments + +- *Host assessment* – The assessment of critical servers, which may be vulnerable to attacks. +- *Network assessment* – The assessment of policies and practices to prevent unauthorized access to private or public networks and network-accessible resources. +- *Database assessment* – The assessment of databases and data systems for vulnerabilities and misconfigurations, identifying rogue datasets/databases or insecure dev/test environments. +- *Application scans* – The identification of security vulnerabilities in web applications and their source code using DAST & SAST approaches. + +## Penetration testing + +> [!WARNING] +> Students MUST be extremely aware of the legal implications of performing unauthorised penetration testing. Students MUST only perform penetration tests on their applications or peers' applications with expressed permission. + +Penetration testing (or pen testing) is a security exercise where a cyber-security expert attempts to find and exploit vulnerabilities in a computer system. The purpose of this simulated attack is to identify any weak spots in a system’s defences that attackers could take advantage of by deploying the same strategies. Penetration testing requires the use of both automated tools and brute-force attacks. + +### Types of penetration testing + +- *White-box pen test* - In a white-box pen test, the tester will perform tests with full knowledge of the application, often live watching the logs as they perform tests. +- *Grey-box pen test* - In a grey-box pen test, the tester will perform tests with some knowledge on the application. +- *Black-box pen test* - In a black-box pen test, the tester is given no background or insight into the source code and is only provided the front end of the application. +- Organisational level penetration testing such as _Covert pen test_, _External pen test_ and _Internal pen test_ are not in the scope of this course. + +### Brute force testing tools/support + +- [XSS test scripts](.student_resources\XSS\README.md#Non-destructive_XSS_Test_Scripts) some sample scripts to apply to input boxes to test for XSS vulnerabilities. +- [SQL Injections test scripts](https://www.w3schools.com/sql/sql_injection.asp) some sample scripts to apply to login and input boxes to test for SQL injection vulnerabilities. +- [Common usernames & passwords](https://github.com/danielmiessler/SecLists/tree/master/Passwords/Common-Credentials) to inpit to any dictionary or bruteforce test. +- [Simple HTTP Request Tool](.student_resources\flask_safe_API\index.html) a simple website to test HTTP requests for a localhost website. +- [CyberChef - The Cyber Swiss Army Knife](https://gchq.github.io/CyberChef/) A simple, intuitive web app for analysing and decoding data. + +### Pen testing tools/support + +- [ZAPROXY](https://www.zaproxy.org/) Open source penetration testing application. +- [View DNS](https://viewdns.info/) suite of DNS and hosting scanning tools +- [MX Toolbox](https://mxtoolbox.com/NetworkTools.aspx) All of your MX record, DNS, blacklist and SMTP diagnostics in one integrated tool. +- [SSL Tools](https://www.ssllabs.com/projects/index.html) suite of SSL scanning tools +- [Postman](https://www.postman.com/) A tool to test API's and applications +- [Wireshark](https://www.wireshark.org/about.html) the world's foremost network protocol analyser. +- [A expensive list of open source pen-testing tools](https://www.esecurityplanet.com/applications/open-source-penetration-testing-tools/) + +> [!CAUTION] +> For the [NESA software engineering syallabus](https://curriculum.nsw.edu.au/learning-areas/tas/software-engineering-11-12-2022/overview); students only need to know that penetration testing tools exist and have basic experience with using a tool and it's reporting capabilities. Students should not spend expecssive time comparing or testing different tools. diff --git a/.student_resources/two_factor_authentication/2FA_Phone_QRCode.py b/.student_resources/two_factor_authentication/2FA_Phone_QRCode.py new file mode 100644 index 0000000..4a3de18 --- /dev/null +++ b/.student_resources/two_factor_authentication/2FA_Phone_QRCode.py @@ -0,0 +1,35 @@ +############################################################# +# This program uses the Google Authenticator App # +# Avialable in Google Play Store & Apple App Store # +# Everytime you compile and run the code you need to update # +# the QRCode image and rescan the QRCode in the app # +############################################################# + +import pyotp # pip install pyotp +import time +import qrcode # pip install qrcode + +def gen_key(): + return pyotp.random_base32() + +def gen_url(key): + return pyotp.totp.TOTP(key).provisioning_uri(name="bob", issuer_name = '2fa App') + +def verify_code(key: str, code: str): + totp = pyotp.TOTP(key) + return totp.verify(code) + +key = gen_key() + +totp = pyotp.TOTP(key) + +uri = gen_url(key) + +#print(uri) + +qrcode.make(uri).save("newCode.png") + +while True: + #print(totp.verify(input("Enter code: "))) + code = input("Enter code: ") + print(verify_code(key, code)) diff --git a/.student_resources/two_factor_authentication/2FA_Python.py b/.student_resources/two_factor_authentication/2FA_Python.py new file mode 100644 index 0000000..9c51b15 --- /dev/null +++ b/.student_resources/two_factor_authentication/2FA_Python.py @@ -0,0 +1,33 @@ +import pyotp +import time + +def gen_key(): + return pyotp.random_base32() + +def gen_url(key): + return pyotp.totp.TOTP(key).provisioning_uri(name="bob", issuer_name = '2fa App') + +def generate_code(key: str): + totp = pyotp.TOTP(key) + return totp.now() + +def verify_code(key: str, code: str): + totp = pyotp.TOTP(key) + return totp.verify(code) + +key = gen_key() #TOFO: Put in Database + +print(key) + +uri = gen_url(key) + +print(uri) + +code = generate_code(key) +print(code) + +time.sleep(30) +code2 = generate_code(key) + +print(verify_code(key, code)) +print(verify_code(key, code2)) diff --git a/.student_resources/two_factor_authentication/README.md b/.student_resources/two_factor_authentication/README.md new file mode 100644 index 0000000..2e39cf7 --- /dev/null +++ b/.student_resources/two_factor_authentication/README.md @@ -0,0 +1,150 @@ +# How to Guide – 2FA using Google Authenticator and Flask + +How to add an additional layer of security to the Flask app using Google Authenticator. Which requires the addition of a page in-between the login page and the end page the user is aiming to access. + +## Install the required libraries + +```bash + pip install qrcode + pip install pyotp +``` + +The QRcode package is issued to generate the image (typically a PNG file) and render the QR codes directly to the console. In this case, we will send the file name to our HTML page to be rendered. + +The pyotop package is used the generate the one-time password and is used to implement two-factor authentication in web applications. Further information is provided in the article [pyotp 2.9.0](https://pypi.org/project/pyotp/). + +```python + from flask import Flask, render_template, request, redirect, url_for, session + import userManagement as dbHandler + import pyotp + import pyqrcode + import os + import base64 + from io import BytesIO +``` + +## Adding 2FA + +Start by adding a secret key variable at the beginning of your Python file. This will be used to securely sign the session cookies and can be used for any other security-related needs. + +```python + app = Flask(__name__) + app.secret_key = 'my_secret_key' +``` + +We now need to redirect (update) the login button, when successful, to the 2FA page, which will display the QRcode and ask for the code (return redirect(url_for('enable_2fa')) #redirect to 2FA page). + +We also need to add in code to generate the one-time passcode (user_secret = pyotp.random_base32()). + +```python + def home(): + user_secret = pyotp.random_base32() #generate the one-time passcode + return redirect(url_for('enable_2fa')) #redirect to 2FA page +``` + +## Create the HTML page + +Create the index HTML page within the template folder and name it index.html. + +We then need to insert the code below, which displays the QRCode generated by the Python file, renderings it to the HTML using the IMG tag and requests that the one-time passcode be entered using a form. + +This tag in HTML adds the QRcode generated in the Python file. Make sure the name used within the { } brackets, in this case, qr_code, matches the one created in the Python file. + +```html + +``` + +```html +

Welcome Enable 2FA {{ value }}!

+

Scan this QR Code with Google Authenticator

+ +``` + +We then need to add a form to the page to get the code entered by the user after they scan the QRcode. + +Again, make sure the name you assign to the input matches the one used in the Python file, in this case, OTP. + + +```htmk +
+
+
+ +
+ +``` + +## Create Routes in Flask + +Create routes to handle HTTP requests (like GET and POST) when a user submits the one-time passcode. + +```python + @app.route('/index.html', methods=['POST', 'GET']) + @app.route('/', methods=['POST', 'GET']) +``` + +## Create a function to generate the QRcode image and one-time passcode then verify if it matches + +In this section of code, we need to generate a secret key for the user. + +```python + def home(): + user_secret = pyotp.random_base32() +``` +  +We are now going to generate the QRCode and one-time passcode. + +The line of code below is used generate the one time passcode based on the secret key generated in the previous step. This will then be used to generate the QRCode using the inbuilt function `totp.provisioning_uri(name=username,issuer_name="YourAppName")`. + +```python + totp = pyotp.TOTP(user_secret) +``` + +Note: the name of the image created is qr_code.png. Remember this name needs to match the one used in the HTML file. + +The line, `qr_code.png(stream, scale=5)`, allows you to adjust the size of the QR Code + +The final line of code is used to encode binary data into printable ASCII characters and decoding such encodings back to binary data. + +```python + totp = pyotp.TOTP(user_secret) + otp_uri = totp.provisioning_uri(name=username,issuer_name="YourAppName") + qr_code = pyqrcode.create(otp_uri) + stream = BytesIO() + qr_code.png(stream, scale=5) + qr_code_b64 = base64.b64encode(stream.getvalue()).decode('utf-8') +``` + +All that is left is to validate the entry of the one-time passcode and redirect the user to the desired page. + +In this section we are retrieving the input from the form using the line of code: + +```python + otp_input = request.form[‘otp’] +``` + +We then use the inbuilt function `totp.verify` to validate the code entered matches the one generated by Google Authenticator app. If the valid code matches, we direct the user to the desired page, as they have successfully logged on using 2FA. + +Note, you will need to either created a new some_page.html page or change the name to the page you wish to display. + +You may also wish to create a page which indicates the code entered is invalid as currently it simply displays a plain message to a blank page. + +```python + if request.method == 'POST': + otp_input = request.form['otp'] + if totp.verify(otp_input): + return render_template('some_page.html') + #return redirect(url_for('home')) # Redirect to home if OTP is valid + else: + return "Invalid OTP. Please try again.", 401 + + return render_template(index.html') +``` + +## Run Your Flask App: + +```bash + python app.py +``` + +Finally, run the Flask app, and test the newly created page using the Google Authenticator app. Note, you may need to rescan the qrcode every time modifications are made to the code. diff --git a/.student_resources/two_factor_authentication/emailVerify/__pycache__/app.cpython-310.pyc b/.student_resources/two_factor_authentication/emailVerify/__pycache__/app.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4930bf9e284c636a064a8e416b01301d4f6f4a16 GIT binary patch literal 1894 zcmZ8iOK%%D5MFYhT1mF#M`9;!qZWNYKw({a=pii{*h(s-kc~)ok-aRoOWIy}9|}pi zwV|AxYyLxW>>uiZ*Pi+dS_CN28OknXbHUl!;gI6@@#Cm!HbV>A`9FWNSH5Nai66_& zfsY@c%Rj&{i;>)l@J(}4(1;TB?c6S$$SK^&ExgDp{KzkYC@5-C&5S#FSk$9Bu{gc5 zz&gBfMWQBic{5(&)@1cvi+S%!)V}t8@Yk;W0Q~i9zXtvWuk$uvyQ0x1Z%*#9kkwh^ zgtF#a%2wFw8w*yx&swbg#)`H~#@bTGI@>TA+ia8FgNz4^jI8eczW|#x>=IqitAxd@ zQoKCxdfI)OC-O}Dg1?$^sr0JgCF3GiyqM;R;yMtVWrC+l`;tqURi*Z4B9D(N0jqht zdB#f>H6%|3S7-bpuX4RM{(11zU_XAcySsll9LJ-9ra%f zp1zDn{TD}r-M(&(`oq0vF9v(@lY>G0y#Mk8>1q2}f2^H@{m~eH)i1a@t(Z&^)J-Gc z*wA;O%WuIbYeE<~qhbp@%ILQB+L~L+X7*!CIdhp)fU!h3MSOD=$w_?(OEI7<@+e8g$R_+^*@Z@=xFsv_?O0yU+*#WuAATonSO zXX&;CdT-4Z9>hg}#s$+QVjW(;TVe}dAHM4yN-kut5Ids!rBb~;F3(go?Tz~Jh^I5b z<1w6HyjS&mW{*d>v5Q_Zo$gF8w3}BaS=ok_WCKh{LlVH#fG!?DAVtz{8U+XUZ3z4l z93=1^RrY%_aVG8@ZU&=o>1(3AIhpuKAG3fidnnc*yGu1yRph6qNm+6rL3^nYhxQCx z7dika=UK|7z|BO>WfCQ13yy+wry>JI*)n5YYRHHh%bA9lh1rH>#CnzVV`8%D1oF|fZl(^_5CrMWBT&^xaPm>dVy$YyV2)MJp5uy>O*aY0-9vHoq zp7QkUmM~*go$*q1Fvlp;_nY11XB` zrrkP|&mekNfWR&R0n$00cz8ZWd>|4$e(fN4Q2@#p)j4MX^dkt1kI{UB#)xkH_Qnyl z6pwJeCsm?mvTH}~^t38Lh=u^|8fxys!|i zpPZM3r2^3Zvf%i!VkBf@Ua{fKm2KhOdz-o{VoR~)g WxLOU0r`I4MZDBd7wZf1zR{jHfTgu=7 literal 0 HcmV?d00001 diff --git a/.student_resources/two_factor_authentication/emailVerify/app.py b/.student_resources/two_factor_authentication/emailVerify/app.py new file mode 100644 index 0000000..6d6eaf7 --- /dev/null +++ b/.student_resources/two_factor_authentication/emailVerify/app.py @@ -0,0 +1,53 @@ +import os +from dotenv import load_dotenv +from flask import Flask, request, render_template, redirect, session, url_for +from twilio.rest import Client + +load_dotenv() +app = Flask(__name__) +app.secret_key = 'secretkeylol' + +TWILIO_ACCOUNT_SID = os.environ.get('TWILIO_ACCOUNT_SID') +TWILIO_AUTH_TOKEN= os.environ.get('TWILIO_AUTH_TOKEN') +TWILIO_VERIFY_SERVICE = os.environ.get('TWILIO_VERIFY_SERVICE') +SENDGRID_API_KEY= os.environ.get('SENDGRID_API_KEY') + +client = Client(TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN) + +@app.route('/', methods=['GET', 'POST']) +def login(): + if request.method == 'POST': + to_email = request.form['email'] + session['to_email'] = to_email + send_verification(to_email) + return redirect(url_for('generate_verification_code')) + return render_template('index.html') + +def send_verification(to_email): + verification = client.verify \ + .services(TWILIO_VERIFY_SERVICE) \ + .verifications \ + .create(to=to_email, channel='email') + print(verification.sid) + +@app.route("/verifyme", methods=['GET', 'POST']) +def generate_verification_code(): + to_email = session['to_email'] + error = None + if request.method == 'POST': + verification_code = request.form['verificationcode'] + if check_verification_token(to_email, verification_code): + print("Successful code") + return render_template('success.html', email = to_email) + #return ('Success') + else: + error = "Invalid verification code. Please try again." + return render_template('verifypage.html', error = error) + return render_template('verifypage.html', email = to_email) + +def check_verification_token(phone, token): + check = client.verify \ + .services(TWILIO_VERIFY_SERVICE) \ + .verification_checks \ + .create(to=phone, code=token) + return check.status == 'approved' diff --git a/.student_resources/two_factor_authentication/emailVerify/templates/index.html b/.student_resources/two_factor_authentication/emailVerify/templates/index.html new file mode 100644 index 0000000..7b4e996 --- /dev/null +++ b/.student_resources/two_factor_authentication/emailVerify/templates/index.html @@ -0,0 +1,23 @@ + + + + + +

Login

+ + +
+
+ + +
+
+

+ +

+
+
+ + diff --git a/.student_resources/two_factor_authentication/emailVerify/templates/success.html b/.student_resources/two_factor_authentication/emailVerify/templates/success.html new file mode 100644 index 0000000..c1e6ac0 --- /dev/null +++ b/.student_resources/two_factor_authentication/emailVerify/templates/success.html @@ -0,0 +1,18 @@ + + + + + + Successful Verification! + + +
+

+ {{email}}'s Profile +

+

+ Thanks for verifying your email! +

+
+ + \ No newline at end of file diff --git a/.student_resources/two_factor_authentication/emailVerify/templates/verifypage.html b/.student_resources/two_factor_authentication/emailVerify/templates/verifypage.html new file mode 100644 index 0000000..19ee17f --- /dev/null +++ b/.student_resources/two_factor_authentication/emailVerify/templates/verifypage.html @@ -0,0 +1,30 @@ + + + + + + Verify your account + + +

+ Please verify your account {{email}} +

+ {% if error %} +

Error: {{ error }} + {% endif %} +

+
+ + +

+
+
+

+ +

+
+
+ + diff --git a/.student_resources/two_factor_authentication/images/new_page.png b/.student_resources/two_factor_authentication/images/new_page.png new file mode 100644 index 0000000000000000000000000000000000000000..ef76b8fc3d3d1fe19fda0504ddda88581bc6acbe GIT binary patch literal 21198 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 literal 0 HcmV?d00001 diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..adae7ae --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,12 @@ +{ + "files.autoSave": "onFocusChange", + "editor.formatOnPaste": true, + "editor.formatOnSave": true, + "editor.defaultFormatter": "ms-python.black-formatter", + "editor.fontSize": 18, + "terminal.integrated.defaultProfile.windows": "Git Bash", + "workbench.editorAssociations": { + "*.md": "vscode.markdown.preview.editor", + }, + "window.restoreWindows" +} \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..cbe5ad1 --- /dev/null +++ b/LICENSE @@ -0,0 +1,437 @@ +Attribution-NonCommercial-ShareAlike 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International +Public License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution-NonCommercial-ShareAlike 4.0 International Public License +("Public License"). To the extent this Public License may be +interpreted as a contract, You are granted the Licensed Rights in +consideration of Your acceptance of these terms and conditions, and the +Licensor grants You such rights in consideration of benefits the +Licensor receives from making the Licensed Material available under +these terms and conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. BY-NC-SA Compatible License means a license listed at + creativecommons.org/compatiblelicenses, approved by Creative + Commons as essentially the equivalent of this Public License. + + d. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + e. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + f. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + g. License Elements means the license attributes listed in the name + of a Creative Commons Public License. The License Elements of this + Public License are Attribution, NonCommercial, and ShareAlike. + + h. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + i. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + j. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + k. NonCommercial means not primarily intended for or directed towards + commercial advantage or monetary compensation. For purposes of + this Public License, the exchange of the Licensed Material for + other material subject to Copyright and Similar Rights by digital + file-sharing or similar means is NonCommercial provided there is + no payment of monetary compensation in connection with the + exchange. + + l. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + m. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + n. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part, for NonCommercial purposes only; and + + b. produce, reproduce, and Share Adapted Material for + NonCommercial purposes only. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. Additional offer from the Licensor -- Adapted Material. + Every recipient of Adapted Material from You + automatically receives an offer from the Licensor to + exercise the Licensed Rights in the Adapted Material + under the conditions of the Adapter's License You apply. + + c. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties, including when + the Licensed Material is used other than for NonCommercial + purposes. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + b. ShareAlike. + + In addition to the conditions in Section 3(a), if You Share + Adapted Material You produce, the following conditions also apply. + + 1. The Adapter's License You apply must be a Creative Commons + license with the same License Elements, this version or + later, or a BY-NC-SA Compatible License. + + 2. You must include the text of, or the URI or hyperlink to, the + Adapter's License You apply. You may satisfy this condition + in any reasonable manner based on the medium, means, and + context in which You Share Adapted Material. + + 3. You may not offer or impose any additional or different terms + or conditions on, or apply any Effective Technological + Measures to, Adapted Material that restrict exercise of the + rights granted under the Adapter's License You apply. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database for NonCommercial purposes + only; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material, + including for purposes of Section 3(b); and + + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the “Licensor.” The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. diff --git a/README.md b/README.md new file mode 100644 index 0000000..985583e --- /dev/null +++ b/README.md @@ -0,0 +1,79 @@ +> [!CAUTION] +> # DISCLAIMER +> __This progressive web app has been designed with a range of security vulnerabilities. The app has been specifically designed for students studying the [NESA HSC Software Engineering Course](https://curriculum.nsw.edu.au/learning-areas/tas/software-engineering-11-12-2022/content/n12/fa039e749d). The app is NOT secure and should only be used in a sandbox environment.__ + +
+ +# The Unsecure PWA +Your client, "The Unsecure PWA Company", has engaged you as a software engineering security specialist to provide expert advice on the security and privacy of their application. This progressive web app is currently in the testing and debugging phase of the software development lifecycle. + +## The task +You are to run a range of security tests and scans along with a white/grey/black box analysis of the application/source code to identify as many security and privacy vulnerabilities as possible. You are then required to prepare a professionally written report for your client that includes: +1. An overview of your approach to the technical analysis. +2. Document out-of-the-scope privacy and security issues of your report, including; + - Security or privacy issues that cannot be mitigated by technical engineering solutions + - Security issues that must be tested in the production environment +4. Identify all security or privacy vulnerabilities you discovered and provide an impact assessment of each. +5. Provide recommendations for "The Unsecure PWA Company's" security and privacy by design approach going forward.   +6. Design and develop implementations using HTML/CSS/JS/SQL/JSON/Python code and/or web content changes as required to patch each vulnerability you discover. + +--- + +> [!TIP] +> ## Teaching advice: +> +> This app has been designed as either a teaching tool, an assessment tool or an assessment as a learning tool. __As a teaching tool__ the teacher can use the app to demonstrate discrete vulnerabilities and then teach the preferred patch method. __As an assessment tool__ the students should be taught the knowledge and skills, then given the app to analyse and report on before designing and developing appropriate patches (patching all will be time-prohibitive). __As an assessment as a learning tool__ teachers can teach vulnerabilities in the app and then support students to design and develop patches while assessing them formatively. + +--- + +## Support + +To support students first understanding specific security vunerabilities and privacy issues and then follow a best practice approach to patching them, the links below have been provided with most resources provided from the [.student_resources folder](.student_resources) and specifically aligned to the [NESA Course Specifications](https://library.curriculum.nsw.edu.au/341419dc-8ec2-0289-7225-6db7f2d751ef/94e1eb0a-0df7-4dbe-9b72-5d5e0d17143a/software-engineering-11-12-higher-school-certificate-course-specifications.PDF) and [NESA Software Engineering Syllabus](https://curriculum.nsw.edu.au/learning-areas/tas/software-engineering-11-12-2022/content/n12/fa039e749d). + +### Security testing support + +- [Security testing approaches](.student_resources\security_testing_approaches\README.md) for the NESA Software Engineering Syllabus. +- [Web Security Testing Guide \(WSTG\) Project](https://owasp.org/www-project-web-security-testing-guide/v42/) a very detailed resource for web application developers. +- [ZAPROXY](https://www.zaproxy.org/) Open source penetration testing application +- [XSS test scripts](.student_resources\XSS\README.md#Non-destructive_XSS_Test_Scripts). +- [SQL Injections test scripts](https://www.w3schools.com/sql/sql_injection.asp). + +### Privacy issues support + +- [Australian Government Privacy](https://www.ag.gov.au/rights-and-protections/privacy). +- [How to create an app that complies with data privacy regulations](https://moldstud.com/articles/p-how-to-create-an-app-that-complies-with-data-privacy-regulations). +- [Australian Government - Responding to cyber security incidents](https://www.cyber.gov.au/resources-business-and-government/essential-cyber-security/ism/cyber-security-guidelines/guidelines-cyber-security-incidents) + +### Security support + +- [The Open Worldwide Application Security Project](https://owasp.org/) is the most current and accurate source of knowledge about web application security. +- [Best practices in protecting flask applications](https://escape.tech/blog/best-practices-protect-flask-applications/). + +### Solution implementation support + +- [Cross Frame Scripting XFS](.student_resources\XFS\README.md). +- [Cross-Site Request Forgery (CSRF)](.student_resources\CSRF\README.md). +- [Defensive Data Handling](.student_resources\defensive_data_handling). +- [Creating an API with Flask](.student_resources\flask_safe_API\README.md). +- [Secure form attributes](.student_resources\secure_form_attributes\README.md). +- [Two Factor Authentication (2FA)](.student_resources\two_factor_authentication\README.md). +- [Flask broken authentication solution](https://brightsec.com/blog/broken-authentication-impact-examples-and-how-to-fix-it/). +- [SSL encryption for localhost 127.0.0.1](https://hackernoon.com/how-to-get-sslhttps-for-localhost-i11s3342). +- [Flask session management](https://pythonbasics.org/flask-sessions/) +- [Cross Site Scripting XSS](.student_resources\XSS_scripts\README.md). +- [SQL Injections](.student_resources\SQL_Injection). +- [Content Security Policy](.student_resources\content_security_policy\README.md) + +--- + +> [!IMPORTANT] +> # Dependencies +> +> - VSCode +> - Python 3+ +> - Flask pip install flask +> - The Resources in [.student_resources](.student_resources/) requires additonal Dependencies please refer to the documentation. + +--- + +

The Unsecure PWA by Ben Jones is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International

diff --git a/__pycache__/userManagement.cpython-312.pyc b/__pycache__/userManagement.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ced456d8ac38bc75215cece39dc6d4355f79a033 GIT binary patch literal 2480 zcmbVN%}*Og6rc6(de=4%CQwqMHr-Zg?Ij4BMv9sk(h_XIKupC)(;`>Mc!yxe_Bylc z5UiyFm58FIf}Da>@drd)(i_JfBlY4Is#;49l`2(=dO?sAr@mRde3hD{v)VUrX5PFv zGw=7_``PPtBWOSV&D};kLVwbM-5h0RrwN$HNI?pdMk9>XJ4PIeV-Ah53Ja7|IH0`3 z19eU@vhxMq8cnce4YYH@PsclJKprEVfzE0v+m1Z}y~3=P*QZ&7O~J{Ix7G5*G-q%r z;rJ?Oa2Uv7497UTTGr1X(B%5Jq^-$X_f%S+LNXiOZBXKRd@Qcv&SV;EE%vBc87q7m zi4KMbhNMVzs9(x!m}pXfcG-9aH|64*HmMS&33lNA@f%5^Psq~e?R~@HK`HP_6MXU$ zr^#w})25J6vss+bO=lucG?kbFzK;`m9m9m0$s~1?Poz~1%e*Pt229bmV6q|ghRK2s zAh4f4pG4bkZ^yORFg;gn3}q_d~`LWp01RfpEYG9P$ z(a&zR$EcZ`@ofAyrgF`>Dbt;Vb)r*!g;-Tl!_M+t_F z3yt430m}*Vy|cX~v8Uv!S^9W+uqeL!l4p76mWX(9zGt>)u8+z@W+M-JcR(3R9L5Lr zw1uL-fO!oRISfZd6j7A@2a0|`3TrSxxfR|<-z?+nR(E(HZ1EIiQd^tkFVy;__Gn15;b2YfGXBmX*-2;^5_(f2 zQbOaw6vwfim{7Br(8J0csiI3>N~$UG0nz9YD27N4Fs7Gaoh0!+Y@vyqgE>n|0p?ZQ z@4oaj@br8!7=3pCS*rNOmql^pCF=kbIFaa?H)f4*zFw~TRd~B3dKO&^u7{pdb=@Ba zd@ZR3Ly7$y0t1S^|C3)BgQFsGma-oET>`EVu~$5)xG{({3V6MA`>rH)9Jo?k%Oe%tqp0^WL!h(!jf=ojj@6a8ZQqmnPCp*mFdg-+pbHHB3;yM{nD za)i)VL4=_0uqhfH$C`39N1PyGaEh}5c0ooFRvh+et&DPlv?3lzJZ$4=4Xd0{knAdB zsQzfau(46_>o}83LlM$ia&e+3<7ur$%O|j=joLEJ6M80XGLr?aHFw?pg2ve{<1X;6 zEijbD3RxtcPFq>TQJT*0BLfxVw%jj$r5$)pf>I0m8x`7)A!-|KG^*L ze(if872)YQvlv_m7SFY;dp`W#bM+U`)pbvBCRDB@bG^^Ss-pMG8oMsG&a`h<*M7^E zMAxFQAS?+R;+r;qdFk$>D@%dp_m;dH;stwF{7r1w5|FQsmMG_Z*KF5=h=p@mFa@aA zaKX#giz`SfX#My#r*6Wf*1?y|IZr Z+fI@3ZP$C4y6v}k#<$~hGiNLX{{Tf8<_rJ; literal 0 HcmV?d00001 diff --git a/databaseFiles/database.db b/databaseFiles/database.db new file mode 100644 index 0000000000000000000000000000000000000000..ac48913ecb450be2138f4f9caef439e5a15e2de3 GIT binary patch literal 16384 zcmeI(O-~a+7y#heE}u#}QUaR@CBwzE(g5AICYXwD?JC4lYPSk_F~jau7Wx4@TWy+X zB=PLogZ={fJ^lbL{sI$^&Ms`UjWix5d3U*NfC;Bd-ZMS7NO@}pD(@h4wNmbvelG2tqpB0OVa%eRgS zP1YC6J)hp!7;n-BONx<+6D*A?iXxr7_2+DJ=5W6X^^EsZ|90zMS8w{>TThZB%K4j? zWA)`N>awj`-gex5za`@EQJuKltSxKETiMBYX$n!ZSD&`8nuIfi@5T0T2KI z5C8!X009sH0T2KI5cr=3#v;QAPokZU84V93C5EWgu$#fEIWi$~)2P!myB$u=ZsdAj ze9e!!*`Zy_Wa7i58>|!{}2@%AOHd&00JNY0w4eaAOHd&00JNY0#{jJA|%J8V4K6t zxFjo*zsVpP#^1#6|ECC_iX8y+7o{n7>igv?KQi1q2!H?xfB*=900@8p2!H?xfB*XYq{m~L2F{ni~G6r z9&165-10?2wB`o3&R^adpODdZl{JnSS+`&96T{qZwd%xh+m`qj11H;hMJMZ`S`g27 NJLow#Bcsdb`~_e;A&>w7 literal 0 HcmV?d00001 diff --git a/databaseFiles/myQueries.sql b/databaseFiles/myQueries.sql new file mode 100644 index 0000000..1440d4f --- /dev/null +++ b/databaseFiles/myQueries.sql @@ -0,0 +1,11 @@ +--CREATE TABLE users(id INTEGER PRIMARY KEY autoincrement,username TEXT NOT NULL, password TEXT NOT NULL,dateOfBirth TEXT); + +--INSERT INTO users(username,password,dateOfBirth) VALUES ("admin","password","01/01/1990"); + +--SELECT * FROM extension; + +-- CREATE TABLE feedback(id INTEGER PRIMARY KEY autoincrement,feedback TEXT NOT NULL); + +-- INSERT INTO feedback(feedback) VALUES ("Tempe High School Students WERE HERE!"); + +DELETE FROM feedback WHERE id > 12; \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..2ff790f --- /dev/null +++ b/main.py @@ -0,0 +1,52 @@ +from flask import Flask +from flask import render_template +from flask import request +import userManagement as dbHandler + +app = Flask(__name__) + + +@app.route("/sucess.html", methods=["POST", "GET", "PUT", "PATCH", "DELETE"]) +def addFeedback(): + if request.method == "POST": + feedback = request.form["feedback"] + dbHandler.insertFeedback(feedback) + dbHandler.listFeedback() + return render_template("/sucess.html", state=True, value="Back") + else: + dbHandler.listFeedback() + return render_template("/sucess.html", state=True, value="Back") + + +@app.route("/signup.html", methods=["POST", "GET", "PUT", "PATCH", "DELETE"]) +def signup(): + if request.method == "POST": + username = request.form["username"] + password = request.form["password"] + DoB = request.form["dob"] + dbHandler.insertUser(username, password, DoB) + return render_template("/index.html") + else: + return render_template("/signup.html") + + +@app.route("/index.html", methods=["POST", "GET", "PUT", "PATCH", "DELETE"]) +@app.route("/", methods=["POST", "GET"]) +def home(): + if request.method == "POST": + username = request.form["username"] + password = request.form["password"] + isLoggedIn = dbHandler.retrieveUsers(username, password) + if isLoggedIn: + dbHandler.listFeedback() + return render_template("/sucess.html", value=username, state=isLoggedIn) + else: + return render_template("/index.html") + else: + return render_template("/index.html") + + +if __name__ == "__main__": + app.config["TEMPLATES_AUTO_RELOAD"] = True + app.config["SEND_FILE_MAX_AGE_DEFAULT"] = 0 + app.run(debug=True, host="0.0.0.0", port=5000) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..2077213 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +Flask \ No newline at end of file diff --git a/static/css/.DS_Store b/static/css/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 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 literal 0 HcmV?d00001 diff --git a/static/icons/icon-192x192.png b/static/icons/icon-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..8416f7e83b04e042b80696aab58fcaa12b10c8e6 GIT binary patch literal 24966 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 fWbt<^PdT&@MpKRy;c4Wueg5$KSvf2 literal 0 HcmV?d00001 diff --git a/static/icons/icon-384x384.png b/static/icons/icon-384x384.png new file mode 100644 index 0000000000000000000000000000000000000000..8416f7e83b04e042b80696aab58fcaa12b10c8e6 GIT binary patch literal 24966 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 fWbt<^PdT&@MpKRy;c4Wueg5$KSvf2 literal 0 HcmV?d00001 diff --git a/static/icons/icon-512x512.png b/static/icons/icon-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..67d296ee6dcc51b28beb41eb067a8d41399f9d28 GIT binary patch literal 16972 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 e$lyq+5G3Pzx{thR8QLg literal 0 HcmV?d00001 diff --git a/static/images/favicon.png b/static/images/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..2e06eb3ca6776861396ef7a09702d08962036692 GIT binary patch literal 15523 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 z zM!jk3=Oxui^o{xiOtg7>Moyv4<06NxmVuzE$S;*j*R*OIj55HA}V_mZWQA4Y%0J$z;%*1A#jGAq-_0^W3pAN?B#tM(uY!t zC2NI&cR8I103YrY(PIuA-Tm^?Nd7<)-}&uV7{adFtrDmV0FT(p;F5H0MDwcm^V3hN z3wA{+v+&yc4nLC#6<<3MgaI8We*x?6>i2YdC-qgiCbYfpcwb3TBSI1%YHHg8E)-2W z@6v1kK>D0ZS_-Z21w+-~*NZA#CJw->%zIT9v18wifUI*oM5!iOn+y09L+2p>c1Q-I zB;x+<_%=Iu%jWg7+35O#IxQWVvAFs>Vfp7zokuW}u^v!&0&r3l1f_7-JVz8gDgpT)M^~KFy6hh9B^igE&WKmx-CZt;JU)nAeQEaUrXev& zQ&R6&>~123FIHZ?6s=!XdLYVWVgs-Qu);JZ+{>yYu-Q7Q7;5qL2EahY`^eP}`kv!8 za;^4>wwhB$?N6mq?%qx0E<2`{`0%q^=QjV~%%kO}NkB_!E1giU!hJ%TdgTD&+gkeNs8$S+#z_1EZhf9qo5oLh zWHrD+A|6WMkApv(KD$p;nL1iKHUHSR#EahBF_ zoq`u6;c_=00f`dO%50hg$%jH#(_f4m{bT`>%F~2MhXoUim0*5?GV-KjFA(kpstQv(gFYIi%qofLpl|6sq67Ux^Y+JCBt{#T6? zvqYe6AF9o7qKQx4Le97UO{Q6N5$z_Yv-K7#V@YD`r>9TZC;VA8XxLtG+}sHCPzT6K znudPbe7(5kcezqar&cq#maPh3>vAbKrx|r6ID$bQYAV$5ZhXMPL&kx&C@I*Y z`oI#3t0$}gYK0;PNpO#5%Umkvs=&aDtWz{3P?hLlUT*F-*YJ>|vOzy0ho6u6aW7py zMFed;VH|FCI&3lmYVhui8`?`b^MvaJf?&P8$@a+ix>xd#@5=$F%;XedcCq^e{pN+0 zt1+gWF@;Z1u*N5MzA@**1y3~Pn-i0IPtTGq;JRt1^)w8P(4l{M(&hf1pqL(OeDYMi zuNzYZ;7HLg6faStn@`KIryVFIw%}oP;KI+sWa8p&!ae(PRYu}CPz6y)TJ!Jj?WMb5 zA)dDuhH`}wl)Z{`hBRP{qH<7{{*Ao&fl?-PFp70nP;CP6k5~vQIP#M$%ltKoALPKd z+;TRCqF{@#eXdH{N-{q#B%h%}aPmIt=&`iMEifRMS7WFj=rXi#f{#juc+?tc8^w`G zO&glU9&MA*T=5EMc@u9k^(1M6Kk(V_6F{Vq72Iets? z>$T04=KuKnivWL9t}|<3l;E4vIWDQaZk%yi!iQdi0G;l9gKBS;F%8J?s(V)J!gf+< zctQ$&iO6z;|5z zwreA=FMERe+d$NNz^J`R0_x4lTZkM=bexB?!Ms4b!HHsft&wDev_Twz3z)Z=j=^Yn z(!KBk?!_#~SI)IaolgHK!BnIAJ?LHpP;9&6=r<^)GaAX`2kuJ|KBms-9nWgKasi{f z-o}JV1y>N3_nJS+U-Ki{XA{178%H_%EZ_1Op&(%o zK@W(fbnMSh9xf0a-ew}`WxojZyHaVH_+01uWJQFoO*v1`Lq~)V`Ke4!e?T-X=B1Tz ndL6`7L<(H}{QqS*eFB>HteWR5by+<98L`$aJ+*Qb>j(b>N53`A literal 0 HcmV?d00001 diff --git a/static/images/logo.svg b/static/images/logo.svg new file mode 100644 index 0000000..6eb6163 --- /dev/null +++ b/static/images/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/js/app.js b/static/js/app.js new file mode 100644 index 0000000..374265a --- /dev/null +++ b/static/js/app.js @@ -0,0 +1,8 @@ +if ("serviceWorker" in navigator) { + window.addEventListener("load", function () { + navigator.serviceWorker + .register("static/js/serviceWorker.js") + .then((res) => console.log("service worker registered")) + .catch((err) => console.log("service worker not registered", err)); + }); + } \ No newline at end of file diff --git a/static/js/serviceWorker.js b/static/js/serviceWorker.js new file mode 100644 index 0000000..6d5b130 --- /dev/null +++ b/static/js/serviceWorker.js @@ -0,0 +1,56 @@ +const assets = [ + "/", + "static/css/style.css", + "static/js/app.js", + "static/images/logo.png", + "static/images/favicon.jpg", + "static/icons/icon-128x128.png", + "static/icons/icon-192x192.png", + "static/icons/icon-384x384.png", + "static/icons/icon-512x512.png" + ]; + +const CATALOGUE_ASSETS = "catalogue-assets"; + +self.addEventListener("install", (installEvt) => { + installEvt.waitUntil( + caches + .open(CATALOGUE_ASSETS) + .then((cache) => { + console.log(cache) + cache.addAll(assets); + }) + .then(self.skipWaiting()) + .catch((e) => { + console.log(e); + }) + ); +}); + +self.addEventListener("activate", function (evt) { + evt.waitUntil( + caches + .keys() + .then((keyList) => { + return Promise.all( + keyList.map((key) => { + if (key === CATALOGUE_ASSETS) { + console.log("Removed old cache from", key); + return caches.delete(key); + } + }) + ); + }) + .then(() => self.clients.claim()) + ); +}); + +self.addEventListener("fetch", function (evt) { + evt.respondWith( + fetch(evt.request).catch(() => { + return caches.open(CATALOGUE_ASSETS).then((cache) => { + return cache.match(evt.request); + }); + }) + ); +}) \ No newline at end of file diff --git a/static/manifest.json b/static/manifest.json new file mode 100644 index 0000000..e4bb377 --- /dev/null +++ b/static/manifest.json @@ -0,0 +1,68 @@ +{ + "name": "The Unsecure PWA", + "short_name": "unsecPWA", + "start_url": "/", + "display": "standalone", + "background_color": "#000", + "theme_color": "#000", + "orientation": "portrait-primary", + "icons": [ + { + "src": "icons/icon-128x128.png", + "type": "image/png", + "sizes": "128x128", + "purpose": "maskable" + }, + { + "src": "icons/icon-128x128.png", + "type": "image/png", + "sizes": "128x128", + "purpose": "any" + }, + { + "src": "icons/icon-192x192.png", + "type": "image/png", + "sizes": "192x192", + "purpose": "maskable" + }, + { + "src": "icons/icon-192x192.png", + "type": "image/png", + "sizes": "192x192", + "purpose": "any" + }, + { + "src": "icons/icon-384x384.png", + "type": "image/png", + "sizes": "384x384", + "purpose": "maskable" + }, + { + "src": "icons/icon-384x384.png", + "type": "image/png", + "sizes": "384x384", + "purpose": "any" + }, + { + "src": "icons/icon-512x512.png", + "type": "image/png", + "sizes": "512x512", + "purpose": "maskable" + }, + { + "src": "icons/icon-512x512.png", + "type": "image/png", + "sizes": "512x512", + "purpose": "any" + } + ], + "screenshots" : [ + { + "src": "icons/screenshot.png", + "sizes": "1920x1080", + "type": "image/png", + "form_factor": "wide", + "label": "Homescreen of The Unsecure PWA" + } + ] + } \ No newline at end of file diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..e53e8f2 --- /dev/null +++ b/templates/index.html @@ -0,0 +1,15 @@ +{% extends 'layout.html' %} +{% block content %} +

Login

+
+
+ +
+
+ +
+
+ +
+
+{% endblock %} \ No newline at end of file diff --git a/templates/layout.html b/templates/layout.html new file mode 100644 index 0000000..1f00cbb --- /dev/null +++ b/templates/layout.html @@ -0,0 +1,37 @@ + + + + + + + The Unsecure PWA + + + + + +
+ +
+ This progressive web app has been written specifically for students studying the 'Secure Software Architecture' unit. The application has been written with intentional vunerabilities that students are to identify and implement solutions. Users should not use this as a template or enter any real data when interacting with the application. +
+ + + {% block content %}{% endblock %} + + + + + + \ No newline at end of file diff --git a/templates/partials/sucess_feedback.html b/templates/partials/sucess_feedback.html new file mode 100644 index 0000000..53cce12 --- /dev/null +++ b/templates/partials/sucess_feedback.html @@ -0,0 +1,6 @@ +

+Tempe High School Students WERE HERE! +

+

+ +

diff --git a/templates/signup.html b/templates/signup.html new file mode 100644 index 0000000..ce88b10 --- /dev/null +++ b/templates/signup.html @@ -0,0 +1,22 @@ +{% extends 'layout.html' %} +{% block content %} + +

Signup Form

+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + + +{% endblock %} \ No newline at end of file diff --git a/templates/sucess.html b/templates/sucess.html new file mode 100644 index 0000000..bfe7d11 --- /dev/null +++ b/templates/sucess.html @@ -0,0 +1,20 @@ +{% extends 'layout.html' %} +{% block content %} +

Welcome {{ value }}!

+
+
+ +
+
+ +
+
+
+
+

Others feedback

+ +
+ {% include "partials/sucess_feedback.html" %} +
+ +{% endblock %} \ No newline at end of file diff --git a/userManagement.py b/userManagement.py new file mode 100644 index 0000000..fef6991 --- /dev/null +++ b/userManagement.py @@ -0,0 +1,48 @@ +import sqlite3 as sql +import json + + +def insertUser(username, password, DoB): + con = sql.connect("databaseFiles/database.db") + cur = con.cursor() + cur.execute( + "INSERT INTO users (username,password,dateOfBirth) VALUES (?,?,?)", + (username, password, DoB), + ) + con.commit() + con.close() + + +def retrieveUsers(username, password): + con = sql.connect("databaseFiles/database.db") + cur = con.cursor() + cur.execute( + f"SELECT * FROM users WHERE username == '{username}' AND password == '{password}'" + ) + if cur.fetchone() == None: + con.close() + return False + else: + con.close() + return True + + +def insertFeedback(feedback): + con = sql.connect("databaseFiles/database.db") + cur = con.cursor() + cur.execute(f"INSERT INTO feedback (feedback) VALUES ('{feedback}')") + con.commit() + con.close() + + +def listFeedback(): + con = sql.connect("databaseFiles/database.db") + cur = con.cursor() + data = cur.execute("SELECT * FROM feedback").fetchall() + con.close() + f = open("templates/partials/sucess_feedback.html", "w") + for row in data: + f.write("

\n") + f.write(f"{row[1]}\n") + f.write("

\n") + f.close()