Wie kann ich die hochgerechneten Version einer parametrisierte Abfrage bekommen?
-
22-09-2019 - |
Frage
Ich versuche, die Datenbank-Bibliothek zu aktualisieren, dass wir bei der Arbeit verwenden parametrisierte Abfragen zu verwenden, so dass die Mitarbeiter, die über SQL-Injection nicht sehr gut informiert sind, werden nicht eingegeben entweichen dürfen nicht vergessen, auf und übergeben Sie einfach in einer Reihe von Parametern statt (ich verwende pg_query_params
).
Allerdings Ich laufe in ein Problem. Eine der Anforderungen der Datenbankbibliothek ist, dass es jede Abfrage protokolliert, die ausgeführt wird, und ich kann nicht einen Weg finden, um den Text einer parametrisierte Abfrage zu erhalten, sobald die Parameter in das Ausfüllen. Gibt es eine Möglichkeit, dies zu tun ( abgesehen von meiner eigenen Funktion für parametrisierte Abfragen rollen, denke ich)?
Mit anderen Worten, wenn eine parametrisierte Abfrage wie Ausführen
pg_query_params('SELECT id FROM table WHERE foo = $1', array('bar'));
Ich mag wie etwas bekommen
SELECT id FROM table WHERE foo = 'bar'
Lösung
PostgreSQL
erweiterte Protokoll (die von pg_query_params
verwendet wird) trennt Parameter von Abfragen.
Die Abfragen nur auf der Serverseite letztlich aufgebaut sind, gibt es keine Möglichkeit, sie auf der Client-Seite zu konstruieren, nur PostgreSQL
Fähigkeiten verwenden.
Sie können die Werte der Parameter zur Verfügung gestellt ersetzen und die Abfrage anmelden, bevor die params Senden preg_replace
verwendet wird.
Update:
können Sie aktivieren PostgreSQL
Protokollierung denen protokollieren die Abfragen in einer Datei oder syslog
(einschließlich gebundener Parameter) auf dem Server, dann laden Sie über diese Datei in eine PostgreSQL
Tabelle.
Andere Tipps
Wenn Sie nicht jedes Vorkommen von pg_query_params () im Quellcode mit Ihrem eigenen Wrapper-Funktion ersetzen können (wenn Sie können, dann könnten Sie die Auto prepend Funktionalität in PHP verwenden möchten, um die Deklaration der Umhüllung enthalten), dann können Sie nur das wirklich tun auf Datenbankebene.
C.