Startseite
  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche
Startseite › Forum › Drupalcenter.de › Allgemeines zu Drupal ›

Einsatz von 2 php-Skripten als Drupal-Content

Eingetragen von vistree (238)
am 30.06.2010 - 21:35 Uhr in
  • Allgemeines zu Drupal
  • Drupal 6.x

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&uuml;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&nbsp;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.";
?>

‹ Reicht bei drush "drush update" zum vollständigen Update? Eingabeformat standardmäßig auf CKEditor bei Textkörper ›
  • Anmelden oder Registrieren um Kommentare zu schreiben

PHP

Eingetragen von stBorchert (6003)
am 01.07.2010 - 06:43 Uhr

Hallo.

vistree schrieb

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.

vistree schrieb

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).

vistree schrieb

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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Hallo Stefan, danke für die

Eingetragen von vistree (238)
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

  • Anmelden oder Registrieren um Kommentare zu schreiben

anderer ansatz

Eingetragen von karl1120 (97)
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 ;)

  • Anmelden oder Registrieren um Kommentare zu schreiben

Benutzeranmeldung

  • Registrieren
  • Neues Passwort anfordern

Aktive Forenthemen

  • für drupal11 ein Slider Modul
  • [gelöst] W3CSS Paragraphs Views
  • Drupal 11 neu aufsetzen und Bereiche aus 10 importieren
  • Wie erlaubt man neuen Benutzern auf die Resetseite zugreifen zu dürfen.
  • [gelöst] Anzeigeformat Text mit Bild in einem Artikel, Drupal 11
  • Social Media Buttons um Insteragram erweitern
  • Nach Installation der neuesten D10-Version kein Zugriff auf Website
  • Composer nach Umzug
  • [gelöst] Taxonomie Begriffe zeigt nicht alle Nodes an
  • Drupal 11 + Experience Builder (Canvas) + Layout Builder
  • Welche KI verwendet ihr?
  • Update Manger läst sich nicht Installieren
Weiter

Neue Kommentare

  • melde mich mal wieder, da ich
    vor 6 Wochen 6 Tagen
  • Hey danke
    vor 7 Wochen 7 Stunden
  • Update: jetzt gibt's ein
    vor 7 Wochen 1 Tag
  • Hallo, im Prinzip habe ich
    vor 7 Wochen 5 Tagen
  • Da scheint die Terminologie
    vor 7 Wochen 5 Tagen
  • Kannst doch auch alles direkt
    vor 8 Wochen 2 Tagen
  • In der entsprechenden View
    vor 8 Wochen 2 Tagen
  • Dazu müsstest Du vermutlich
    vor 8 Wochen 2 Tagen
  • gelöst
    vor 10 Wochen 6 Tagen
  • Ja natürlich. Dass ist etwas,
    vor 11 Wochen 7 Stunden

Statistik

Beiträge im Forum: 250233
Registrierte User: 20460

Neue User:

  • marouane.blel
  • capilclinic
  • Quabzibboter

» Alle User anzeigen

User nach Punkten sortiert:
wla9461
stBorchert6003
quiptime4972
Tobias Bähr4019
bv3924
ronald3857
md3717
Thoor3678
Alexander Langer3416
Exterior2903
» User nach Punkten
Zur Zeit sind 0 User und 14 Gäste online.

Hauptmenü

  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche

Quicklinks I

  • Infos
  • Drupal Showcase
  • Installation
  • Update
  • Forum
  • Team
  • Verhaltensregeln

Quicklinks II

  • Drupal Jobs
  • FAQ
  • Drupal-Kochbuch
  • Best Practice - Drupal Sites - Guidelines
  • Drupal How To's

Quicklinks III

  • Tipps & Tricks
  • Drupal Theme System
  • Theme Handbuch
  • Leitfaden zur Entwicklung von Modulen

RSS & Twitter

  • Drupal Planet deutsch
  • RSS Feed News
  • RSS Feed Planet
  • Twitter Drupalcenter
Drupalcenter Team | Impressum & Datenschutz | Kontakt
Angetrieben von Drupal | Drupal is a registered trademark of Dries Buytaert.
Drupal Initiative - Drupal Association