Verbeter mijn Cursor code beveiliging met AI-gestuurde kwetsbaarheidsanalyse
description
Met deze prompt kun je je code proactief beveiligen door potentiële kwetsbaarheden te identificeren en gericht te verbeteren. Het helpt je om beveiligingsrisico's vroegtijdig te ontdekken en aan te pakken, wat traditionele code reviews kan aanvullen en versterken.
prompt
Help me mijn code te analyseren op beveiligingsrisico's en kwetsbaarheden met behulp van Cursor. Mijn programmeertaal: <voer je programmeertaal in>. Specifieke be ...
try_prompt
generate_helper
disclaimerOnPageApi
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Natuurlijk! Om je code te analyseren op beveiligingsrisico's, met name SQL-injectie, is het belangrijk dat je gebruikmaakt van beveiligde methoden voor database-interacties. Hier zijn enkele algemene richtlijnen en aanbevelingen die je kunnen helpen je JavaScript-code (bijvoorbeeld met Node.js) te beveiligen tegen SQL-injectie:
1. Gebruik Geparametriseerde Queries (Prepared Statements)
- Vermijd het direct samenvoegen van gebruikersinvoer in SQL-query's.
- Maak gebruik van parameterbindings die door je databasebibliotheek worden geverifieerd.
- Voorbeeld (bij gebruik van bijvoorbeeld 'mysql' of 'pg' modules):
```javascript
const query = 'SELECT * FROM users WHERE username = ?';
connection.query(query, [userInput], (err, results) => { /* ... */ });
```
2. Gebruik ORM of Query Builders
- Overweeg het gebruik van ORM's zoals Sequelize of Objection.js, die automatisch parameterbinding en veiligheidsmaatregelen bieden.
3. Valideer en Sanitizeer Gebruikersinput
- Controleer of de invoer voldoet aan verwachte patronen (bijvoorbeeld regex voor e-mails, numerieke waarden, etc.).
- Sanitizeer invoer om gevaarlijke inhoud te verwijderen of te escapen.
4. Beperk Rechten van Databasegebruikers
- Geef de databasegebruiker alleen de benodigde rechten.
- Bijvoorbeeld, een gebruiker die alleen SELECT-queries mag uitvoeren, moet niet de mogelijkheid hebben om data te veranderen.
5. Implementeer Error Handling en Logging
- Zorg dat foutmeldingen geen gevoelige informatie prijsgeven.
- Log verdachte activiteiten voor nader onderzoek.
Omdat je Cursor noemt, vermoed ik dat je mogelijk gebruikmaakt van een bepaalde bibliotheek of framework. Als je bijvoorbeeld een specifieke database-connector gebruikt die cursors ondersteunt, controleer dan of deze ondersteund parametrized queries en dat je deze correct toepast.
**Voorbeeld van verbeterde code (voorbeeld met mysql2):**
```javascript
const mysql = require('mysql2');
const connection = mysql.createConnection({ /* je configuratie */ });
const userInput = 'gebruikersnaam'; // Van gebruikersinvoer
const query = 'SELECT * FROM users WHERE username = ?';
connection.execute(query, [userInput], (err, results) => {
if (err) {
// Afhandeling van fout
} else {
// Verwerking resultaten
}
});
```
**Samenvatting van aanbevelingen:**
- Gebruik altijd geparametriseerde queries of ORM's.
- Valideer en sanitizeer alle gebruikersinvoer.
- Beperk database-rechten.
- Vermijd het samenvoegen van invoer in SQL-string zonder ontsnapping.
- Test je applicatie op SQL-injectie-kwetsbaarheden, bijvoorbeeld met tools zoals OWASP ZAP.
Voor een grondige analyse, zou ik je aanraden je daadwerkelijke code hier te delen, zodat ik gerichte feedback kan geven.
provider: deepseek
model: deepseek-chat
Zeker! Ik help je graag bij het analyseren en verbeteren van je JavaScript code voor SQL-injectie beveiliging. Hier is een gedetailleerde analyse en aanbevelingen:
## Veiligheidsrisico's bij SQL-injectie in JavaScript
### ❌ **Onveilige praktijken (te vermijden):**
```javascript
// GEVAARLIJK - String concatenatie
const query = `SELECT * FROM users WHERE username = '${username}' AND password = '${password}'`;
// GEVAARLIJK - Directe variabele invoeging
db.query(`INSERT INTO products (name, price) VALUES ('${productName}', ${price})`);
```
### ✅ **Aanbevolen beveiligingsmaatregelen:**
## 1. **Gebruik Prepared Statements met Placeholders**
### Voor MySQL (mysql2/mysql package):
```javascript
const mysql = require('mysql2/promise');
// Veilige query met prepared statements
async function getUserSafe(username) {
const connection = await mysql.createConnection(config);
const [rows] = await connection.execute(
'SELECT * FROM users WHERE username = ? AND password = ?',
[username, password]
);
return rows;
}
```
### Voor PostgreSQL (node-postgres):
```javascript
const { Pool } = require('pg');
const pool = new Pool();
// Veilige parameterized queries
async function getProductsByCategory(category) {
const result = await pool.query(
'SELECT * FROM products WHERE category = $1 AND active = $2',
[category, true]
);
return result.rows;
}
```
## 2. **Input Validatie en Sanitisatie**
```javascript
// Input validatie functies
function validateAndSanitizeInput(input, type = 'string') {
if (typeof input !== 'string') return null;
// Basis sanitization
let sanitized = input.trim();
switch (type) {
case 'email':
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
return emailRegex.test(sanitized) ? sanitized : null;
case 'number':
return !isNaN(sanitized) && isFinite(sanitized) ? Number(sanitized) : null;
case 'alphanumeric':
const alphaRegex = /^[a-zA-Z0-9]+$/;
return alphaRegex.test(sanitized) ? sanitized : null;
default:
// Escape gevaarlijke karakters voor algemene strings
return sanitized.replace(/['"\\;--]/g, '');
}
}
// Gebruik in je code
const safeUsername = validateAndSanitizeInput(userInput.username, 'alphanumeric');
const safeEmail = validateAndSanitizeInput(userInput.email, 'email');
```
## 3. **ORM/Query Builder gebruiken**
### Met Knex.js:
```javascript
const knex = require('knex')(config);
// Veilige queries met Knex
async function createUser(userData) {
return await knex('users')
.insert({
username: userData.username,
email: userData.email,
created_at: new Date()
})
.returning('*');
}
async function findUsersByCriteria(criteria) {
return await knex('users')
.where('active', true)
.where('role', criteria.role)
.whereBetween('created_at', [criteria.startDate, criteria.endDate]);
}
```
### Met Sequelize (ORM):
```javascript
const { Sequelize, DataTypes } = require('sequelize');
const sequelize = new Sequelize('database', 'username', 'password', {
dialect: 'mysql'
});
const User = sequelize.define('User', {
username: { type: DataTypes.STRING, allowNull: false },
email: { type: DataTypes.STRING, allowNull: false }
});
// Veilige database operaties
async function findUserByEmail(email) {
return await User.findOne({
where: { email: email }
});
}
```
## 4. **Uitgebreide Beveiligingslaag**
```javascript
class SecureQueryBuilder {
constructor() {
this.whitelistedTables = ['users', 'products', 'orders'];
this.whitelistedColumns = {
users: ['id', 'username', 'email', 'created_at'],
products: ['id', 'name', 'price', 'category']
};
}
// Veilige WHERE clause builder
buildWhereClause(filters, table) {
const conditions = [];
const values = [];
let paramCount = 1;
for (const [column, value] of Object.entries(filters)) {
// Controleer of kolom bestaat in whitelist
if (!this.whitelistedColumns[table]?.includes(column)) {
throw new Error(`Ongeldige kolom: ${column}`);
}
conditions.push(`${column} = $${paramCount}`);
values.push(value);
paramCount++;
}
return {
clause: conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '',
values: values
};
}
// Veilige SELECT query
buildSelectQuery(table, filters = {}) {
if (!this.whitelistedTables.includes(table)) {
throw new Error(`Ongeldige tabel: ${table}`);
}
const { clause, values } = this.buildWhereClause(filters, table);
const query = `SELECT * FROM ${table} ${clause}`;
return { query, values };
}
}
```
## 5. **Middleware voor Express.js**
```javascript
const sqlInjectionMiddleware = (req, res, next) => {
const sqlKeywords = /(\b(SELECT|INSERT|UPDATE|DELETE|DROP|UNION|EXEC|ALTER)\b)/i;
const dangerousPatterns = /('|"|;|--|\/\*|\*\/|@@|@|char|nchar|varchar|nvarchar)/i;
const checkObject = (obj) => {
for (const [key, value] of Object.entries(obj)) {
if (typeof value === 'string') {
if (sqlKeywords.test(value) || dangerousPatterns.test(value)) {
return res.status(400).json({
error: 'Potentieel gevaarlijke input gedetecteerd'
});
}
} else if (typeof value === 'object' && value !== null) {
checkObject(value);
}
}
};
checkObject(req.body);
checkObject(req.query);
checkObject(req.params);
next();
};
// Gebruik in je Express app
app.use(sqlInjectionMiddleware);
```
## 6. **Test je Beveiliging**
```javascript
// Test cases voor SQL-injectie beveiliging
function testSqlInjectionProtection() {
const testCases = [
"admin' OR '1'='1",
"'; DROP TABLE users; --",
"admin' --",
"1; INSERT INTO users (username) VALUES ('hacker')",
"1' UNION SELECT * FROM passwords --"
];
testCases.forEach(testCase => {
const safeInput = validateAndSanitizeInput(testCase);
console.log(`Input: ${testCase} → Safe: ${safeInput}`);
// Test met prepared statement
testPreparedStatement(safeInput);
});
}
async function testPreparedStatement(input) {
try {
const [rows] = await connection.execute(
'SELECT * FROM users WHERE username = ?',
[input]
);
console.log('Query uitgevoerd zonder fouten');
} catch (error) {
console.error('Query gefaald:', error.message);
}
}
```
## **Samenvatting van Best Practices:**
1. **Altijd prepared statements gebruiken** - nooit string concatenatie
2. **Input valideren en sanitiseren** - zowel client-side als server-side
3. **Principle of Least Privilege** - database gebruiker met minimale rechten
4. **ORM/Query builders** - gebruiken waar mogelijk
5. **Whitelist approach** - alleen toegestane waarden accepteren
6. **Regelmatige security audits** - code reviews en penetration testing
7. **Dependency updates** - houd database drivers en libraries up-to-date
Implementeer deze maatregelen en je zult je code significant beter beschermen tegen SQL-injectie aanvallen!