Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Probleme mit dem Newsletter Plugin
#1
Hallo liebe Community,

seit 3 Tagen nutze ich jetzt schon getSimple und ich denke ich habe mich relativ gut eingearbeitet.
Jetzt wollte ich das Plugin "mail newsletter" nutzen, was soweit auch funktioniert. Allerdings möchte ich, ein Formular, mit welchem man E-Mail Adressen zur Liste hinzufügen kann auch außerhalb des Admin-Bereichs, frei für jeden zugänglich anbieten. Laut Changelog ist das seit neustem auch möglich:

Quote:Function mailnewsletterform that insert subscribe form in any page

Gesagt, getan, einfach die besagte Funktion in der Sidebar eingegeben und ... nichts. Dann habe ich mir den Quellcode etwas genauer angeschaut und festgestellt, dass in der Funktion als cgi-script absolut auf die load.php im Admin-Ordner verwießen wird, selbst wenn man diesen Verweiß relativ angebeben würde, könnte man ohne im Adminbereich eingeloggt zu sein nicht ja nicht darauf zugreifen. (Ich frage mich bis jetzt, was diese Angabe im CHangelog dann bedeuten soll).

Nun habe ich mich den ganzen Tag mit Themen wie cgi-Scripten und allen möglichen Methoden wie man XML-Dateien manipuliert beschäftigt (ich bin jetzt nich so der eingefleischte Programmierer und habe von PHP eigentlich überhaupt keine Ahnung), um mit einem selbst erstellten Formular, dass auf ein selbst erstelltes cgi-Script verweißt, die entsprechende XML-Datei einfach selbst abzuändern.
Das sah dann so aus:

aus
Code:
<?php mail_newsletter_form($text='Add'); ?>
wurde
Code:
<form action="/newsletter_send_add.php" method="post"  accept-charset="utf-8">
<input name="adresse" type="text" size="20" maxlength="100" value="name@beispiel.de">
<input name="senden" type="submit" value="Eintragen">
</form>

Die newsletter_send_add.php sollte das cgi script sein, dass dann einfach im Startverzeichniss rumlungert (ich bin mir nicht sicher gegen wie viele Sicherheitsrichtlinien ich dabei verstoßen haben könnte). Zwischendurch hab ich dann auch probiert das ganze in einer newsletter_send_add.js in Javascript zu realisieren, da mir dort der Syntax wenigstens nicht ganz so fremd ist wie in PHP (habe in der Schule mal Java gelernt). Allen Anstregungen, ein funktionierendes cgi-Script zusammenzubasteln, dass die XML-Datei mit der neuen Adresse, erweitert zum Trotz waren die Ergebnisse vernichtend.
Also habe ich mir nochmal den Quelltext vom Plugin angeschaut und mir versucht, aus diesem Code das benötigte Script zusammenzubauen.

Ergebnis ist bis jetzt folgendes: (ich hab mir die Funktionsnamen abgeändert, um nicht durcheinander zu kommen).
Code:
define (CONFIGFILE, GSDATAOTHERPATH . 'mail_newsletter.xml');




function addMailToXML()
{
$new = $_POST['adresse'];  
$mails = array();
$subject = "";
$body = "";

$data = loadXML();

$data['mails'][] = trim($new);
  
saveXML($data['mails'], $data['subject'], $data['body']);
  
echo '<div class="updated">The mail ' . $new . ' has been added</div>';

}


function loadXML()
{
$data = array();

if (file_exists(CONFIGFILE))
    {
     $xml = @getXML(CONFIGFILE);

     if (!empty($xml))
        {
         if ($xml->mails != "")
            $data['mails'] = split("[,]+", $xml->mails);
         $data['subject'] =  $xml->subject;
         $data['body'] =  @stripslashes($xml->body);
        }
     else
        $data['error'] = "Error reading " .CONFIGFILE;
    }

return $data;
}




function saveXML($mails, $subject, $body)
{
  $xml = @new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><item></item>');
  $xml->addChild('mails', join("," ,$mails));
  $xml->addChild('subject', htmlspecialchars($subject));
  $xml->addChild('body', safe_slash_html($body));    
  XMLsave($xml, CONFIGFILE);

  if (!is_writable(CONFIGFILE))
     return '<div class="error">Unable to write config to file</div>';
  else
     return '<div class="updated">Config has been succesfully saved</div>';
}

