2009-08-07 6 views
1

handler_login.php 파일에서 모든 변수에 액세스 할 수있게하고 싶습니다. handler_question.php 파일에서 include을 사용하고 있습니다. handler_question.php은 다음 형식의 데이터를 처리합니다.PHP include 명령을 이해하려면 -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를 포함하는 것입니다 문제가 발생하는 곳

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

?> 

handler_login.php의 모든 변수를 handler_question.php로 어떻게 액세스 할 수 있습니까?

+1

@Masi : "처음부터 오류가 있습니다."- 오류가 무엇입니까? – RichieHindle

+0

제발, 당신의 대답에 의견을 참조하십시오. –

+0

답변 해 주셔서 감사합니다. –

답변

4

나는이 질문에 대한 답 아니라는 것을 알고 당신은 물었습니다.하지만이 초보자를 태그 한 이후로 나는 단지 말하고 싶습니다. 사용자는 데이터를 신뢰할 수 없습니다.

SQL 인젝션 및 xss 공격 위험에 노출되면 사이트를 열면됩니다.

모든 입력을 확인하고 사용자로부터 오는 모든 출력 escape을 확인해야합니다.

sql에서 사용자의 초기화되지 않은 데이터를 사용하면 따옴표 및 다른 sql 문자를 사용하면 의도하지 않게 sql 문이 손상 될 수 있습니다. 그러나 더 중요한 것은 과 함께 SQL 인젝션을 초래할 수 있으며, 테이블이 삭제되고 관리 계정이 구성되는 것과 같은 나쁜 것들이 매우입니다.

변수를보고 typecasting, validating and sanitizing 변수를 사용하고 준비된 문구를 사용하여 PDO을 사용하십시오. PDO을 사용할 수없는 경우 pg_escape_string을 사용하십시오.

아니요 escaping 출력으로 인해 공격자가 사이트와 코드 (xss)를 삽입하여 사용자와 사용자의 암호와 쿠키를 도용 할 수 있습니다. 그들은 또한 당신의 사이트를 숨겨진 스팸 링크로 채울 수 있습니다. 구글이 먼저 사이트가 블랙리스트에 올랐다면 알게됩니다.

+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의 설명서에서 해결책을 찾을 수 없기 때문에 올바른 방법이 확실하지 않습니다. 나는 그 순간에 다음 SQL * SELECT 명령에 대한 오류 메시지를 보게됩니다. * 구문 오류, 예기치 않은 T_ENCAPSED_AND_WHITESPACE, T_STRING 또는 T_VARIABLE 또는 T_NUM_STRING *이 필요합니다. –

+0

첫 번째 캐치가 문제 중 하나를 해결합니다. 지적 해 주셔서 감사합니다! –

+1

나는 그 중괄호가 무엇을하려고하는지 알지 못합니다. 귀하의 SQL은 여분의 따옴표와 중괄호와 비슷한 문제로 인해 실패하고 있습니다. 그러나 제가 당신이라면 @Glass Robot의 조언을 듣고 준비된 문을 사용할 것입니다. 그것은 SQL 구문 오류도 치료할 것입니다. – RichieHindle

0

"include include() 또는 require() works"라는 질문에 대답하려면 간단히 잘라 붙여 넣기로 생각하십시오. include() 또는 require()가있는 파일의 내용을 붙여 넣습니다. 다른 파일의 변수를 보려면 Robert Greiner가 그의 대답에서 말한 범위를 알아야합니다.