slogan3

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

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!