Jedenfalls wird das laut Quelltext im Grunde so gehandhabt, wenn eine Adresse aus dem Admin Bereich eingetragen werden soll.

Resultat: sobald man das Formular nun abschickt kommt folgende Fehlermeldung
Quote:Parse error: syntax error, unexpected T_STRING in /data/multiserv/users/184915/projects/1794475/www/newsletter_send_add.php on line 51

Das wäre diese Zeile:
Code:
$xml = @new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><item></item>');

Komischweiße funktioniert diese Stelle aber, wenn sie vom Original-Plugin ausgeführt wird (d.h. sobald man eine Adresse im Admin Bereich addet).
Jetzt bin ich mit meinen grottigen Programmierkentnissen an einem Punkt angelangt, an dem es seit Stunden nicht mehr weiter geht und da bin ich sehr froh, dass es seit neuestem ein deutschsprachiges Forum gibt, auf dem sich hoffentlich jemand findet, der mir in meiner Situation weiter hilft. Ich wäre sehr dankebar dafür.

Gruß
ravens_legacy
Reply
#2
ja, ich hab das jetzt gelesen, aber ich habe soschnell keine Antwort für dich
ich hab das Plugin noch nicht bearbeitet.

Muss mal schauen, wie wir dir helfen können!

Liebe Grüsse, Connie
|--

Das deutschsprachige GetSimple-(Unter-)Forum:   http://get-simple.info/forums/forumdisplay.php?fid=18
Reply
#3
Problem gelöst. Ich weiß nur nicht inwiefern es eine Sicherheitslücke ist, dass im Startverzeichnis jetzt die "newsletter_send_app.php" ungeschützt rumliegt.

Jedenfalls hier meine Lösung, die ich mit einem Kumpel erarbeitet habe:

An der Stelle, wo das Formular auftauchen soll (z.B. sidebar) folgender Code:
Code:
<?php include("newsletter_send_add.php"); ?>
<form action="" method="post" accept-charset="utf-8">
  <input name="new-mail" type="text" value="">
  <input name="submit" type="submit" class="submit" value="Eintragen" >
  </form>
<?php
if(isset($_POST["submit"]))
{
      addMailToXML();
}
?>

Die newsletter_send_add.php liegt wie bereits erwähnt im Startverzeichnis der GS-Installation (also da wo auch die index.php liegt) und enthält folgenden Code:

Code:
<?php

define (CONFIGFILE, GSDATAOTHERPATH . 'mail_newsletter.xml');

function addMailToXML()
{
$new = $_POST['new-mail'];
$mails = array();
$subject = "";
$body = "";

$data = loadXML();

$data['mails'][] = trim($new);

saveXML($data['mails'], $data['subject'], $data['body']);

echo '<div class="updated">Die Adresse ' . $new . ' wurde hinzugefügt</div>';

}

function loadXML()
{
$data = array();

if (file_exists(CONFIGFILE))
    {
     $xml = @getXML(CONFIGFILE);

     if (!empty($xml))
        {
         if ($xml->mails != "")
                    $data['mails'] = split("[,]+", $xml->mails);
         $data['subject'] =  $xml->subject;
         $data['body'] =  @stripslashes($xml->body);
        }
     else
        $data['error'] = "Error reading " .CONFIGFILE;
    }

return $data;
}


function saveXML($mails, $subject, $body)
{
  $xml = @new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><item></item>');
  $xml->addChild('mails', join("," ,$mails));
  $xml->addChild('subject', htmlspecialchars($subject));
  $xml->addChild('body', safe_slash_html($body));
  XMLsave($xml, CONFIGFILE);

  if (!is_writable(CONFIGFILE))
     return '<div class=\"error\">Unable to write config to file</div>';
  else
     return '<div class=\"updated\">Config has been succesfully saved</div>';
}

?>

Dieser ist zum Großteil aus der originalen mail_newsletter.php im plugin Verzeichnis übernommen (die Funktionen heißen nur leicht anderst)

Sicher hätte man auch gleich die mail_newsletter.php includen können, aber das haben wir nicht getestet, da wir momentan so zufrieden sind.

Somit dürfte jeder jetzt E-mails eintragen dürfen.

Ein Danke an alle, die sich dem Problem angnommen haben und vielleicht versucht haben eine Lösung zu finden.

