要了解PHP的包括-command(To understand PHP's include

2019-10-17 05:45发布

我想有文件handler_login.php的访问的所有变量,我include在该文件handler_question.php。 所述handler_question.php从以下形式处理数据。

我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访问?

Answer 1:

我知道这是不是答案,你问的问题,但由于您标记这个初学者我只想说,你不能从用户信赖任何数据。

只要你做,你打开你的网站SQL注入和跨站脚本攻击的风险。

您需要验证所有输入和逃避是来自用户所有输出。

从您的SQL用户使用unsanitized数据可能会无意中破坏SQL语句,如果使用的报价和其他SQL字符。 但更重要的是它会导致SQL注入非常糟糕的事情像表被丢弃和被包括管理员帐户。

再看类型转换 , 验证和消毒变量和使用PDO预处理语句。 如果PDO不可用您使用pg_escape_string 。

不逃避输出可能会导致攻击者将代码插入您的网站(XSS),它例如可以让他们从您和您的用户窃取密码和饼干。 他们还可以填写你的网站,你有隐藏的垃圾链接,如果谷歌发现第一现场将被列入黑名单。



Answer 2:

你有这样的代码包含文件:

include 'handler-login.php';

(在文件名破折号),但你说你的文件被称为handler_login.php (带下划线)。 是,仅仅在你的问题一个错字,或者会不会是什么问题?

(另外,这个代码看起来破对我说:

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

你的意思是这样的:

$question_body = $_POST['question_body'];

代替?)



Answer 3:

你必须要知道的可变范围为好。 您可以包括使用必要的PHP文件包括或require_once,但你仍然需要能够访问他们在您的当前范围。 我认为PHP文档提供了一个很好的解释。

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



Answer 4:

要回答这个问题:“怎样包括()或require()的作品”简单地把它看作剪切和粘贴。 要粘贴文件的内容,你必须包括()或require()。 要查看其他文件中的变量,你需要学习的范围为罗伯特·格雷纳他回答说。



文章来源: To understand PHP's include -command