Einsatz von 2 php-Skripten als Drupal-Content
![](http://www.drupalcenter.de/files/noavatar_mini.gif)
am 30.06.2010 - 21:35 Uhr in
Hallo Forum,
ich habe heute eine Frage zu PHP und Drupal. Dies ist leider ein Thema von dem ich überhaupt keinen Plan habe ;-(
Ich habe mittels Websuche PHP-Skripte zum Eintrag von Formulardaten in eine eigene Tabelle gefunden.
Hintergrund: ich möchte einen einfachen Newsletter erstellen und brauche hierbei eine variable URL von der der individuelle Newsletter dann "geholt wird".
So, da ich nun aber wirklich keinen Plan von PHP habe, konnte ich mir da zwar zusammenstückeln (und das funktioniert auch) - ich habe aber große Bedenken bezüglich der Skript-Sicherheit. Hier gibt es ja wohl in PHP ziemlich viele Möglichkeiten, unsaubere Skripte auszunutzen ...
Mir geht es dabei um 2 grundlegende Punkte:
1. Normalerweise würde man in PHP wohl die Datenbankzugriffsdaten in einer Datei speichern, die außerhalb des Webroots liegt und diese dann über einen include in das eigentliche Skript einladen. Mein Versuch mittels ini_set('include', 'pfad') ist aber gescheitert, weshalb ich die Daten derzeit direkt am Anfang der beiden Skripte habe. Ist das ein Problem? Oder ist die Drupal-Seite nach dem Speichern so sicher, dass hier niemand etwas auslesen könnte.
-- ansosnten: wie könnte ich hier einen include hinbekommen?
2. Die 2te Frage geht richtung Eingabe der Fremddaten und böse Einträge wie rm *. Wird sowas durch Drupal direkt abgefangen, oder muss ich hier die Skripte aufbessern?
3. Das selbe betrifft im Validation-Skript die Übernahme von Parametern aus der URL. Hier scheint das Skript schon vorzusorgen. Bringt da Drupal druch seine PHP-Filter noch zusetzlichen Schutz?
Die Skripte:
A. Newsletter-Anmeldung
<?php
$db = mysql_connect("localhost", "dbuser", "dbpassword") or die("Could not connect.");
if(!$db)
die("no db");
if(!mysql_select_db("database",$db))
die("Keine Datenbank ausgewaehlt.<br>No database selected.");
if(!get_magic_quotes_gpc())
{
$_GET = array_map('mysql_real_escape_string', $_GET);
$_POST = array_map('mysql_real_escape_string', $_POST);
$_COOKIE = array_map('mysql_real_escape_string', $_COOKIE);
}
else
{
$_GET = array_map('stripslashes', $_GET);
$_POST = array_map('stripslashes', $_POST);
$_COOKIE = array_map('stripslashes', $_COOKIE);
$_GET = array_map('mysql_real_escape_string', $_GET);
$_POST = array_map('mysql_real_escape_string', $_POST);
$_COOKIE = array_map('mysql_real_escape_string', $_COOKIE);
}
$path="http://".$_SERVER['HTTP_HOST'];
if(isset($_POST['submit'])) //if submit was pushed
{
$email=$_POST['email'];
$nachname=$_POST['nachname'];
$vorname=$_POST['vorname'];
$anrede=$_POST['anrede'];
$titel=$_POST['titel'];
$begruessung=$_POST['begruessung'];
$url=$_SERVER['HTTP_HOST'];
$checkdups="SELECT * from email_table where email='$email'";
$checkdups2=mysql_query($checkdups) or die("Could not check duplicates");
$checkdups3=mysql_num_rows($checkdups2);
if(strlen($email)<4 || substr_count($email," ")>0)
{
print "Dies ist keine gültige E-Mail-Adresse. Bitte versuchen Sie es erneut.<br>That is not a valid email address. Please try again.";
}
else if($checkdups3>0)
{
print "<div class=\"messages status\">Mit dieser E-Mail-Adresse wurde der Newsletter von dieser Seite bereits abboniert. Bitte klicken Sie auf den Zurück-Knopf Ihres Browsers und korrigieren Sie die Eingabe.<br>That email is already in our database. Please use the back-button of your browser and retry.</div>";
}
else
{
srand((double)microtime()*1000000); //sets random seed
$string = md5(rand(0,1000000));
$thekey=$string;
$insertemail="INSERT into email_table (email,nachname,vorname,anrede,titel,begruessung,validkey,url) values('$email','$nachname','$vorname','$anrede','$titel','$begruessung','$thekey','$url')";
mysql_query($insertemail) or die("Could not insert mail");
mail($email,"Thanks for signing up","Thanks, please activate your account at $path/newsletter-freischalten?email=$email&string=$string","From: news@meinedomain.de");
print "You have signed up for the newsletter and a validation link has been sent to your email.";
}
}
### ab hier kommt es eigentlich NICHT mehr in den php-Bereich.
<script>
function Ergebnis () {
if (document.anmeldung.anrede[0].checked == true) {
document.getElementById("begruessung").value = "Sehr geehrte";
} else if (document.anmeldung.anrede[1].checked == true) {
document.getElementById("begruessung").value = "Sehr geehrter";
}
}
</script> <script type="text/javascript">
function validate_email(field,alerttxt)
{
with (field)
{
apos=value.indexOf("@");
dotpos=value.lastIndexOf(".");
if (apos<1||dotpos-apos<2)
{alert(alerttxt);return false;}
else {return true;}
}
}
function validate_form(thisform)
{
with (thisform)
{
if (validate_email(email,"Bitte geben Sie eine gültige E-Mail-Adresse an!")==false)
{email.focus();return false;}
}
}
</script>
<p>Sehr geehrte Damen und Herren,</p>
<p>bla, bla, bla</p>
<form method="post" onsubmit="return validate_form(this);" action="/newsletter-anmeldung" name="anmeldung">
<fieldset> <legend> Für den Newsletter an- oder abmelden </legend>
<input type="hidden" value="" id="begruessung" name="begruessung" />
<p><label style="width: 9em; float: left; text-align: right; margin-right: 0.5em; display: block;" for="email">E-mail Adresse:</label> <input type="text" value="" id="email" name="email" /> <span class="error">* Erforderlich</span></p>
<hr style="border-top: 1px solid black;" />
<p><label style="width: 9em; float: left; text-align: right; margin-right: 0.5em; display: block;" for="anrede">Anrede:</label> <input type="Radio" onclick="Ergebnis();" value="Frau" name="anrede" /> Frau <input type="Radio" onclick="Ergebnis();" value="Herr" name="anrede" /> Herr</p>
<p><label style="width: 9em; float: left; text-align: right; margin-right: 0.5em; display: block;" for="titel">Titel:</label> <select value="" id="titel" name="titel">
<option></option>
<option>Dr.</option>
<option>Prof.</option>
<option>Prof. Dr.</option>
</select></p>
<p><label style="width: 9em; float: left; text-align: right; margin-right: 0.5em; display: block;" for="vorname">Vorname:</label> <input type="text" value="" id="vorname" name="vorname" /></p>
<p><label style="width: 9em; float: left; text-align: right; margin-right: 0.5em; display: block;" for="nachname"> Nachname:</label> <input type="text" value="" id="nachname" name="nachname" /></p>
<hr style="border-top: 1px solid black;" />
<p><label style="width: 9em; float: left; text-align: right; margin-right: 0.5em; display: block;" for="f_s">Anmelden</label> <input type="radio" checked="checked" value="subscribe" id="f_s" name="f" /></p>
<p><label style="width: 9em; float: left; text-align: right; margin-right: 0.5em; display: block;" for="f_u">Abmelden</label> <input type="radio" value="unsubscribe" id="f_u" name="f" /></p>
<hr style="border-top: 1px solid black;" />
<p style="text-align: right; display: block;"><input type="submit" class="processing" name="submit" value="Anmeldung absenden" /></p>
</fieldset>
</form>
?>
B. Newsletter-Bestätigung unter /newsletter-freischalten
<?php
$db = mysql_connect("localhost", "dbuser", "dbpassword") or die("Could not connect.");
if(!$db)
die("no db");
if(!mysql_select_db("newsletter",$db))
die("Keine Datenbank ausgewählt.<br>No database selected.");
if(!get_magic_quotes_gpc())
{
$_GET = array_map('mysql_real_escape_string', $_GET);
$_POST = array_map('mysql_real_escape_string', $_POST);
$_COOKIE = array_map('mysql_real_escape_string', $_COOKIE);
}
else
{
$_GET = array_map('stripslashes', $_GET);
$_POST = array_map('stripslashes', $_POST);
$_COOKIE = array_map('stripslashes', $_COOKIE);
$_GET = array_map('mysql_real_escape_string', $_GET);
$_POST = array_map('mysql_real_escape_string', $_POST);
$_COOKIE = array_map('mysql_real_escape_string', $_COOKIE);
}
$email=$_GET['email'];
$string=$_GET['string'];
$email=trim($email); //trims whitespace
$email=strip_tags($email); //strips out possible HTML
$string=trim($string);
$string=strip_tags($string);
$query="update email_table set validated='1' where email='$email' and validkey='$string'";
mysql_query($query) or die("Could not validate user");
print "User validated.";
?>
- Anmelden oder Registrieren um Kommentare zu schreiben
PHP
am 01.07.2010 - 06:43 Uhr
Hallo.
1. ...Oder ist die Drupal-Seite nach dem Speichern so sicher, dass hier niemand etwas auslesen könnte.
Drupal hat an der Stelle nichts mit den Skripten zu tun (ausser, dass sie in einer Node verwendet werden). Dementsprechend kann Drupal sich dort auch nicht um die Sicherheit der Skripte kümmern.
2. Die 2te Frage geht richtung Eingabe der Fremddaten und böse Einträge wie rm *. Wird sowas durch Drupal direkt abgefangen, oder muss ich hier die Skripte aufbessern?
Siehe 1. Drupal hat mit der Ausführung und mit der Datenbehandlung überhaupt nichts zu tun (kann es ja auch gar nicht, da dies Fremdskripte sind).
3. Das selbe betrifft im Validation-Skript die Übernahme von Parametern aus der URL. Hier scheint das Skript schon vorzusorgen. Bringt da Drupal druch seine PHP-Filter noch zusetzlichen Schutz?
Siehe 1 und 2.
Idealerweise würde man diese Funktionalität in ein eigenes Modul packen, damit Drupal für die Ausführung und die Behandlung der Daten zuständig ist. Externe Skripte sind immer ein Risiko.
hth,
Stefan
Hallo Stefan, danke für die
am 01.07.2010 - 07:05 Uhr
Hallo Stefan,
danke für die Rückmeldung. Ja, dass hilft mir schon mal weiter. Auf jeden Fall insofern, dass ich den Code auf jeden Fall weiter prüfen muss.
Sag mal, ich hatte ja auch ganz konkret gefragt, wie man in einem Drupal-node (PHP-Format) einen include auf eine lokale PHP-Datei hinbekommt. Hast du da einen Tipp für mich?
Grüße
anderer ansatz
am 01.07.2010 - 20:58 Uhr
mein ansatz wäre bau doch dein skript in drupal ein dann kannst du die von drupal zur verfügung gestellten datenbank abfrage funktionen verwenden und wärst somit ein stück sicherer.
ein beispiel um ein externes script einzubauen :
<?php
//set the working directory to your Drupal root
chdir('/home/public_html/drupal/');
//require the bootstrap include
require_once './includes/bootstrap.inc';
//Load Drupal
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
//(loads everything, but doesn't render anything)
//<strong>hier könnte dein script stehen</strong>
//display a node
print '<pre>';
print_r(node_load(12));
print '</pre>';
?>
somit stehen dir in deinem skript alle drupal funktionen zur verfügung ;)