我有一个PHP页面,我想在UserID,password等页面之间共享一些数据。
我正在学习会话,我不确定我是否正确使用它。
<?php
require_once('database.inc');
$kUserID = $_POST['kUserID'];
$kPassword = $_POST['kPassword'];
if (!isset($kUserID) || !isset($kPassword)) {
header( "Location: http://domain/index.html" );
}
elseif (empty($kUserID) || empty($kPassword)) {
header( "Location: http://domain/index.html" );
}
else {
$user = addslashes($_POST['kUserID']);
$pass = md5($_POST['kPassword']);
$db = mysql_connect("$sHostname:$sPort", $sUsername, $sPassword) or die(mysql_error());
mysql_select_db($sDatabase) or die ("Couldn't select the database.");
$sqlQuery = "select * from allowedUsers where UserID='" . $kUserID . "' AND passwordID='" . $kPassword . "'";
$result=mysql_query($sqlQuery, $db);
$rowCheck = mysql_num_rows($result);
if($rowCheck > 0){
while($row = mysql_fetch_array($result)){
session_start();
session_register('kUserID');
header( "Location: link.php" );
}
}
else {
echo 'Incorrect login name or password. Please try again.';
}
}
?>
答案 0 :(得分:13)
为了所有圣洁的爱,don't use addslashes to prevent SQL injection。
我刚拥有您的网站:
Image of your ownt site http://localhostr.com/files/8f996b/Screen+shot+2010-02-23+at+7.49.00+PM.png
修改:更糟糕的是。
我刚注意到你试图通过addslashes防止注射,甚至没有被使用!
<?php
$kUserID = $_POST['kUserID'];
$user = addslashes($_POST['kUserID']); // this isn't used
$sqlQuery = "select * from allowedUsers where UserID='"
. $kUserID . "' AND passwordID='" . $kPassword . "'";
答案 1 :(得分:4)
请注意,不推荐使用session_register(),而是将值分配给$ _SESSION超全局,例如
<?php
$_SESSION['hashedValue']= '437b930db84b8079c2dd804a71936b5f';
?>
还要注意,存储在会话中的任何内容,尤其是在共享服务器环境中,都是公平的游戏。永远不要存储密码,无论密码是否经过哈希处理或加密。我也会避免存储用户名。如果必须使用会话变量在页面之间使用某种身份验证机制,我建议使用第二个查找表,例如logins
,并在该表中存储用户名,登录时间等。该表中的散列值存储在会话中,每个页面请求都会检查表中的时间和数据库的散列值。如果请求太旧或散列不匹配,请强制重新登录。
PHP manual section on sessions中可以使用所有这些以及更多内容。
答案 2 :(得分:2)
您可能还想将“database.inc”重命名为“database.inc.php”,或者正确设置主机以将“.inc”视为PHP:
http://www.namemybabyboy.com/database.inc
<?php
$sDatabase = 'shayaanpsp';
$sHostname = 'mysql5.brinkster.com';
$sPort = 3306;
$sUsername = 'shayaanpsp';
$sPassword = 'XXXX';
$sTable = 'allowedUsers';
?>
答案 3 :(得分:1)
首先,您需要将session_start()
放在脚本的最开头。它还需要在每个使用会话数据的脚本的开头。所以它也会出现在babyRegistration.php的顶部。
其次,我强烈建议不要使用session_register()
,因为它依赖于register_globals,出于安全原因,它默认是关闭的。您可以在此处阅读更多内容:http://php.net/manual/en/security.globals.php。您可以使用$_SESSION
superglobal:
$_SESSION['kUserID'] = $kUserID;
最后,并非真正与会话相关,只是观察,顶部的isset检查是多余的;对于unset / NULL变量,empty将返回true,就像您预期的那样。
答案 4 :(得分:0)
在页面顶部
session_start();
$_SESSION['yourvarname']='some value';
然后在其他一些页面上检索
echo $_SESSION['yourvarname'];
// some value
哦,关于注射,在进入数据库的所有内容中使用它 http://us3.php.net/manual/en/function.mysql-real-escape-string.php
答案 5 :(得分:0)
只是因为几乎所有事情都变成了避免SQL注入。转义字符串不会使您免于SQL注入。正确的方法是使用准备好的语句。 https://www.php.net/manual/en/mysqli.quickstart.prepared-statements.php