Dein Script ist kaputt, weil es die übergebenen Daten nicht gegenprüft, z.B. gegen das Authentifizierungscookie von Moodle - nur Moodle kann dir sagen, ob die Session wirklich dem User gehört.
Grundsätzlich musst du jede Variable, die in deinem Script nicht fest verdrahtet ist und von extern kommt erstmal so behandeln, als sei sie ein neuer Virenstamm. Deinen redirect kann ich auch mit wenig Mehraufwand manipulieren - du verschleierst du URL dadurch ja nur.
Wenn du an einer Stelle im Editor eval(); oder so zulässt, dann musst du sicherstellen, dass dieses immense Sicherheitsloch sich nicht anderswo ausbreiten wird und ausnutzen lässt.
Kannst du nicht die Codeteile aus dem Zertifikatsmodul klauen, die die Userzuordnung erledigen, bzw. auf Basis der Zertifikatmoduls ein neues bauen? Das Ding nimmt dir doch schon einen Großteil der Arbeit ab - nur am Ende muss eben nicht ein Zertifikat, sondern deine Medallienlösung herauspurzeln - die ist doch auch schon fertig... Das hätte den Vorteil, dass die übergebenen Daten schonmal sauberer sind.
Gruß,
Maik