161 Stimmen

DEFINER-Klausel aus MySQL-Dumps entfernen

Ich habe einen MySQL-Dump von einer meiner Datenbanken. Darin gibt es DEFINER-Klauseln, die wie folgt aussehen,

"DEFINER=`root`@`localhost`" 

Diese DEFINER-Klauseln befinden sich nämlich in meinen CREATE VIEW- und CREATE PROCEDURE-Anweisungen. Gibt es eine Möglichkeit, diese DEFINER-Klauseln aus meiner Dump-Datei zu entfernen?

0voto

Roger Dueck Punkte 555

Bezug nehmend auf https://stackoverflow.com/a/19707173/1488762 Ich vermute, dass die folgende Methode bei sehr großen Datenbanken besser funktioniert: Ändern Sie den Definer am Ende, anstatt in jeder Zeile eine zusätzliche Regex-Verarbeitung durchzuführen:

mysqldump myDB > dump.sql
cat >> dump.sql << END
SELECT CONCAT("ALTER DEFINER=`youruser`@`host` VIEW ", 
table_name, " AS ", view_definition, ";") 
FROM information_schema.views 
WHERE table_schema='myDB';
END

0voto

jeiea Punkte 1402

Nur als Hinweis für die Zukunft, sd Version.

mysqldump ... | sd 'DEFINER=.*?\*' '*' > file.sql

0voto

midlan Punkte 144

Meine Lösung zum Entfernen DEFINER getestet auf meiner MariaDB 10.3:

mysqldump | grep -v -P 'SQL SECURITY DEFINER \*/$' | perl -pe 's/(?<=^\/\*!50003 CREATE\*\/ )\/\*!50017 DEFINER=`.+`@`.+`\*\/ (?=\/\*!50003 TRIGGER)//'

grep entfernt sie für Ansichten, perl Entfernt sie für Auslöser

Diese Lösung ist angriffssicher, da sie den Anfang und das Ende von Zeilen abgleicht. Selbst wenn der Angreifer also weiß, dass Sie eine Ersetzung von DEFINER auf Ihre Abfälle, seine DEFINER die in den Daten angeordnet sind, nicht ersetzt werden.

0voto

WoodrowShigeru Punkte 1219

Wenn Ihre SQL-Datei Folgendes enthält DEFINER Vorkommen (mit und) ohne bedingte Kommentare, dann könnten Sie an dieser alternativen REGEXP interessiert sein.

sed -Ei \
    's/DEFINER\s*=\s*(["'\''`]?)[^"'\''`@]+\1\s*@\s*(["'\''`]?)[^"'\''`\*]+\2//g' \
#      [-----1------][----2----][----4----]-5[--6--][----------7------------]
    "$FILE"

Erläuterung:

  1. DEFINER {potential whitespace} = {potential whitespace}
  2. {jeder potenzielle Kurs oder Backtick, der erfasst wird}
  3. (Unterbrechung der Sequenz, Hinzufügen von Anführungszeichen, Fortsetzen der Sequenz - weil wir das Konstrukt mit Anführungszeichen umschließen)
  4. (Nutzername) {String: kein Anführungszeichen oder @}
  5. {erste Erfassungsgruppe verwenden - das Zitat - falls vorhanden}
  6. {mögliche Leerzeichen} @ {mögliche Leerzeichen}
  7. {das Gleiche für Host mit neuer Erfassungsgruppe, aber auch Sternchen ausschließen}.

(Führen Sie die kommentierte Erklärungszeile nicht aus, da dies einen Fehler verursachen würde)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X