php funktioniert nur bedingt

Irgendwelche Probleme mit XAMPP für Windows? Dann ist hier genau der richtige Ort um nachzufragen.

php funktioniert nur bedingt

Postby attila » 07. January 2011 18:48

Hallo zusammen,

habe folgendes problem:
ich habe xampp erfolgreich installiert, in einem unterordner meine dateien abgelegt (forum.php, forumfunktionen.php, beitraege.php, etc.) und beim testen erscheint auch meine seite forum.php.
Sobald ich aber einträge in mein formular eingebe (das auch korrekt dargestellt wird, obwohl ich es als function formular_anzeigen() in forumfunktionen.php ausgelagert habe und mittels include auf meine hauptseite hole) und auf abschicken klicke, erscheint der neue beitrag nicht in meinem forum...
Habe es schon des öfteren auf einen webserver hochgeladen und dort funktioniert alles. Um mir aber zeit zu sparen, würde ich in zukunft vorher alles mit xampp testen, weiss halt nur nicht, wo mein fehler liegt...

Weiss jemand Rat? :idea:
attila
 
Posts: 4
Joined: 07. January 2011 18:29

Re: php funktioniert nur bedingt

Postby Nobbie » 07. January 2011 21:11

attila wrote:Weiss jemand Rat? :idea:


Ne - wie denn?

An irgendeiner Stelle funktioniert irgendetwas nicht - da wir nicht einmal auch nur ein Bit (geschweige denn ein Byte oder gar zusammenhängenden Code) von Deiner Software hier zu sehen bekommen, kann auch niemand auch nur im Ansatz irgendetwas aussagen. Wie soll das möglich sein??

Die Vermutung von "wole" hätte ich im Prinzip auch, allerdings setzt das voraus, dass mal short-Tags, mal nicht short-Tags verwendet wurden (weil es ja Teile auch tun). Vielleicht ist es aber auch ein register_globals Problem - oder oder oder - no Source, no help!
Nobbie
 
Posts: 8759
Joined: 09. March 2008 13:04

Re: php funktioniert nur bedingt

Postby attila » 07. January 2011 21:54

hier nun der (zugegeben noch ziemlich simple) Code, aber für den anfang...:

forumfunktionen.php:
<?php

function beitrag_ausgeben ($eintrag) {
print "<b>Betreff: </b>";
print $eintrag ["betreff"];
print "<br>";
print $eintrag["text"];
print "<br>Autor: ";
print $eintrag["autor"];
print "<hr>";
}

