2009-08-07 38 views
1

Ich möchte alle Variablen handler_login.php zugänglich der Datei haben, die ich include in der Datei handler_question.php. Die handler_question.php verarbeitet die Daten aus dem folgenden Formular.Um zu verstehen, PHP gehören -command

Mein form_question.php

<form method="post" action="handler-question.php"> 
    <p>Title: 
     <input name="question_title" type="text" cols="92" /> 
    </p> 
    <p>Question: 
     <div id="wmd-container" class="resizable-textarea"> 
       <textarea id="input" class="textarea" tabindex="101" rows="15" cols="92" name="question_body" /></textarea> 
     </div> 
    </p> 

    <p>Tags: 
     <input name="tags" type="text" cols="92" /> 
    </p> 

    <input type="submit" value="OK" /> 
</form> 

Die folgende Datei ist, was die letzte Datei

Mein handler_login.php

<?php 

// independent variables 
$dbHost = "localhost"; 
$dbPort = 5432; 
$dbName = "masi"; 
$dbUser = "masi"; 
$dbPassword = "123456"; 

$conn = "host=$dbHost port=$dbPort dbname=$dbName user=$dbUser password=$dbPassword"; 

// you can store the username and password to $_SESSION variable 
$dbconn = pg_connect($conn); 

if(!$dbconn) { 
    exit; 
} 

$sql = "SELECT username, passhash_md5, email 
    FROM users 
    WHERE username = '{$_POST['username']}' 
    AND email = '{$_POST['email']}' 
    AND passhash_md5 = '{$_POST['password']}';"; 

$result = pg_query($dbconn, $sql); 
if(!$result) { 
    exit; 
} 

$username = $_POST['username']; 
$passhash_md5 = md5($_POST['password']); 


// COOKIE setting /*{{{*/ 

/* $cookie may look like this: 
    variables 
     $username = "username" 
     $passhash_md5 = "password-in-md5" 
    before md5: 
     "usernamepasshash_md5" 
    after md5: 
     "a08d367f31feb0eb6fb51123b4cd3cb7" 
*/ 

$login_cookie = md5(
    $username . 
    $passhash_md5 
); 

$sql3 = "SELECT passhash_md5 


      FROM users 
      WHERE username=$_POST['username'];"; 

$password_data_original = pg_query($dbconn, $sql3); 

while ($row = pg_fetch_row($data)) { 
    $password_original = $row[0]; 
} 

$login_cookie_original = md5(
    $username . 
    $password_original 
); 


// Check for the Cookie 
if (isset($_COOKIE['login'])) 
{ 

    // Check if the Login Form is the same as the cookie 
    if ($login_cookie_original == $login_cookie) 
    { 
     header("Location: index.php"); 
     die("logged in"); 
    } 
    header("Location: index.php"); 
    die("wrong username/password"); 
} 
    // If no cookie, try logging them in 
else 
{ 
    //Get the Data 
    // we do not want SQL injection so we use pg_escape_string 
    $sql2 = sprintf("SELECT * from users 
        WHERE passhash_md5='%s', 
        pg_escape_string($login_cookie)); 
    $raw_user_list = pg_query($dbconn, $sql2); 

    if ($user = pg_fetch_row($row_user_list)) { 
     setcookie ("login", $login_cookie); 
     header("Location: index.php"); 
     die("logged in"); 
    } else { 
     header("Location: index.php"); 
     die("wrong username/password"); 
    } 
} 

pg_close($dbconn); 
?> 

und schließlich meinen handler_question.php umfasst wo das Problem auftritt

<?php 

include 'handler-login.php';       // This is the problem 

$question_body = '{$_POST['question_body']}'  // I get an error right from the beginning 
$question_title = '{$_POST['question_title']}' 

$sql_questions_question_id = "SELECT question_id FROM users 
           WHERE username = $username;" 
// $username comes from handler_login.php 

$questions_question_id = pg_query($dbconn, $sql_questions_question_id); 

// to get tags to an array 
$tags = '{$_POST['question_tags']}'; 
$tags_trimmed = trim($tags); 
$tags_array = explode(",", $tags_trimmed); 

