【问题标题】:To understand PHP's include -command了解 PHP 的 include 命令
【发布时间】:2009-08-07 15:23:45
【问题描述】:

我想让文件 handler_login.php 的所有变量都可以访问,我在文件 handler_question.phpincludehandler_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 访问?

【问题讨论】:

  • @Masi:你说“我从一开始就有一个错误”——错误是什么?
  • 请在您的回答中查看 cmets。

标签: php database postgresql include


【解决方案1】:

你有这个代码来包含文件:

include 'handler-login.php';

(文件名中带有破折号)但您说您的文件名为handler_login.php(带有下划线)。这只是您的问题中的一个错字,还是可能是问题所在?

(另外,这段代码对我来说看起来很糟糕:

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

你是不是这个意思:

$question_body = $_POST['question_body'];

相反?)

【讨论】:

  • 你确定你最后的命令够用了吗? - 有些人似乎使用' ',而其他人则使用'{ }' $_POST。一个例子是这个答案codingforums.com/… ---我不确定哪种方式是正确的,因为我在 PHP 的手册中找不到解决方案。我目前在我的一个代码中收到有关 SELECT SQL 命令的以下错误消息:语法错误,意外的 T_ENCAPSED_AND_WHITESPACE,需要 T_STRING 或 T_VARIABLE 或 T_NUM_STRING
  • 您的第一个问题解决了其中一个问题 - 感谢您指出这一点!
  • 我不知道那些大括号想做什么 - 我只是将它们移除。您的 SQL 因额外引号和大括号的类似问题而失败,但如果我是您,我会接受@Glass Robot 的建议并使用准备好的语句。这也将解决您的 SQL 语法错误。
【解决方案2】:

我知道这不是您所提问题的答案,但既然您标记了这个初学者,我只想说,您不能信任来自用户的任何数据。

一旦打开网站,就会面临 sql 注入和 xss 攻击的风险。

您需要验证来自用户的所有输入和escape 所有输出。

如果使用引号和其他 sql 字符,则在 sql 中使用来自用户的未经处理的数据可能会无意中破坏 sql 语句。但更重要的是,它可能会导致 sql 注入带有 very 不好的事情,例如删除表和组成管理员帐户。

查看typecastingvalidating and sanitizing 变量并将PDO 与准备好的语句一起使用。如果您无法使用PDO,请使用pg_escape_string

不是escaping 输出可能导致攻击者将代码插入您的站点 (xss),例如,这可能允许他们从您和您的用户那里窃取密码和 cookie。如果谷歌首先发现该网站将被列入黑名单,他们还可以用隐藏的垃圾邮件链接填充您的网站。

【讨论】:

  • PHP 对我来说是新的。 您可以使用哪种方法来清理用户在 PDO 中的输入? -- 我的 PHP 是 5.2.9,所以这表明我有这个功能。
  • PDO 不清理数据;它转义了数据,使 sql server 可以安全地执行。 PDO::prepare 是您正在寻找的方法。
【解决方案3】:

您还必须注意变量范围。您可以使用 include 或 require_once 包含必要的 PHP 文件,但您仍然需要能够在当前范围内访问它们。我认为 PHP 文档对此提供了很好的解释。

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

【讨论】:

  • 感谢您指出这一点! - PHP 的变量作用域似乎与 Java 类似。
【解决方案4】:

要回答“include() 或 require() 如何工作”的问题,只需将其视为剪切和粘贴即可。您正在粘贴具有 include() 或 require() 的文件内容。要查看其他文件中的变量,您需要了解 Robert Greiner 在回答中所说的范围。

【讨论】:

    猜你喜欢
    • 2014-05-17
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    相关资源
    最近更新 更多