QUOTENAME voor onbekende kolomnamen in SQL

Geschreven door: op zondag 31 maart 2019

Leestijd:

Als je gebruik maakt van een database, dan ben je bekend met SQL Injection: een kwaadwillend persoon geeft variabelen door aan je website, die ervoor zorgen dat een query die je variabelen verwerkt, functioneel verandert.

Je zou bijvoorbeeld een waarde willen opvragen, zoals een titel van een pagina op basis van een paginaId:

SELECT * FROM paginas WHERE paginaId = 1;

Bovenstaande query kan je op verschillende manieren opbouwen. Als je deze opbouwt zonder gebruik te maken van speciale functies in je applicatielaag, zou je iets kunnen krijgen als (pseudocode):

//www.mijnwebsite.nederland/?paginaId=1

Var sql = “SELECT * FROM paginas WHERE paginaId = ” + paginaId;

ExecuteSql(sql);

Ik ga ervan uit dat pagina Id hier een nummer is, maar het zou ook het volgende kunnen zijn:

//www.mijnwebsite.nederland/?paginaId=1; DROP TABLE paginas;

Var sql = “SELECT * FROM paginas WHERE paginaId = ” + paginaId;

ExecuteSql(sql);

In dit geval ben ik al mijn pagina’s kwijt en dat alleen maar omdat ik zo onvoorzichtig was om er niet voor te zorgen dat alleen veilige waardes toegelaten worden.

Hier zijn een aantal oplossingen voor:

Maak gebruik van je applicatielaag. Als je je queries opbouwt via de applicatie, zoals .NET, dan worden de variabelen, de parameters, automatisch in zo’n formaat gezet dat er geen sprake kan zijn van SQL injection.

Gebruik verschillende users. Je kan voor eenvoudige SELCT-queries een user gebruiken die alleen rechten heeft voor SELECT. (Dit zal vrijwel nooit voorkomen.) Hiermee voorkom je geen SQL-injection, maar wel dat er data wordt weggeschreven of aangepast.

In SQL maak je soms gebruik van dynamische queries. Met de procedure sp_executesql zorg je ervoor dat je alleen correcte parameters door kan geven.

Bij dynamische queries kan je ook gebruik maken van QUOTENAME. Dit is met name handig als je gebruik wilt maken van kolommen die niet hard in je statements staan:

SET sql = ‘SELECT * FROM paginas WHERE ‘ + QUOTENAME(@kolom) + ‘= @paginaId’;

QUOTENAME gecombineerd met sp_executesql zorgt ervoor dat je veiliger dynamische queries kunt gebruiken, met kolomnamen die niet van te voren bekend zijn.

 


Andere blogartikelen

  • Tabellen in HTML

    Geschreven door: op maandag 30 december 2019

    Met UL, OL en LI maak je opsommingen. Met DL, DT en DD maak je lijsten van definities. Naast opsommingen en definities is er ook nog tabulaire data: gegevens die in een tabel staan, waarbij je rijen h ...

    Bekijk het artikel »
  • Tekst manipulatie in SQL met Stuff()

    Geschreven door: op maandag 30 december 2019

    In SQL heb je een aantal ingebouwde functies die erg handig kunnen zijn. Je kunt hier bijvoorbeeld denken aan Count(), welke het totaal aantal rijen teruggeeft van een query resultaat. Maar er zijn oo ...

    Bekijk het artikel »
  • SQL en het gebruik van For XML: Raw en Auto

    Geschreven door: op maandag 30 december 2019

    Een query binnen SQL geeft natuurlijk resultaten terug. Deze kun je op verschillende manieren weergeven: als tabel, als tekst of je kunt de resultaten opslaan in een bestand. Wat ook kan, is de result ...

    Bekijk het artikel »
Bel 072 5345 888
Meer dan 40 bedrijven vertrouwen op ons
Onze Middelen en Technologieën
microsoft silver partner
Adobe partner
fd-gazellen-2018.jpg
Google analytics
partners-logo.jpg
Op de hoogte blijven?

Meld u aan voor de gratis nieuwsbrief om op de hoogte te blijven van onze activiteiten