-
Notifications
You must be signed in to change notification settings - Fork 2
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
Adding OWASP Code #1
base: main
Are you sure you want to change the base?
Conversation
📝 WalkthroughWalkthroughThe changes in this pull request introduce a new educational application demonstrating common security vulnerabilities based on the OWASP Top 10. Key components include two microservices: an Auth Service and a Profile Service, both containing intentional vulnerabilities. The Auth Service handles user authentication, while the Profile Service manages user profiles and file uploads. Additionally, a frontend React application is provided for user interaction. Environment configurations, Dockerfiles for service containers, and necessary dependencies have been added to support the application. Changes
🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
@coderabbitai review |
✅ Actions performedReview triggered.
|
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.
Actionable comments posted: 26
🧹 Outside diff range and nitpick comments (7)
owasp-top10/README.md (3)
1-9
: Enhance the security warning messageWhile the warning is present, consider making it more prominent and detailed by:
- Adding a more visible warning banner
- Including specific risks of deploying vulnerable code
- Adding a note about proper security practices
-# Educational Vulnerable Application +# ⚠️ EDUCATIONAL VULNERABLE APPLICATION ⚠️ -**WARNING: This application is intentionally vulnerable and meant for educational purposes only. DO NOT deploy this in any production environment.** +**🔥 SECURITY WARNING 🔥** +> - This application contains INTENTIONAL security vulnerabilities +> - FOR EDUCATIONAL PURPOSES ONLY +> - NEVER deploy this code in production environments +> - Running this application may expose your system to security risks +> - Always follow secure coding practices in real applications
10-60
: Enhance vulnerability documentation with additional resourcesConsider enriching the vulnerability descriptions with:
- Links to official OWASP documentation for each vulnerability
- Code snippets showing both vulnerable and secure implementations
- Basic mitigation strategies for educational purposes
Example enhancement for one section:
### 1. Broken Access Control (A01:2021) +> 🔗 [OWASP Reference](https://owasp.org/Top10/A01_2021-Broken_Access_Control/) - No role-based access control implementation - Direct object references without verification - Location: `auth_service/routes.py` - endpoint `/api/user/<id>` + +Example of vulnerable code: +```python +@app.route('/api/user/<id>') +def get_user(id): + return db.users.find_one({'id': id}) # Vulnerable: No access control +``` + +Secure implementation: +```python +@app.route('/api/user/<id>') +@require_authentication +def get_user(id): + if current_user.id != id and not current_user.is_admin: + return forbidden() + return db.users.find_one({'id': id}) +``` + +Mitigation: +- Implement proper authentication +- Use role-based access control +- Validate user permissions before access
117-121
: Improve automated testing section and fix markdown issuesThe automated testing section needs more detail and proper URL formatting.
## Automated Testing -Run security scanners against http://localhost:5000 and http://localhost:5001 to detect vulnerabilities. +Run security scanners against the following endpoints to detect vulnerabilities: +- Auth Service: [http://localhost:5000](http://localhost:5000) +- Profile Service: [http://localhost:5001](http://localhost:5001) + +Recommended security scanning tools: +- OWASP ZAP +- Burp Suite Community Edition +- Nikto + +Scanning Guidelines: +1. Start services in test mode +2. Configure scanner settings for educational environment +3. Review and document findings +4. Clean up after testing ## Disclaimer -This application is for educational purposes only. It contains intentional security vulnerabilities to demonstrate common security issues. DO NOT use any of this code in production environments. +This application is for educational purposes only. It contains intentional security +vulnerabilities to demonstrate common security issues. + +⚠️ IMPORTANT: +- DO NOT use any of this code in production environments +- DO NOT use real credentials or sensitive data +- DO NOT expose this application to the internet +- DO NOT use these vulnerable practices in real applications🧰 Tools
🪛 Markdownlint (0.35.0)
118-118: null
Bare URL used(MD034, no-bare-urls)
118-118: null
Bare URL used(MD034, no-bare-urls)
owasp-top10/profile_service/app.py (1)
1-68
: Security Architecture Review RequiredThis code appears to be intentionally vulnerable as part of an OWASP educational application. However, if this were production code, it would require significant security improvements:
- Implement proper authentication and authorization
- Add rate limiting to prevent DoS attacks
- Use secure session management
- Implement proper input validation and sanitization
- Add security headers (HSTS, CSP, etc.)
- Use secure configuration management
- Implement proper logging and monitoring
- Add request validation middleware
Consider using security frameworks and following OWASP secure coding guidelines.
🧰 Tools
🪛 Ruff (0.8.0)
4-4:
pickle
imported but unusedRemove unused import:
pickle
(F401)
7-7:
json
imported but unusedRemove unused import:
json
(F401)
owasp-top10/auth_service/app.py (1)
5-5
: Remove unused import 'json'The
json
module is imported but not used. Removing unused imports improves code readability and cleanliness.Apply this diff to remove the unused import:
-import json
🧰 Tools
🪛 Ruff (0.8.0)
5-5:
json
imported but unusedRemove unused import:
json
(F401)
owasp-top10/frontend/src/components/Register.js (2)
5-10
: Consider adding validation state for form fieldsAdd state for field validation to provide immediate feedback to users before form submission.
const [userDetails, setUserDetails] = useState({ username: '', password: '', }); const [error, setError] = useState(''); +const [validation, setValidation] = useState({ + username: { isValid: true, message: '' }, + password: { isValid: true, message: '' } +});
46-72
: Enhance form UX with password requirements and loading stateAdd password requirements display and loading state for better user experience.
<div className="login-container"> <h2>Register</h2> {error && <p style={{ color: 'red' }}>{error}</p>} + <div className="password-requirements"> + <p>Password must contain:</p> + <ul> + <li>At least 8 characters</li> + <li>One uppercase letter</li> + <li>One lowercase letter</li> + <li>One number</li> + <li>One special character</li> + </ul> + </div> <form onSubmit={handleSubmit}> {/* ... existing inputs ... */} - <button type="submit">Register</button> + <button type="submit" disabled={isLoading}> + {isLoading ? 'Registering...' : 'Register'} + </button> </form>
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
⛔ Files ignored due to path filters (5)
owasp-top10/auth_service/__pycache__/utils.cpython-312.pyc
is excluded by!**/*.pyc
,!**/*.pyc
owasp-top10/docker-compose.yml
is excluded by!**/*.yml
owasp-top10/frontend/package-lock.json
is excluded by!**/package-lock.json
,!**/*.json
owasp-top10/frontend/package.json
is excluded by!**/*.json
owasp-top10/users.db
is excluded by!**/*.db
,!**/*.db
📒 Files selected for processing (19)
owasp-top10/.env
(1 hunks)owasp-top10/.gitignore
(1 hunks)owasp-top10/README.md
(1 hunks)owasp-top10/auth_service/Dockerfile
(1 hunks)owasp-top10/auth_service/app.py
(1 hunks)owasp-top10/auth_service/utils.py
(1 hunks)owasp-top10/frontend/Dockerfile
(1 hunks)owasp-top10/frontend/public/index.html
(1 hunks)owasp-top10/frontend/src/App.css
(1 hunks)owasp-top10/frontend/src/App.js
(1 hunks)owasp-top10/frontend/src/components/Dashboard.js
(1 hunks)owasp-top10/frontend/src/components/Login.js
(1 hunks)owasp-top10/frontend/src/components/Register.js
(1 hunks)owasp-top10/frontend/src/context/AuthContext.js
(1 hunks)owasp-top10/frontend/src/index.js
(1 hunks)owasp-top10/mongo/Dockerfile
(1 hunks)owasp-top10/profile_service/Dockerfile
(1 hunks)owasp-top10/profile_service/app.py
(1 hunks)owasp-top10/requirements.txt
(1 hunks)
✅ Files skipped from review due to trivial changes (9)
- owasp-top10/.gitignore
- owasp-top10/.env
- owasp-top10/mongo/Dockerfile
- owasp-top10/profile_service/Dockerfile
- owasp-top10/auth_service/Dockerfile
- owasp-top10/frontend/Dockerfile
- owasp-top10/frontend/public/index.html
- owasp-top10/frontend/src/index.js
- owasp-top10/frontend/src/App.css
🧰 Additional context used
🪛 LanguageTool
owasp-top10/README.md
[uncategorized] ~63-~63: You might be missing the article “a” here.
Context: ...point ## Setup Instructions 1. Create virtual environment: ```bash python -m venv ven...
(AI_EN_LECTOR_MISSING_DETERMINER_A)
🪛 Markdownlint (0.35.0)
owasp-top10/README.md
118-118: null
Bare URL used
(MD034, no-bare-urls)
118-118: null
Bare URL used
(MD034, no-bare-urls)
97-97: null
Fenced code blocks should have a language specified
(MD040, fenced-code-language)
108-108: null
Fenced code blocks should have a language specified
(MD040, fenced-code-language)
113-113: null
Fenced code blocks should have a language specified
(MD040, fenced-code-language)
🪛 Biome (1.9.4)
owasp-top10/frontend/src/components/Dashboard.js
[error] 34-34: Avoid passing content using the dangerouslySetInnerHTML prop.
Setting content using code can expose users to cross-site scripting (XSS) attacks
(lint/security/noDangerouslySetInnerHtml)
🪛 Ruff (0.8.0)
owasp-top10/auth_service/app.py
5-5: json
imported but unused
Remove unused import: json
(F401)
owasp-top10/profile_service/app.py
4-4: pickle
imported but unused
Remove unused import: pickle
(F401)
7-7: json
imported but unused
Remove unused import: json
(F401)
🪛 Gitleaks (8.21.2)
owasp-top10/auth_service/app.py
13-13: Detected a Generic API Key, potentially exposing access to various services and sensitive operations.
(generic-api-key)
🔇 Additional comments (2)
owasp-top10/frontend/src/context/AuthContext.js (1)
1-13
: Authentication context implemented correctly
The AuthContext
and AuthProvider
are correctly set up using React's Context API. This implementation allows for centralized authentication state management.
owasp-top10/frontend/src/App.js (1)
1-26
: Application routing configured correctly
The routing setup using React Router is correctly implemented. Wrapping the application with AuthProvider
ensures that authentication state is accessible throughout the app.
Flask==2.0.1 | ||
PyJWT==1.7.1 | ||
requests==2.25.1 |
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.
Critical: Update packages with known security vulnerabilities
Several dependencies have known security vulnerabilities that should be addressed:
- Flask 2.0.1 is vulnerable to CSRF attacks (CVE-2023-30861)
- PyJWT 1.7.1 has a critical vulnerability (CVE-2022-29217) allowing algorithm=None
- requests 2.25.1 should be updated to latest stable version
Apply this diff to update to secure versions:
-Flask==2.0.1
-PyJWT==1.7.1
-requests==2.25.1
+Flask==2.3.3
+PyJWT==2.8.0
+requests==2.31.0
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
Flask==2.0.1 | |
PyJWT==1.7.1 | |
requests==2.25.1 | |
Flask==2.3.3 | |
PyJWT==2.8.0 | |
requests==2.31.0 |
pymongo==3.12.0 | ||
python-dotenv==0.19.0 |
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.
💡 Codebase verification
Environment configuration needs immediate attention
The verification reveals several security concerns:
- MongoDB connection string is hardcoded in the application code instead of using environment variables
- No environment variable validation or documentation exists
.env
file is committed to version control (found atowasp-top10/.env
)- No
.env.example
template file exists to guide configuration - No startup validation for required environment variables
Required actions:
- Remove
.env
from version control and add it to.gitignore
- Move MongoDB connection string to environment variable
- Add environment variable validation at startup
- Create
.env.example
with required variables - Update README.md with environment configuration instructions
🔗 Analysis chain
Security considerations for environment configuration
While python-dotenv is used for loading environment variables:
- Ensure sensitive credentials are not committed to version control
- Consider using a secrets management service for production
- Document required environment variables in README.md
- Add validation for required environment variables at startup
Let's verify the current environment variable handling:
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Check for .env files and environment variable documentation
echo "Checking for .env files..."
fd -H ".env"
echo "\nChecking for environment variable documentation..."
rg -i "environment|env var|configuration" "README.md"
Length of output: 261
Script:
#!/bin/bash
# Check contents of .env file and look for environment variable usage
echo "Checking .env file contents..."
cat owasp-top10/.env
echo -e "\nChecking for environment variable usage in Python files..."
rg "os\.environ|load_dotenv" -A 3
echo -e "\nChecking for environment variable validation..."
ast-grep --pattern 'os.environ["$_"]'
Length of output: 452
Script:
#!/bin/bash
# Let's check for database connection and environment loading code
echo "Checking for database connection code..."
rg -l "MongoClient|connect.*mongo"
echo -e "\nChecking for environment variable initialization..."
rg "load_dotenv|getenv|os\.environ"
echo -e "\nChecking for any validation or configuration setup..."
ast-grep --pattern 'def $_($$ENV$$):
$$$'
Length of output: 488
Script:
#!/bin/bash
# Let's examine the database connection code
echo "Checking database connection implementation..."
cat owasp-top10/profile_service/app.py
echo -e "\nChecking for any example environment files..."
fd ".env.example|.env.sample|.env.template"
echo -e "\nChecking for configuration documentation in the service directory..."
rg -i "environment|configuration|setup" owasp-top10/profile_service/
Length of output: 2423
## Setup Instructions | ||
|
||
1. Create virtual environment: | ||
```bash | ||
python -m venv venv | ||
source venv/bin/activate # Linux/Mac | ||
venv\Scripts\activate # Windows | ||
``` | ||
|
||
2. Install dependencies: | ||
```bash | ||
pip install -r requirements.txt | ||
``` | ||
|
||
3. Set up MongoDB: | ||
- Use local MongoDB instance or | ||
- Create free MongoDB Atlas cluster | ||
|
||
4. Configure environment: | ||
```bash | ||
cp .env.example .env | ||
# Edit .env with your MongoDB URI | ||
``` | ||
|
||
5. Run services: | ||
```bash | ||
# Terminal 1 | ||
python auth_service/app.py | ||
|
||
# Terminal 2 | ||
python profile_service/app.py | ||
``` | ||
|
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.
🛠️ Refactor suggestion
Enhance setup instructions with security considerations
While the setup instructions are functional, consider adding:
- Development environment security recommendations
- Specific version requirements
- MongoDB security configuration guidelines
## Setup Instructions
+
+### Prerequisites
+- Python 3.8 or higher
+- MongoDB 4.4 or higher
+- Virtual environment tool
+
+### Security Considerations
+> ⚠️ Development Environment Safety:
+> - Use a dedicated development environment
+> - Never use production credentials
+> - Isolate the vulnerable application network
1. Create virtual environment:
```bash
python -m venv venv
source venv/bin/activate # Linux/Mac
venv\Scripts\activate # Windows
- Install dependencies:
pip install -r requirements.txt
- Set up MongoDB:
-
- Use local MongoDB instance or
-
- Create free MongoDB Atlas cluster
-
- Use local MongoDB instance:
-
```bash
-
# Secure local setup
-
mongod --bind_ip 127.0.0.1 --port 27017
-
```
-
- Or create free MongoDB Atlas cluster:
-
- Enable IP whitelist
-
- Create dedicated user with minimal privileges
-
- Use strong passwords
<details>
<summary>🧰 Tools</summary>
<details>
<summary>🪛 LanguageTool</summary>
[uncategorized] ~63-~63: You might be missing the article “a” here.
Context: ...point ## Setup Instructions 1. Create virtual environment: ```bash python -m venv ven...
(AI_EN_LECTOR_MISSING_DETERMINER_A)
</details>
</details>
<!-- This is an auto-generated comment by CodeRabbit -->
## Testing Vulnerabilities | ||
|
||
1. SQL Injection: | ||
``` | ||
Username: admin' OR '1'='1 | ||
Password: anything | ||
``` | ||
|
||
2. NoSQL Injection: | ||
```javascript | ||
{"$gt": ""} in username field | ||
``` | ||
|
||
3. Weak Passwords: | ||
``` | ||
Any password with length > 1 is accepted | ||
``` | ||
|
||
4. SSRF Test: | ||
``` | ||
/fetch-avatar?url=file:///etc/passwd | ||
``` | ||
|
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.
🛠️ Refactor suggestion
Enhance testing instructions with safety measures and expected outcomes
The testing instructions should include:
- Expected outcomes for each test
- Safety precautions
- Cleanup procedures after testing
## Testing Vulnerabilities
+
+> ⚠️ SAFETY FIRST:
+> - Use only in isolated development environment
+> - Never test these payloads against real systems
+> - Clean up test data after experiments
1. SQL Injection:
-```
+```sql
Username: admin' OR '1'='1
Password: anything
+Expected outcome: Unauthorized access to admin account
+Cleanup: Reset admin password after testing
- NoSQL Injection:
{"$gt": ""} in username field
+Expected outcome: Bypass authentication
+Cleanup: Check and remove any unauthorized sessions
- Weak Passwords:
-+
text
Any password with length > 1 is accepted
+Expected outcome: Creation of account with weak password
+Cleanup: Remove test accounts
4. SSRF Test:
-```
+```http
/fetch-avatar?url=file:///etc/passwd
+Expected outcome: Unauthorized file read
+Cleanup: Review and remove any cached files
<details>
<summary>🧰 Tools</summary>
<details>
<summary>🪛 Markdownlint (0.35.0)</summary>
97-97: null
Fenced code blocks should have a language specified
(MD040, fenced-code-language)
---
108-108: null
Fenced code blocks should have a language specified
(MD040, fenced-code-language)
---
113-113: null
Fenced code blocks should have a language specified
(MD040, fenced-code-language)
</details>
</details>
<!-- This is an auto-generated comment by CodeRabbit -->
from flask import Flask, request, jsonify | ||
import requests | ||
from pymongo import MongoClient | ||
import pickle | ||
from flask_cors import CORS # Import CORS |
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.
Remove dangerous unused imports
The pickle
module is a security risk as it can execute arbitrary code during deserialization. Since it's unused, it should be removed.
from flask import Flask, request, jsonify
import requests
from pymongo import MongoClient
-import pickle
from flask_cors import CORS # Import CORS
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
from flask import Flask, request, jsonify | |
import requests | |
from pymongo import MongoClient | |
import pickle | |
from flask_cors import CORS # Import CORS | |
from flask import Flask, request, jsonify | |
import requests | |
from pymongo import MongoClient | |
from flask_cors import CORS # Import CORS |
🧰 Tools
🪛 Ruff (0.8.0)
4-4: pickle
imported but unused
Remove unused import: pickle
(F401)
const response = await fetch('http://127.0.0.1:5000/register', { | ||
method: 'POST', | ||
headers: { | ||
'Content-Type': 'application/json', | ||
}, | ||
body: JSON.stringify({ | ||
username: userDetails.username, | ||
password: userDetails.password, | ||
}), | ||
}); |
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.
Critical: Address security vulnerabilities in API implementation
Several security concerns need to be addressed:
- Hardcoded API URL should be moved to environment configuration
- Missing CSRF protection
- No password strength validation
- No rate limiting protection against brute force attacks
Consider these improvements:
- Move API URL to environment variable:
-const response = await fetch('http://127.0.0.1:5000/register', {
+const response = await fetch(`${process.env.REACT_APP_API_URL}/register`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
+ 'X-CSRF-Token': getCsrfToken(), // Add CSRF token
},
- Add password validation before submission:
const validatePassword = (password) => {
const minLength = 8;
const hasUpperCase = /[A-Z]/.test(password);
const hasLowerCase = /[a-z]/.test(password);
const hasNumbers = /\d/.test(password);
const hasSpecialChar = /[!@#$%^&*]/.test(password);
return password.length >= minLength && hasUpperCase &&
hasLowerCase && hasNumbers && hasSpecialChar;
};
<button type="submit">Register</button> | ||
</form> | ||
<p> | ||
Already have an account? <a href="/login">Login</a> |
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.
🛠️ Refactor suggestion
Replace anchor tag with React Router's Link component
Using anchor tags for internal navigation causes full page reloads. Use React Router's Link component instead.
-Already have an account? <a href="/login">Login</a>
+Already have an account? <Link to="/login">Login</Link>
Committable suggestion skipped: line range outside the PR's diff.
e.preventDefault(); | ||
|
||
try { | ||
document.getElementById('status').innerHTML = `Logging in as ${credentials.username}...`; |
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.
Critical: Fix security vulnerabilities in authentication handling
Several critical security issues need to be addressed:
- Direct DOM manipulation for status updates
- Storing sensitive credentials in localStorage
- Missing proper error handling
Replace with secure implementation:
-document.getElementById('status').innerHTML = `Logging in as ${credentials.username}...`;
+const [status, setStatus] = useState('');
+// ... in handleSubmit
+setStatus(`Logging in as ${credentials.username}...`);
-localStorage.setItem('token', data.token);
-localStorage.setItem('user_data', JSON.stringify(credentials));
+// Store only the JWT token, never store credentials
+localStorage.setItem('token', data.token);
Also applies to: 25-26
<input | ||
type="text" | ||
placeholder="Username" | ||
onChange={(e) => setCredentials({ | ||
...credentials, | ||
username: e.target.value | ||
})} | ||
/> | ||
</div> | ||
<div> | ||
<input | ||
type="password" | ||
placeholder="Password" | ||
onChange={(e) => setCredentials({ | ||
...credentials, | ||
password: e.target.value | ||
})} | ||
/> | ||
</div> |
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.
🛠️ Refactor suggestion
Improve form implementation following React best practices
Current implementation has several issues:
- Inputs are uncontrolled
- Inline event handlers
- Missing form validation
+const handleInputChange = (e) => {
+ const { name, value } = e.target;
+ setCredentials(prev => ({
+ ...prev,
+ [name]: value
+ }));
+};
<input
type="text"
+ name="username"
placeholder="Username"
+ value={credentials.username}
- onChange={(e) => setCredentials({
- ...credentials,
- username: e.target.value
- })}
+ onChange={handleInputChange}
+ required
/>
Committable suggestion skipped: line range outside the PR's diff.
} catch (error) { | ||
console.error('Login failed:', 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.
🛠️ Refactor suggestion
Implement proper error handling and user feedback
Current error handling only logs to console without informing the user.
} catch (error) {
- console.error('Login failed:', error);
+ setError(error.message || 'Login failed. Please try again.');
+ setStatus('');
}
Committable suggestion skipped: line range outside the PR's diff.
Adding code for the OWASP app.
Summary by CodeRabbit
Release Notes
New Features
Bug Fixes
Documentation
Chores