𝗗𝗼𝗻'𝘁 𝗣𝗮𝗿𝘀𝗲 𝗦𝗤𝗟 𝘁𝗼 𝗠𝗮𝗸𝗲 𝗮 𝗤𝘂𝗲𝗿𝘆 𝗥𝘂𝗻𝗻𝗲𝗿 𝗥𝗲𝗮𝗱-𝗢𝗻𝗹𝘆

Hören Sie auf, Ihre Datenbank zu sichern, indem Sie SQL-Strings auf Schlüsselwörter prüfen.

Wenn Sie ein Tool zum Ausführen von SQL entwickeln, benötigen Sie einen schreibgeschützten Modus. Sie möchten verhindern, dass ein versehentliches UPDATE Ihre Daten löscht. Ihr erster Gedanke ist vielleicht, Wörter wie DELETE oder DROP zu blockieren.

Tun Sie das nicht.

String-Prüfungen lassen sich leicht umgehen. Ein Benutzer kann eine WITH-Klausel verwenden, um ein DELETE zu verbergen. Er kann Kommentare nutzen, um Befehle zu verstecken. Er kann eine Funktion aufrufen, die in eine Tabelle schreibt. Am Ende spielen Sie ein aussichtsloses Spiel gegen ständig auftauchende Probleme.

Überlassen Sie die Sicherheit der Datenbank.

Postgres verfügt über eine integrierte Funktion dafür. Sie können eine Transaktion als schreibgeschützt (read-only) deklarieren. Der Server verweigert dann jeden Schreibbefehl. Dies umfasst CTEs, Funktionen und DDL.

So implementieren Sie es korrekt in Python:

Dieser Ansatz prüft den SQL-Text nicht. Die Abfrage wird exakt so an den Server gesendet, wie sie geschrieben wurde. Sie weisen die Engine an, die Regel durchzusetzen.

Sicherheit erfordert zwei Teile:

  1. Schutz vor Schreibvorgängen: Verwenden Sie schreibgeschützte Transaktionen.
  2. Schutz vor Ressourcenmissbrauch: Verwenden Sie Timeouts und Zeilenlimits.

Eine schreibgeschützte Abfrage kann Ihr System dennoch durch einen massiven Join zum Absturz bringen. Eine schreibgeschützte Transaktion verhindert Schreibvorgänge, aber sie verhindert keinen hohen Ressourcenverbrauch. Sie benötigen beides, um Ad-hoc-SQL sicher zu machen.

Hören Sie auf, SQL zu parsen. Lassen Sie die Datenbank ihren Job machen.

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