Parse geen SQL om een query runner read-only te maken

Stop met het proberen te beveiligen van je database door SQL-strings op trefwoorden te controleren.

Als je een tool bouwt om SQL uit te voeren, wil je een read-only modus. Je wilt voorkomen dat een onbedoelde UPDATE je gegevens verwijdert. Je eerste gedachte is misschien om woorden als DELETE of DROP te blokkeren.

Doe dit niet.

String-controles zijn eenvoudig te omzeilen. Een gebruiker kan een WITH-clause gebruiken om een DELETE te verbergen. Ze kunnen commentaar gebruiken om commando's te verbergen. Ze kunnen een functie aanroepen die naar een tabel schrijft. Je eindigt met een verloren strijd.

Laat de database de beveiliging afhandelen.

Postgres heeft hiervoor een ingebouwde functie. Je kunt een transactie als read-only verklaren. De server weigert dan elk schrijfcommando. Dit omvat CTE's, functies en DDL.

Hier is hoe je dit correct implementeert in Python:

Deze aanpak inspecteert de SQL-tekst niet. De query gaat naar de server precies zoals deze is geschreven. Je vertelt de engine om de regel af te dwingen.

Veiligheid vereist twee onderdelen:

  1. Bescherming tegen schrijven: Gebruik read-only transacties.
  2. Bescherming tegen misbruik van resources: Gebruik timeouts en rijlimieten.

Een read-only query kan je systeem nog steeds laten crashen met een enorme join. Een read-only transactie stopt schrijfacties, maar stopt geen zwaar resourcegebruik. Je hebt beide nodig om ad-hoc SQL veilig te maken.

Stop met het parsen van SQL. Vraag de database om zijn werk te doen.

Bron: https://dev.to/hitoshi1964/dont-parse-sql-to-make-a-query-runner-read-only-b62