// to save the cells in the array to db 
$sql_tags_insert = "INSERT INTO tags (tag, questions_question_id) 
        VALUES (for ($i = 0; $i < count($tags_array); $i++)" 


$sql = "SELECT username, passhash_md5, email 
    FROM users 
    WHERE username = '{$_POST['username']}'  
    AND email = '{$_POST['email']}' 
    AND passhash_md5 = '{$_POST['password']}';"; 

$result = pg_query($dbconn, $sql); 
if(!$result) { 
    exit; 
} 

$username = $_POST['username']; 
$passhash_md5 = md5($_POST['password']); 


pg_close($dbconn); 

?> 

Wie können Sie alle Variablen handler_login.php haben durch handler_question.php zugänglich zu sein?

+1

@Masi: Sie sagen "Ich bekomme einen Fehler von Anfang an" - Was ist der Fehler? – RichieHindle

+0

Bitte, sehen Sie die Kommentare in Ihrer Antwort. –

+0

Vielen Dank für Ihre Antworten! –

Antwort

4

Ich weiß, dass dies auf die Frage ist nicht die Antwort Sie haben gefragt, aber da Sie diesen Anfänger getaggt haben möchte ich nur sagen, Sie können keine Daten von Benutzern vertrauen.

Sobald Sie öffnen Sie Ihre Website für das Risiko von SQL-Injektionen und XSS-Attacken.

Sie müssen alle Eingaben überprüfen und escape alle Ausgaben, die von einem Benutzer stammen.

Die Verwendung unsanitized Daten des Benutzers in Ihrem SQL konnte unbeabsichtigt die SQL-Anweisung brechen, wenn Anführungszeichen und andere SQL-Zeichen verwendet werden. Aber noch wichtiger, es könnte sql Injektion mit sehr schlimme Dinge wie Tabellen fallen gelassen werden und Admin-Konten umfassen.

Betrachten Sie typecasting, validating and sanitizing Variablen und verwenden Sie PDO mit vorbereiteten Anweisungen. Wenn PDO nicht verfügbar ist, verwenden Sie pg_escape_string.

Nicht escaping Die Ausgabe kann dazu führen, dass ein Angreifer Code in Ihre Site einfügt (xss), der beispielsweise Passwörter und Cookies von Ihnen und Ihren Benutzern stehlen könnte. Sie könnten Ihre Website auch mit versteckten Spam-Links füllen, wenn Google zuerst herausfindet, dass die Seite auf die schwarze Liste gesetzt wird.

+0

PHP ist neu für mich. ** Welche Methode können Sie verwenden, um Benutzereingaben in PDO zu bereinigen? ** - Mein PHP ist 5.2.9, also schlägt dies mir vor, dass ich das Feature habe. –

+0

PDO bereinigt Daten nicht; Es entgeht den Daten, so dass es für den SQL-Server sicher ausgeführt werden kann. [PDO :: vorbereiten] (http://php.net/manual/en/pdo.prepare.php) ist die Methode, die Sie suchen. –

2

müssen Sie auch den variablen Bereich beachten. Sie können die notwendigen PHP-Dateien mit include oder require_once einbinden, aber Sie müssen immer noch in Ihrem aktuellen Umfang darauf zugreifen können. Ich denke, die PHP-Dokumente bieten eine gute Erklärung dafür.

http://us3.php.net/manual/en/language.variables.scope.php

+0

Vielen Dank, dass Sie darauf hingewiesen haben! - Der Variablenumfang von PHP scheint dem von Java ähnlich zu sein. –

5

Sie haben diesen Code die Datei aufzunehmen:

include 'handler-login.php'; 

(mit einem Bindestrich im Dateinamen), aber Sie sagen, dass Ihre Datei handler_login.php aufgerufen wird (mit einem Unterstrich). Ist das nur ein Tippfehler in Ihrer Frage, oder könnte es das Problem sein?

(Auch sieht dieser Code mir gebrochen:

$question_body = '{$_POST['question_body']}' 

Haben Sie dies bedeuten:

$question_body = $_POST['question_body']; 

statt)

+0

Sind Sie sicher, dass Ihr letzter Befehl ausreicht? - Einige Leute scheinen das '' '' zu verwenden, während andere '{} 'um den $ _POST' herumliegen. Ein Beispiel ist diese Antwort http://codingforums.com/showpost.php?s=a653f6c2f1d23485ef25560e10da5b9e&p=512564&postcount=5 --- Ich bin mir nicht sicher, welcher Weg der richtige ist, da ich keine Lösung im PHP-Handbuch finden kann. Ich bekomme im Moment die folgende Fehlermeldung über den SELECT SQL-Befehl in einem meiner Codes: * Syntaxfehler, unerwarteter T_ENCAPSED_AND_WHITESPACE, erwartet T_STRING oder T_VARIABLE oder T_NUM_STRING *. –

+0

Ihr erster Fang löst eines der Probleme - danke, dass Sie darauf hingewiesen haben! –

+1

Ich weiß nicht, was diese Zahnspange zu tun versucht - ich würde sie einfach entfernen. Ihr SQL schlägt aufgrund eines ähnlichen Problems mit zusätzlichen Anführungszeichen und geschweiften Klammern fehl, aber wenn ich Sie wäre, würde ich den Rat von @Glass Robot nehmen und vorgefertigte Anweisungen verwenden. Das wird auch Ihren SQL-Syntaxfehler beheben. – RichieHindle

0

Um die Frage zu beantworten, "wie include() oder require() funktioniert" einfach denken Sie wie es ausschneiden und einfügen. Sie fügen den Inhalt der Datei ein, in der Sie include() oder require() haben. Um die Variablen in anderen Dateien zu sehen, müssen Sie den Umfang lernen, wie Robert Greiner in seiner Antwort sagte.