Grüße
ravens_legacy

Achja: Ehe ich's vergess
Unbedingt noch in der mail_newsletter.php bei der Funktion sendnewsletter() die E-mail Adressen des Autors durch die austauschen, die man dem Server als Gateway angegeben hat. Sonst kann man verständlicherweiße nichts verschicken ;]
Reply
#4
Moin!

Sag uns doch deinen richtigen Namen, ich für meine Person hab oft Schwierigkeiten jemand mit solch einem Zaubernamen anzusprechen ;=)

soweit wie du jetzt bist, konnte ich noch gar nicht kommen, und du bist schon weiter.

Es macht mir aber ein Problem, daß die Datei "newsletter_send_add.php" im Hauptverzeichnis liegt
Habt Ihr mal versucht, das als Komponente einzubinden, mit exec-php evtl.?
Oder als plugin-Datei im plugin-Verzeichnis?

ansonsten sollte man unbedingt über eine .htaccess-Regel nachdenken

"herumliegende" mail-sender-apps werden zu leicht mißbraucht
|--

Das deutschsprachige GetSimple-(Unter-)Forum:   http://get-simple.info/forums/forumdisplay.php?fid=18
Reply
#5
Nunja, aus dem Plugin-Ordner bin ich bis jetzt noch nicht wirklich schlau geworden, sobald da etwas drin ist, dass offenbar nicht reingehört, legt das sie komplette Seite lahm. Wir haben auch versucht, das alles in das original-plugin einzubinden, was einen 403er Fehler beim aufrufen verursachte. Als Komponente müsste funktionieren, exec ist im Grunde gar nicht nötig, da das Formular eh in der Sidebar steht, die ja als Komponente realisiert wurde.
Ich werds mal versuchen.

Achja, ich heiße übrigends Rick Wink

Gruß
Rick


Edit:
Versuch gelungen.
Also ein letztes mal - Code für die newsletter_form - Componente:

Code:
<?php

define (CONFIGFILE, GSDATAOTHERPATH . 'mail_newsletter.xml');

function addMailToXML()
{
$new = $_POST['new-mail'];
$mails = array();
$subject = "";
$body = "";

$data = loadXML();

$data['mails'][] = trim($new);

saveXML($data['mails'], $data['subject'], $data['body']);

echo '<div class="updated">Die Adresse ' . $new . ' wurde hinzugefügt</div>';
}

function loadXML()
{
$data = array();

if (file_exists(CONFIGFILE))
    {
     $xml = @getXML(CONFIGFILE);

     if (!empty($xml))
        {
         if ($xml->mails != "")
                    $data['mails'] = split("[,]+", $xml->mails);
         $data['subject'] =  $xml->subject;
         $data['body'] =  @stripslashes($xml->body);
        }
     else
        $data['error'] = "Error reading " .CONFIGFILE;
    }

return $data;
}


function saveXML($mails, $subject, $body)
{
  $xml = @new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><item></item>');
  $xml->addChild('mails', join("," ,$mails));
  $xml->addChild('subject', htmlspecialchars($subject));
  $xml->addChild('body', safe_slash_html($body));
  XMLsave($xml, CONFIGFILE);

  if (!is_writable(CONFIGFILE))
     return '<div class=\"error\">Unable to write config to file</div>';
  else
     return '<div class=\"updated\">Config has been succesfully saved</div>';
}
?>

<form action="" method="post" accept-charset="utf-8">
  <input name="new-mail" type="text" value="name@beispiel.de">
  <input name="submit" type="submit" class="submit" value="Eintragen" >
  </form>
<?php

if(isset($_POST["submit"]))
{
      addMailToXML();
}
?>

Die newsletter_send_add.php fällt weg (wurde alles in die Komponente verschoben). Sollte jetzt kein Sicherheitsrisiko mehr darstellen.

Gruß
Rick
Reply
#6
Mensch Rick,

das ist klasse! Ich schaus mir die Tage mal genauer an, bin grad heftig beschäftigt (altes Haus, Wände renovieren, Ofen setzen, Weihnachten etc.. )

Gruss, Connie
|--

Das deutschsprachige GetSimple-(Unter-)Forum:   http://get-simple.info/forums/forumdisplay.php?fid=18
Reply




Users browsing this thread: 1 Guest(s)