Seite 1 von 1

Zugriff auf POST-Variable und Schreiben in Datenbank bei der Newsletter-Anmeldung in Gambio 4.9.5

Verfasst: 15 Jul 2025, 00:20
von Johannes.Kayßer
Dominik Späte hat geschrieben: 14 Jul 2025, 10:03 Jemand möchte darauf hingewiesen werden, dass man in Smarty direkt auf GET-Parameter zugreifen kann und sich den Umweg über die ContentView-Klasse sparen kann - zumal, wenn dieser neuerdings nicht mehr funktioniert.
[…]
Man kann mit diesem gegen Cross-Site Scripting (XSS) abgesicherten Code auf einen source-Parameter in der URL zugreifen und diesen als Wert eines gleichnamigen Eingabefeldes in der Smarty-Template-Datei verwenden:

Code: Alles auswählen

<input type="hidden" name="source" value="{$smarty.get.source|escape:'html'}">
Danke Dominik! Sein Beitrag bezieht sich auf meinen Post hier:
https://www.gambio.de/forum/threads/new ... 9-5.52303/
In Gambio 4.5.3 unter PHP 7.4.3 habe ich folgende Anpassungen erfolgreich im Einsatz:

Datenbanktabelle newsletter_recipients um Spalte source ergänzt:

Code: Alles auswählen

ALTER TABLE `newsletter_recipients`
ADD COLUMN `source` VARCHAR(45) NULL DEFAULT NULL AFTER `date_added`;
In der Datei /GXMainComponents/View/ThemeContentViews/core/ThemeContentView.inc.php
unterhalb von

Code: Alles auswählen

protected $captcha;
die Zeile

Code: Alles auswählen

protected $source               = '';
hinzugefügt sowie in der Funktion prepare_data() folgende Zeile ergänzt:

Code: Alles auswählen

$this->content_array['SOURCE']       = htmlentities_wrapper($this->source);

In der Datei /system/classes/newsletter/NewsletterContentControl.inc.php das
$sql_data_array um

Code: Alles auswählen

, 'source' => xtc_db_input($this->v_data_array['POST']['source'])
erweitert und am Ende der Datei nach der Zeile

Code: Alles auswählen

if (isset($this->v_data_array['POST']['email'])) {
            $coo_newsletter_view->set_('email_address', $this->v_data_array['POST']['email']);
        }
folgende eingefügt:

Code: Alles auswählen

if (isset($this->v_data_array['GET']['source'])) {
            $coo_newsletter_view->set_('source', $this->v_data_array['GET']['source']);
        }
Und in meinem Theme die Datei/themes/meintheme/html/custom/newsletter.html angelegt:

Code: Alles auswählen

{block name="newsletter_email_container" append}  
 <input type="hidden"
                                               id="source"
                                               name="source"                                            
                                               value="{$SOURCE}" />     
{/block}


Anwendungsfall: Ich kann https://shop.tannenhof-imshausen.de/new ... source=XYZ rausgeben und tracken, welche Nutzer sich über diesen Link zum Newsletter angemeldet haben.

Die gleichen Anpassungen unter der aktuellen Gambio-Version 4.9.5 und PHP 8.1 funktionieren jedoch nicht mehr: Das hidden-Feld wird nicht gefüllt und auch wenn ich händisch was eintrage bleibt die Spalte source in der Datenbanktabelle newsletter_recipients leer. Ich konnte nicht herausfinden, warum. Kann mir jemand helfen?

Die angehängten Dateien sind für Version 4.9.5.

Besten Dank & viele Grüße, Johannes
Jetzt ist nur noch die Frage: Wie greife ich korrekt auf den Inhalt der source-Variable bei der Übermittlung mit POST zu und bekomme ihn in die Datenbank?

Denn

Code: Alles auswählen

 if (isset($this->v_data_array['POST']['source'])) {
								    	$sql_data_array['source'] = xtc_db_input($this->v_data_array['POST']['source']);
								    	}    
unter Gamboi 4.9.5 in der Datei /system/classes/newsletter/NewsletterContentControl.inc.php
funktioniert irgendwie nicht, in der Datenbank steht bloß NULL…
angepassteDateien.zip
enthält newsletter.html, NewsletterContentControl.inc.php und NewsletterThemeContentView.inc.php
(4.8 KiB) 8-mal heruntergeladen
Die angehängte Datei spiegelt den aktuellen Stand, PHP-Dateien können hier nicht direkt eingebunden werden, deshalb als ZIP.

Herzlichen Dank & viele Grüße,
Johannes

Re: Zugriff auf POST-Variable und Schreiben in Datenbank bei der Newsletter-Anmeldung in Gambio 4.9.5

Verfasst: 15 Jul 2025, 13:26
von Dominik Späte
Die ContentView-Klasse und das Theme habe ich mir nicht angeschaut. Da sehe ich ja auf Deiner Seite, dass es funktioniert.

Deine angepasste NewsletterContentControl.inc.php wiederum funktioniert in meinem Testshop problemlos. Also der source-Wert würde gespeichert werden, wenn ich die Datenbank-Tabelle entsprechend erweitert hätte ;)

Code: Alles auswählen

SQL Error! Unknown column 'source' in 'field list' Query: INSERT INTO newsletter_recipients (customers_email_address, customers_id, customers_status, customers_firstname, customers_lastname, mail_status, mail_key, date_added, source) VALUES ('info2452345@werbe-markt.de', '0', '1', 'Gast', '', '0', 'A5EG6RH26ZHNKSGST6GXRDATYNHHQY8Z', NOW(), 'asdf')
Hast Du irgendwie einen lokalen Testshop bei der Hand? Für mich sieht alles richtig aus…