我希望文件 handler_quesin.php 中的文件 handler_login.php 可以访问所有变量,我include
。{em> 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_question.php访问handler_login.php的所有变量?
答案 0 :(得分:5)
您有此代码包含文件:
include 'handler-login.php';
(文件名中带有破折号),但您说您的文件名为handler_login.php
(带下划线)。这只是你问题中的拼写错误,还是问题?
(另外,这段代码看起来很糟糕:
$question_body = '{$_POST['question_body']}'
你的意思是:
$question_body = $_POST['question_body'];
代替?)
答案 1 :(得分:4)
我知道这不是你问的问题的答案,但是既然你标记了这个初学者,我只想说,你不能相信来自用户的任何数据。
一旦打开网站就会冒sql注入和xss攻击的风险。
您需要验证来自用户的所有输入和escape所有输出。
如果使用了引号和其他sql字符,在sql中使用来自用户的未经过处理的数据可能会无意中破坏sql语句。但更重要的是,它可能导致sql注入非常错误的事情,例如删除表和管理帐户。
查看typecasting,validating and sanitizing变量并使用PDO准备好的语句。如果您无法使用PDO,请使用pg_escape_string。
不escaping输出可能导致攻击者在您的网站(xss)中插入代码,例如可能允许他们窃取您和您的用户的密码和Cookie。他们还可以使用隐藏的垃圾邮件链接填充您的网站,如果谷歌首先发现该网站将被列入黑名单。
答案 2 :(得分:2)
您还必须了解变量范围。您可以使用include或require_once包含必要的PHP文件,但仍需要能够在当前范围内访问它们。我认为PHP文档提供了一个很好的解释。
答案 3 :(得分:0)
要回答“如何包含()或要求()的工作原理”,只需将其视为剪切和粘贴即可。您正在粘贴包含include()或require()的文件的内容。要查看其他文件中的变量,您需要了解Robert Greiner在回答中所说的范围。