2009-08-07 14 views
1

私は、ファイルのアクセス可能なすべての変数にファイルhandler_question.phpで私はincludehandler_login.phpを持っていると思います。 handler_question.phpは、次の形式のデータを処理します。-command

マイ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> 

下記のファイルは、最後のファイルが

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

、そして最後に私のhandler_question.phpを含んものです問題が発生する場所あなたはhandler_question.phpでアクセスできるようにhandler_login.phpのすべての変数を持つことができますどのように

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

?> 

+1

@マシ:「最初からエラーが出ます」 - エラーは何ですか? – RichieHindle

+0

あなたの答えにコメントを見てください。 –

+0

あなたの答えをありがとう! –

答えて

4

私はこの質問への答えではありません知っていますあなたは尋ねましたが、この初心者をタグ付けしたので、私はちょうどあなたが信じることはできませんと言っています。データがあります。

すぐにSQLインジェクションとxss攻撃の危険にさらされるようにサイトを開きます。

ユーザからのすべての入力とescapeのすべての出力を検証する必要があります。

sqlでユーザーの非暗号化されたデータを使用すると、引用符やその他のSQL文字が使用されると誤ってSQL文が破損する可能性があります。しかし、もっと重要なことは、と非常にのSQLインジェクションが発生する可能性があります。

typecastingvalidating and sanitizingを参照し、PDOを使用してください。 PDOが利用できない場合は、pg_escape_stringを使用してください。

escaping出力すると、攻撃者があなたのサイト(xss)にコードを挿入し、ユーザーやユーザーからのパスワードやCookieを盗み出す可能性があります。彼らはまた、あなたのサイトに隠れたスパムリンクを埋め込むこともできます。もしgoogleが最初にそのサイトをブラックリストに載せれば、

+0

PHPは私にとって初めてのものです。 **どのメソッドを使用してPDOでユーザーの入力をサニタイズすることができますか?** - 私のPHPは5.2.9です。これは私にこの機能があることを示唆しています。 –

+0

PDOはデータをサニタイズしません。データをエスケープして、SQL Serverが安全に実行できるようにします。 [PDO :: prepare](http://php.net/manual/en/pdo.prepare.php)は、探している方法です。 –

2

また、可変範囲も認識する必要があります。 includeまたはrequire_onceを使用して必要なPHPファイルをインクルードすることはできますが、それでも現在のスコープでアクセスできる必要があります。私はPHPのドキュメントは、これの良い説明を提供すると思います。

include 'handler-login.php'; 

(ファイル名にダッシュ付き)がありますが、(アンダースコア)あなたのファイルがhandler_login.phpと呼ばれていると言う:

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

+0

ありがとうございました! PHPの可変スコープはJavaと似ているようです。 –

5

あなたは、ファイルを含めるには、このコードを持っています。それはちょうどあなたの質問のタイプミスですか、それとも問題だろうか?

(また、このコードは私に壊れなります

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

あなたはこのもしかして:?代わりに

$question_body = $_POST['question_body']; 

)を

+0

最後のコマンドで十分ですか? - 一部の人は '' 'を使い、' '{} 'は' $ _POST'の周りにある人たちです。一例は、この回答ですhttp://codingforums.com/showpost.php?s=a653f6c2f1d23485ef25560e10da5b9e&p=512564&postcount=5 ---私はPHPのマニュアルで解決策を見つけることができないので、正しい方法はどちらであるかわかりません。私は現時点で、私のコードの中のSELECT SQLコマンドについて次のエラーメッセージを受け取っています:*構文エラー、予期しないT_ENCAPSED_AND_WHITESPACE、T_STRINGまたはT_VARIABLEまたはT_NUM_STRING *を予期しています。 –

+0

あなたの最初のキャッチは問題の1つを解決します - それを指摘してくれてありがとう! –

+1

私はそれらの括弧が何をしようとしているのか分かりません - 私は単にそれらを削除します。あなたのSQLは余分な引用符と中括弧で同様の問題があるため失敗していますが、私があなただったら@Glass Robotの助言を受けて準備文を使用します。それはあなたのSQL構文エラーも治すでしょう。 – RichieHindle

0

「include()またはrequire()の動作」という質問に答えるには、切り取りと貼り付けと考えるだけです。 include()またはrequire()があるファイルの内容を貼り付けています。他のファイルの変数を見るには、Robert Greiner氏の答えで述べたように、範囲を知る必要があります。

関連する問題