Чтобы понять, что PHP включает в себя -команду - PullRequest
1 голос
/ 07 августа 2009

Я хотел бы, чтобы все переменные были доступны из файла handler_login.php , который я include в файле handler_question.php . handler_question.php обрабатывает данные из следующей формы.

My 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?

Ответы [ 4 ]

5 голосов
/ 07 августа 2009

У вас есть этот код для включения файла:

include 'handler-login.php';

(с тире в имени файла), но вы говорите, что ваш файл называется handler_login.php (с подчеркиванием). Это просто опечатка в вашем вопросе или проблема?

(Кроме того, этот код мне не подходит:

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

Вы имели в виду это:

$question_body = $_POST['question_body'];

вместо этого?)

4 голосов
/ 07 августа 2009

Я знаю, что это не ответ на вопрос, который вы задали, но так как вы пометили этого новичка, я просто хочу сказать, что вы не можете доверять любым данным пользователей.

Как только вы открываете свой сайт для риска инъекций sql и xss-атак.

Вам необходимо проверить все входные данные и escape все выходные данные, полученные от пользователя.

Использование неанализованных данных пользователя в вашем sql может привести к непреднамеренному нарушению оператора sql, если используются кавычки и другие символы sql. Но что еще более важно, это может привести к внедрению sql с очень плохими вещами, такими как удаление таблиц и создание учетных записей администраторов.

Посмотрите на приведение типов , для проверки и дезинфекции переменных и использования PDO с подготовленными операторами. Если PDO недоступен, используйте pg_escape_string .

Не экранирование может привести к тому, что злоумышленник вставит код на ваш сайт (xss), что, например, позволит им украсть пароли и файлы cookie от вас и ваших пользователей. Они также могут заполнить ваш сайт скрытыми спам-ссылками, если Google сначала обнаружит, что сайт будет в черном списке.

2 голосов
/ 07 августа 2009

Вы также должны знать о переменной области.Вы можете включить необходимые PHP-файлы, используя include или require_once, но вам все равно нужно иметь доступ к ним в текущей области видимости.Я думаю, что документы PHP дают хорошее объяснение этому.

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

0 голосов
/ 08 августа 2009

Чтобы ответить на вопрос «как работает include () или require ()», просто подумайте об этом как о вырезке и вставке. Вы вставляете содержимое файла, в котором есть include () или require (). Чтобы увидеть переменные в других файлах, вам нужно изучить область, как сказал Роберт Грайнер в своем ответе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...