Help me genereren van dynamische SQL queries met parameterinvoer
description
Met deze prompt kan ik leren hoe ik flexibele SQL queries schrijf die ik kan aanpassen aan verschillende situaties zonder telkens handmatig code te schrijven. De prompt helpt me ook om mijn queries te beveiligen tegen SQL-injecties, wat mijn database veiliger maakt. Dit is beter dan statische queryvoorbeelden omdat ik zo sneller en veiliger kan ontwikkelen.
prompt
try_prompt
Help me dynamische SQL queries te genereren waarbij ik parameters kan invoeren zoals tabelnaam, kolomnamen en filtervoorwaarden. Mijn tabelnaam is: <voer hier de tabelnaam in>. De kolommen die ik wil select ... more
generate_helper
...
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Hier is een voorbeeld van hoe je een dynamische SQL-query kunt genereren in bijvoorbeeld Python, inclusief beveiliging tegen SQL-injecties door gebruik te maken van parameterbinding:
```python
import sqlite3
# Verbinding maken met de database
conn = sqlite3.connect('mijn_database.db')
cursor = conn.cursor()
# Parameters
tabelnaam = 'klanten'
kolommen = ['klant_id', 'naam', 'email']
filter_voorwaarden = 'klanten' # Bijvoorbeeld een filter op de tabelnaam, of andere voorwaarden
# Dynamische query met parameterbinding
# Let op: De tabelnaam en kolomnamen kunnen niet direct gebonden worden via parameterbinding.
# Daarom moeten deze gecontroleerd of geverifieerd worden voordat ze in de query worden opgenomen.
# Hier is een voorbeeld waarbij we ervan uitgaan dat deze waarden gecontroleerd zijn.
# Constructie van de kolomselectie
columns_str = ', '.join(kolommen)
# Voorwaarde: Bijvoorbeeld filter op klant_id of andere kolom
# Hier een voorbeeld filter op klant_id, dat veilig kan worden gebonden
klant_id_filter = 123
query = f"SELECT {columns_str} FROM {tabelnaam} WHERE klant_id = ?"
# Uitvoeren met parameterbinding
cursor.execute(query, (klant_id_filter,))
# Resultaat ophalen
resultaten = cursor.fetchall()
for rij in resultaten:
print(rij)
# Verbinding sluiten
conn.close()
```
**Uitleg over veiligheid:**
- **Tabel- en kolomnamen:** Deze kunnen niet direct gebonden worden via parameterbinding en moeten dus gecontroleerd worden op geldigheid en veiligheid voordat je ze in de query zet. Bijvoorbeeld, door te controleren of ze voorkomen in een lijst van toegestane namen.
- **Filtervoorwaarden:** Voor de waarden die in de WHERE-clausule worden gebruikt, kun je parameterbinding toepassen door placeholders (`?` in SQLite, `%s` in MySQL, etc.) te gebruiken. Dit voorkomt SQL-injecties.
- **Samenvatting:** Gebruik parameterbinding voor gebruikersinvoer die waarden betreft, en controleer altijd de tabel- en kolomnamen op geldigheid voordat je ze dynamisch in de query opneemt.
Wil je een voorbeeld in een andere programmeertaal of meer uitleg over de controle op tabel- en kolomnamen?
provider: deepseek
model: deepseek-chat
Hier is een voorbeeld van dynamische SQL in PHP met beveiliging tegen SQL-injecties:
```php
<?php
// Veilige parameters (gebruikersinvoer)
$tabelNaam = 'klanten';
$kolommen = ['klant_id', 'naam', 'email'];
$filters = ['actief' => 1, 'stad' => 'Amsterdam'];
// Whitelist van toegestane tabellen (veiligheidsmaatregel)
$toegestaneTabellen = ['klanten', 'producten', 'orders'];
// Controleren of tabel is toegestaan
if (!in_array($tabelNaam, $toegestaneTabellen)) {
throw new Exception('Ongeldige tabelnaam');
}
// Kolommen valideren en escapen
$veiligeKolommen = array_map(function($kolom) {
// Alleen alfanumerieke karakters en underscores toestaan
if (!preg_match('/^[a-zA-Z0-9_]+$/', $kolom)) {
throw new Exception('Ongeldige kolomnaam');
}
return "`$kolom`";
}, $kolommen);
// Query opbouwen
$query = "SELECT " . implode(', ', $veiligeKolommen) . " FROM `$tabelNaam`";
// Filters toevoegen met prepared statements
if (!empty($filters)) {
$whereClauses = [];
$parameters = [];
foreach ($filters as $kolom => $waarde) {
// Kolomnaam valideren
if (!preg_match('/^[a-zA-Z0-9_]+$/', $kolom)) {
throw new Exception('Ongeldige filterkolom');
}
$whereClauses[] = "`$kolom` = ?";
$parameters[] = $waarde;
}
$query .= " WHERE " . implode(' AND ', $whereClauses);
}
// Voorbereide statement gebruiken
$stmt = $pdo->prepare($query);
// Parameters binden
foreach ($parameters as $index => $waarde) {
$stmt->bindValue($index + 1, $waarde);
}
// Uitvoeren
$stmt->execute();
$resultaten = $stmt->fetchAll();
?>
```
**Belangrijke beveiligingsmaatregelen:**
1. **Whitelisting**: Alleen toegestane tabelnamen accepteren
2. **Input validatie**: Controleren of kolomnamen alleen geldige karakters bevatten
3. **Prepared statements**: Gebruik placeholders (?) voor waarden
4. **Parameter binding**: Waarden apart binden aan de query
5. **Escape kolomnamen**: Backticks gebruiken rond kolom- en tabelnamen
**Alternatief met PDO named parameters:**
```php
$filters = [':stad' => 'Amsterdam', ':actief' => 1];
// ... vergelijkbare logica maar met named parameters
```
Let op: Nooit gebruikersinvoer direct interpoleren in SQL queries. Altijd prepared statements gebruiken voor waarden en whitelisting voor database objectnamen (tabellen, kolommen).

