2009-08-07 4 views
1

Je voudrais avoir toutes les variables accessibles du fichier handler_login.php que je include dans le fichier handler_question.php. Le handler_question.php traite les données du formulaire suivant.Pour comprendre PHP comprennent de -command

Mon 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> 

Le fichier suivant est ce que le dernier fichier comprend

Mon 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); 
?> 

et enfin mon handler_question.php où le problème se produit

<?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); 

?> 

Comment pouvez-vous avoir toutes les variables de handler_login.php pour être accessible par handler_question.php?

+1

@Masi: Vous dites "Je reçois une erreur dès le début" - quelle est l'erreur? – RichieHindle

+0

S'il vous plaît, voir les commentaires à votre réponse. –

+0

Merci pour vos réponses! –

Répondre

4

Je sais que ce n'est pas la réponse à la question vous avez demandé, mais depuis que vous avez marqué ce débutant je voudrais juste dire, vous ne pouvez pas faire confiance des données des utilisateurs.

Dès que vous le faites, vous ouvrez votre site au risque d'injections sql et d'attaques xss.

Vous devez valider toutes les entrées et escape toutes les sorties provenant d'un utilisateur. L'utilisation de données non anonymes de l'utilisateur dans votre SQL peut involontairement casser l'instruction sql si des guillemets et d'autres caractères SQL sont utilisés. Mais plus important encore, il pourrait résulter en injection SQL avec très de mauvaises choses comme les tables étant abandonnées et les comptes d'administrateurs étant compris.

Regardez typecasting, validating and sanitizing variables et en utilisant PDO avec des instructions préparées. Si PDO n'est pas disponible, utilisez pg_escape_string. La sortie peut entraîner l'insertion d'un code malveillant dans votre site (xss), ce qui pourrait par exemple leur permettre de voler des mots de passe et des cookies à vous et à vos utilisateurs. Ils pourraient également remplir votre site avec des liens de spam cachés, si google découvre d'abord le site sera mis sur liste noire.

+0

PHP est nouveau pour moi. ** Quelle méthode pouvez-vous utiliser pour désinfecter l'entrée de l'utilisateur dans PDO? ** - Mon PHP est 5.2.9 donc cela me suggère que j'ai la fonctionnalité. –

+0

PDO ne désinfecte pas les données; il échappe aux données, ce qui permet au serveur SQL de s'exécuter en toute sécurité. [PDO :: prepare] (http://php.net/manual/fr/pdo.prepare.php) est la méthode que vous recherchez. –

2

vous devez également être conscient de la portée variable. Vous pouvez inclure les fichiers PHP nécessaires en utilisant include ou require_once mais vous devez toujours pouvoir y accéder dans votre portée actuelle. Je pense que les docs PHP fournissent une bonne explication de cela.

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

+0

Merci de l'avoir signalé! - La portée variable de PHP semble être similaire à celle de Java. –

5

Vous avez ce code pour inclure le fichier:

include 'handler-login.php'; 

(avec un tiret dans le nom de fichier), mais vous dites que votre fichier est appelé handler_login.php (avec un trait de soulignement). Est-ce juste une faute de frappe dans votre question, ou pourrait-il être le problème?

(De plus, ce code semble cassé pour moi:

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

Vouliez-vous dire ceci:

$question_body = $_POST['question_body']; 

à la place)

+0

Etes-vous sûr que votre dernière commande est suffisante? - Certaines personnes semblent utiliser le '' '', tandis que d'autres '' {} ''entourent le' $ _POST'. Un exemple est cette réponse http://codingforums.com/showpost.php?s=a653f6c2f1d23485ef25560e10da5b9e&p=512564&postcount=5 --- Je ne suis pas sûr de savoir quel est le bon, car je ne trouve pas de solution dans le manuel de PHP. Je reçois pour le moment le message d'erreur suivant sur la commande SELECT SQL dans l'un de mes codes: * erreur de syntaxe, T_ENCAPSED_AND_WHITESPACE inattendu, attend T_STRING ou T_VARIABLE ou T_NUM_STRING *. –

+0

Votre première prise résout l'un des problèmes - merci de le signaler! –

+1

Je ne sais pas ce que ces accolades essayent de faire - je les supprimerais simplement. Votre SQL échoue en raison d'un problème similaire avec des citations et des accolades supplémentaires, mais si j'étais vous, je prendrais les conseils de @Glass Robot et j'utiliserais des instructions préparées. Cela va aussi guérir votre erreur de syntaxe SQL. – RichieHindle

0

Pour répondre à la question "comment include() ou require() fonctionne" il suffit de penser à couper et coller. Vous collez le contenu du fichier où vous avez include() ou require(). Pour voir les variables dans d'autres fichiers, vous devez apprendre la portée comme Robert Greiner a dit dans sa réponse.

Questions connexes