function beitrag_hinzufuegen () {
global $betreff, $text, $autor;

if (empty($betreff) {$betreff="kein Betreff";}//wenn kein Betreff angegeben, soll "kein betreff" erscheinen

$text= str_replace("\n", "", $text); //entfernt \n vor und nach dem textbereich

$texte= file("beitraege.txt");
$neuer_text = $text;
$letzter_textindex= count ($texte)-2;

if (trim ($texte [$letzter_textindex]) != $neuer_text) {
$datei = fopen ("beitraege.txt", "a");
fputs ($datei, "\n<b>$betreff</b>");
fputs ($datei, "\n$neuer_text\n");
fputs ($datei, "$autor");
fclose ($datei);
}
}

function formular_anzeigen () {
?>
<form action="forum.php" method="post">
Betreff: <input type="text" size="50" name="betreff" /><br />
Text:<br /> <textarea name="text" cols="40" rows="10"/></textarea><br />
Autor: <input type="text" size="50" name="autor" />
<p>
<input type="submit" value="Abschicken" />
</form>
<?php
}

function beitraege_zaehlen() {
$zeilen = file ("beitraege.txt");
$zahl = count ($zeilen)/3;
print "Bisher $zahl Eintr&auml;ge!";
}

?>


code für forum.php:
<?php include("forumfunktionen.php");
if (isset($text)) beitrag_hinzufuegen ();
include ("beitraege.php");
?>
<html>
<head>
<title>Forum</title>
</head>

<body bgcolor="#CC99CC">
<h1>Willkommen beim Forum</h1>
<b>Sagen sie ihre Meinung!</b><p>
<?php formular_anzeigen() ?>
<hr />
<?php
for ($i=0; $i < count($beitrag); $i++) {
beitrag_ausgeben($beitrag[$i]);
}

beitraege_zaehlen();
?>
</body>
</html>

und zu guter letzt beitraege.php:
<?php //liest die daten von beitraege.txt ins hauptprogramm ein
$datei=fopen("beitraege.txt", "r");
$i=0;
while(!feof($datei)) {
$beitrag [$i] ["betreff"] = fgets ($datei, 1024);
$beitrag [$i] ["text"] = fgets ($datei, 1024);
$beitrag [$i] ["autor"] =fgets ($datei, 1024);
$i++;
}
fclose($datei);
?>

wie gesagt, wenn ich´s hochlade, funktioniert´s nur über xampp nicht...
attila
 
Posts: 4
Joined: 07. January 2011 18:29

Re: php funktioniert nur bedingt

Postby Nobbie » 07. January 2011 23:07

Wie vermutet: register_globals

Google mal ein wenig danach, Du wirst viele Dinge dazu erfahren.
Nobbie
 
Posts: 8759
Joined: 09. March 2008 13:04

Re: php funktioniert nur bedingt

Postby attila » 07. January 2011 23:45

Ist ja ne ganze menge und soweit ich verstanden habe, geht´s um die globalen variablen...?
Selbst auf die Gefahr hin, mich zu outen, bin noch ziemlich am anfang mit meinem php, wie kann ich das Script denn umschreiben (auch für die Zukunft),
damit ich "zeitgemässe" scripts schreibe...?
attila
 
Posts: 4
Joined: 07. January 2011 18:29

Re: php funktioniert nur bedingt

Postby Altrea » 08. January 2011 01:18

register_globals ist ein Relikt aus alten PHP-Versionen in denen es noch keine superglobalen Arrays ($_GET, $_POST, etc.) gab.
Im Grunde bewirkt diese Einstellung, dass alle Werte die durch Usereingaben entstehen (also vor Allem aus Formularen) automatisch zu globalen Variablen umgewandelt werden.

Klingt erstmal garnicht so schlecht, hat aber einen großen Nachteil. Wenn jemand nämlich nicht sauber programmiert und seine Variablen vor der Benutzung nicht vernünftig initialisiert, so ist diese Variable für jeden einfach durch die URL manipulierbar.

Ein praktisches Beispiel dazu:

Nehmen wir an, du baust ein Login-Script und hast eine Variable $is_logged_in die, wenn sie wahr ist (also TRUE, 1 oder ähnliches enthält) weitere Funktionen freischaltet. Nun vergisst du aber die Variable ganz am Anfang auf FALSE zu setzen und schon hast du ein massives Sicherheitsproblem in deiner Anwendung durch register_globals.
Kommt nämlich jetzt irgendwer daher und hängt an deine URL ein ?is_logged_in=1 an, wird automatisch die Variable $is_logged_in erstellt und mit der 1 gefüllt. Jemand kann sich einloggen ohne je ein Login-Formular verwendet zu haben.

Aus diesem Grund ist es strengstens empfohlen, register_globals auch nichtmehr zu aktivieren (mit PHP 6 verschwindet es vollständig aus dem Programm).

Was ist die Alternative? Nun, erstelle deine Variablen selber. Die superglobalen Arrays die es seit PHP 4.2 gibt machen es dir da sehr einfach. Jeder Wert, der durch den User übertragen wird landet in einem der superglobalen Arrays. Sendet dein Formular über die POST Methode, wird das $_POST Array gefüllt, bei GET das $_GET Array.

auch hier ein praktisches Beispiel:
nehmen wir an, du hast folgendes Formular:
Code: Select all
<form action="" method="post">
    <input name="variable1" type="text">
    <input name="variable2" type="text">
    <input type="submit">
</form>


Nach dem abschicken des Formulars hast du 2 Werte in deinem $_POST Array, die du über die Array keys ansprechen kannst.
variable1 wird also zu $_POST['variable1'], variable2 wird zu $_POST['variable2'].

Jetzt kommst du ins Spiel. Du hast dafür zu sorgen, die Array Keys zu prüfen, so dass nur mit von dir gewollten und erwarteten Werten weitergearbeitet wird und daraus deine Variablen selbst erzeugt werden.

Also im Grunde musst du sowas in der Art machen, um mich auf mein Beispielscript zu beziehen:
Code: Select all
<?php
if ('POST' == $_SERVER['REQUEST_METHOD'] ) {
    // Beispiel: variable 1 soll eine einfache Ganzzahl sein, die nur konvertiert aber nicht geprüft wird
    if (!empty($_POST['variable1'])) {
        $variable1 = (int)$_POST['variable1'];
    } else {
        $variable1 = 0;
    }

    // Beispiel: variable 2 darf nur maximal 5 Zeichen enthalten
    if (!empty($_POST['variable2']) && mb_strlen($_POST['variable2']) <= 5) {
        $variable2 = $_POST['variable2'];
    } else {
        $variable2 = FALSE;
    }
}


Die Prüfungen sind natürlich nur rudimentäre Fallbeispiele. Du musst selbst schauen, was du wie am besten prüfen und verarbeiten kannst.
We don't provide any support via personal channels like PM, email, Skype, TeamViewer!

It's like porn for programmers 8)
User avatar
Altrea
AF Moderator
 
Posts: 8286
Joined: 17. August 2009 13:05
XAMPP version: several
Operating System: Windows 10 Pro x64

Re: php funktioniert nur bedingt

Postby Nobbie » 08. January 2011 10:00

Altrea wrote:Nehmen wir an, du baust ein Login-Script und hast eine Variable $is_logged_in die, wenn sie wahr ist (also TRUE, 1 oder ähnliches enthält) weitere Funktionen freischaltet. Nun vergisst du aber die Variable ganz am Anfang auf FALSE zu setzen und schon hast du ein massives Sicherheitsproblem in deiner Anwendung durch register_globals.
Kommt nämlich jetzt irgendwer daher und hängt an deine URL ein ?is_logged_in=1 an, wird automatisch die Variable $is_logged_in erstellt und mit der 1 gefüllt. Jemand kann sich einloggen ohne je ein Login-Formular verwendet zu haben.


Naja, fast. Den entscheidenden Knackpunkt hast Du nicht beschrieben (ist Dir ggf. auch selbst nicht klar): typischerweise "merken" sich PHP Scripts, die ein Login verwalten, den Zustand (eingeloggt oder nicht) in COOKIE Variablen. Und das ist die Krux an register_globals: die Cookies gehören zu den normalen Request-Variablen, und man sieht der Variablen nicht an, ob sie "ein Cookie war", oder ob sie ein GET-Parameter (also via URL) gewesen ist. Deswegen kann man dem Script vorgaukeln, man wäre eingelogged, in dem man die richtige Variable via URL übergibt (per Hand), das Cookie selbst existiert überhaupt nicht.
Nobbie
 
Posts: 8759
Joined: 09. March 2008 13:04

Re: php funktioniert nur bedingt

Postby Altrea » 08. January 2011 11:45

Bewußt war mir diese Tatsache schon, nur sehe ich sie nicht als entscheidenen Knackpunkt an.
Die Gefahr ist verallgemeinert immer dieselbe: Ein Nutzer kann durch Manipulation ein nicht gewünschtes Verhalten auslösen. Ob dies nun der Zugang zu einem für ihn nicht zugänglichen Bereich durch das vorgaukeln eines Cookie-Wertes ist oder die Ergebnisvariable einer simplen Plausibilitätsprüfung (die für gewöhnlich nicht in Cookies gespeichert wird), ist zwar erwähnenswert, aber nicht der entscheidene Faktor.

P.S.: Aber dennoch ist natürlich jeder Post der dazu beiträgt das Anfänger-Mysterium register_globals zu entmystifizieren hilfreich und deshalb danke für deine Ergänzung :D
We don't provide any support via personal channels like PM, email, Skype, TeamViewer!

It's like porn for programmers 8)
User avatar
Altrea
AF Moderator
 
Posts: 8286
Joined: 17. August 2009 13:05
XAMPP version: several
Operating System: Windows 10 Pro x64

Re: php funktioniert nur bedingt

Postby Nobbie » 08. January 2011 12:04

Altrea wrote:Die Gefahr ist verallgemeinert immer dieselbe: Ein Nutzer kann durch Manipulation ein nicht gewünschtes Verhalten auslösen. Ob dies nun der Zugang zu einem für ihn nicht zugänglichen Bereich durch das vorgaukeln eines Cookie-Wertes ist oder die Ergebnisvariable einer simplen Plausibilitätsprüfung (die für gewöhnlich nicht in Cookies gespeichert wird), ist zwar erwähnenswert, aber nicht der entscheidene Faktor.


Für mich ist das ein Riesenunterschied. Der von Dir zugrunde gelegte Fall, dass ein Programmierer eine NICHT initialisierte Variable abfragt (die dann durch die URL doch initialisiert wird), halte ich schlicht für einen Programmierfehler (wird auch von PHP angemotzt "Used before set"). Da muss also zu der "Gefahr" durch register_globals auch noch ein richtiger Programmierfehler vorliegen, dass das ganze "in die Hose geht"

Das ist bei den Requestvariablen nicht der Fall - dort fragt man beispielsweise mit isset() o.ä. den Wert (und die Existenz) ab, aber durch das Verhalten von register_globals kann das Programm nicht erkennen, WELCHE Requestvariable abgefragt wird. Das ist ein Problem, welches durch das System (und das Vorhandensein von register_globals) erst erzeugt wird, der Programmiere hat dort an sich keinen Fehler begangen. Das stellt de fakto den Sinn von register_globals in Frage - aber was kann der Programmierer dafür, dass die Entwickler dieses Werkzeug zur Verfügung stellen (und alte Lehrbücher auch noch so programmieren lehren)? Hingegen wird kein Lehrbuch der Welt lehren, man solle nicht-initialisierte Variablen abfragen. Und das ist das Tückische: der unerfahrene Programmierer glaubt, er habe alles richtig gemacht - hat er aber nicht, weil das System einen Fehler hat.

Und deswegen ist es mir schon wichtig, dass das zwei ganz verschiedene Dinge sind.
Nobbie
 
Posts: 8759
Joined: 09. March 2008 13:04

Re: php funktioniert nur bedingt

Postby attila » 08. January 2011 12:30

Nobbie und Altrea, ich danke euch für eure Erklärungen, ihr habt mir sehr weitergeholfen! Wär mir gar nicht aufgefallen, hätte ich xampp nicht installiert, da es ja im Web noch funzt.
Nun habe ich zumindest die Möglichkeit, in Zukunft solche "Vergehen" von vornherein auszuschliessen.

Bin froh, wenn ich irgendwann mal, was PHP anbelangt, euren Wissensstand habe, wird wohl noch ne ganze Weile dauern.
Gebe aber die Hoffnung nicht auf, und dank Leuten wie euch, wird mir hoffentlich auch in Zukunft weiergeholfen... :D
attila
 
Posts: 4
Joined: 07. January 2011 18:29

Re: php funktioniert nur bedingt

Postby Pitze » 09. January 2011 00:33

Das ist ein Problem, welches durch das System (und das Vorhandensein von register_globals) erst erzeugt wird, der Programmiere hat dort an sich keinen Fehler begangen.

Warum nicht?
Vielen Programierern kam register_globals ganz gelegen es machte es recht einfach Werte zu übergeben, aber durch Bequemlichkeit oder Unwissenheit wurde vielfach darauf verzichtet die übergebenen Werte auch auf ihre Richtigkeit zu Prüfen oder bei Sensiblen Werten gänzlich darauf zu verzichten.
PHP da den schwarzen Peter zu zu schieben ist leicht aber was ist mit den Programierer.
Ich habe in Bezug auf PHP-Sicherheit und register_globals etliches an Literatur und auch Internetseiten durchgearbeitet und trotz massiver Warnungen und auch Beispiele wie mans sicherer machen kann selbst mit register_globals gab und gibt es noch immer angebliche Profi-Programierer die eklatante Fehler machen auch heute noch wo man regiter_globals nicht mehr benutzt betrachtet man nur mal was man schon mit Include für Schaden anrichten kann.
Nun wie hier ja schon geschrieben wurde ist das ab Version 6 kein Thema mehr aber trotzdem wird es nach wie vor Unsichere PHP-Anwendungen geben und das liegt sicherlich nicht nur an PHP sondern auch am Programierer.
Der grösste Vertrauensbruch ist der Blitzableiter auf der Kirchturmspitze
User avatar
Pitze
 
Posts: 210
Joined: 20. November 2003 21:38
Location: Huskvarna-Schweden
Operating System: Windows Vista


Return to XAMPP für Windows

Who is online

Users browsing this forum: No registered users and 8 guests