问题描述
|
我试图通过将成员设置为仅成员区域来保护页面,在这种情况下,我使用的代码是
<?PHP
include \'dbc.PHP\';
page_protect();
?>
通过使用此代码没有错误,并且也可以正常工作
但是问题是,每当我将以下代码放在同一页中时
问题只会在iPhone上发生,只有在使用此设备的情况下才会发生,但其余一切仍然正常,例如PC,笔记本电脑和平板电脑(iPad),它们都没问题
但是iPhone的问题是您可以在登录后访问该页面,但是无论何时刷新,它都会将您重定向到登录页面并再次请求登录。
<?PHP
if(!isset($_GET[\'link\'])){
$link = 1;
} else {
$link = $_GET[\'link\'];
}
if ($link == 1) {
echo \"\";
} elseif ($link == 23) {
echo \"\";
} else {
echo \"\";
}
?>
没有错误显示或任何东西。
我的问题是,无论如何,这里是否有保护页面的方法,因为我需要将此区域设置为仅成员区域,并且上面的代码非常重要,需要放在页面中。
提前致谢。
这是dbc.PHP的遗憾,但我复制了整个脚本并放在此处
<?PHP
/*************** PHP LOGIN SCRIPT V 2.3*********************
(c) Balakrishnan 2010. All Rights Reserved
Usage: This script can be used FREE of charge for any commercial or personal projects. Enjoy!
Limitations:
- This script cannot be sold.
- This script should have copyright notice intact. Dont remove it please...
- This script may not be provided for download except from its original site.
For further usage,please contact me.
/******************** MAIN SETTINGS - PHP LOGIN SCRIPT V2.1 **********************
Please complete wherever marked xxxxxxxxx
/************* MysqL DATABASE SETTINGS *****************
1. Specify Database name in $dbname
2. MysqL host (localhost or remotehost)
3. MysqL user name with ALL previleges assigned.
4. MysqL password
Note: If you use cpanel,the name will be like account_database
*************************************************************/
define (\"DB_HOST\",\"xxxxxx\"); // set database host
define (\"DB_USER\",\"xxxxxx\"); // set database user
define (\"DB_PASS\",\"xxxxxxx\"); // set database password
define (\"DB_NAME\",\"xxxxxx\"); // set database name
$link = MysqL_connect(DB_HOST,DB_USER,DB_PASS) or die(\"Couldn\'t make connection.\");
$db = MysqL_select_db(DB_NAME,$link) or die(\"Couldn\'t select database\");
/* Registration Type (Automatic or Manual)
1 -> Automatic Registration (Users will receive activation code and they will be automatically approved after clicking activation link)
0 -> Manual Approval (Users will not receive activation code and you will need to approve every user manually)
*/
$user_registration = 1; // set 0 or 1
define(\"COOKIE_TIME_OUT\",10); //specify cookie timeout in days (default is 10 days)
define(\'SALT_LENGTH\',9); // salt for password
//define (\"ADMIN_NAME\",\"admin\"); // sp
/* Specify user levels */
define (\"ADMIN_LEVEL\",5);
define (\"USER_LEVEL\",1);
define (\"GUEST_LEVEL\",0);
/*************** reCAPTCHA KEYS****************/
$publickey = \"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\";
$privatekey = \"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\";
/**** PAGE PROTECT CODE ********************************
This code protects pages to only logged in users. If users have not logged in then it will redirect to login page.
If you want to add a new page and want to login protect,copY this from this to END marker.
Remember this code must be placed on very top of any html or PHP page.
********************************************************/
function page_protect() {
session_start();
global $db;
/* Secure against Session Hijacking by checking user agent */
if (isset($_SESSION[\'HTTP_USER_AGENT\']))
{
if ($_SESSION[\'HTTP_USER_AGENT\'] != md5($_SERVER[\'HTTP_USER_AGENT\']))
{
logout();
exit;
}
}
// before we allow sessions,we need to check authentication key - ckey and ctime stored in database
/* If session not set,check for cookies set by Remember me */
if (!isset($_SESSION[\'user_id\']) && !isset($_SESSION[\'user_name\']) )
{
if(isset($_COOKIE[\'user_id\']) && isset($_COOKIE[\'user_key\'])){
/* we double check cookie expiry time against stored in database */
$cookie_user_id = filter($_COOKIE[\'user_id\']);
$rs_ctime = MysqL_query(\"select `ckey`,`ctime` from `users` where `id` =\'$cookie_user_id\'\") or die(MysqL_error());
list($ckey,$ctime) = MysqL_fetch_row($rs_ctime);
// coookie expiry
if( (time() - $ctime) > 60*60*24*COOKIE_TIME_OUT) {
logout();
}
/* Security check with untrusted cookies - dont trust value stored in cookie.
/* We also do authentication check of the `ckey` stored in cookie matches that stored in database during login*/
if( !empty($ckey) && is_numeric($_COOKIE[\'user_id\']) && isUserID($_COOKIE[\'user_name\']) && $_COOKIE[\'user_key\'] == sha1($ckey) ) {
session_regenerate_id(); //against session fixation attacks.
$_SESSION[\'user_id\'] = $_COOKIE[\'user_id\'];
$_SESSION[\'user_name\'] = $_COOKIE[\'user_name\'];
/* query user level from database instead of storing in cookies */
list($user_level) = MysqL_fetch_row(MysqL_query(\"select user_level from users where id=\'$_SESSION[user_id]\'\"));
$_SESSION[\'user_level\'] = $user_level;
$_SESSION[\'HTTP_USER_AGENT\'] = md5($_SERVER[\'HTTP_USER_AGENT\']);
} else {
logout();
}
} else {
header(\"Location: login.PHP\");
exit();
}
}
}
function filter($data) {
$data = trim(htmlentities(strip_tags($data)));
if (get_magic_quotes_gpc())
$data = stripslashes($data);
$data = MysqL_real_escape_string($data);
return $data;
}
function EncodeURL($url)
{
$new = strtolower(ereg_replace(\' \',\'_\',$url));
return($new);
}
function DecodeURL($url)
{
$new = ucwords(ereg_replace(\'_\',\' \',$url));
return($new);
}
function ChopStr($str,$len)
{
if (strlen($str) < $len)
return $str;
$str = substr($str,$len);
if ($spc_pos = strrpos($str,\" \"))
$str = substr($str,$spc_pos);
return $str . \"...\";
}
function isEmail($email){
return preg_match(\'/^\\S+@[\\w\\d.-]{2,}\\.[\\w]{2,6}$/iU\',$email) ? TRUE : FALSE;
}
function isUserID($username)
{
if (preg_match(\'/^[a-z\\d_]{5,20}$/i\',$username)) {
return true;
} else {
return false;
}
}
function isURL($url)
{
if (preg_match(\'/^(http|https|ftp):\\/\\/([A-Z0-9][A-Z0-9_-]*(?:\\.[A-Z0-9][A-Z0-9_-]*)+):?(\\d+)?\\/?/i\',$url)) {
return true;
} else {
return false;
}
}
function checkPwd($x,$y)
{
if(empty($x) || empty($y) ) { return false; }
if (strlen($x) < 4 || strlen($y) < 4) { return false; }
if (strcmp($x,$y) != 0) {
return false;
}
return true;
}
function GenPwd($length = 7)
{
$password = \"\";
$possible = \"0123456789bcdfghjkmnpqrstvwxyz\"; //no vowels
$i = 0;
while ($i < $length) {
$char = substr($possible,mt_rand(0,strlen($possible)-1),1);
if (!strstr($password,$char)) {
$password .= $char;
$i++;
}
}
return $password;
}
function GenKey($length = 7)
{
$password = \"\";
$possible = \"0123456789abcdefghijkmnopqrstuvwxyz\";
$i = 0;
while ($i < $length) {
$char = substr($possible,$char)) {
$password .= $char;
$i++;
}
}
return $password;
}
function logout()
{
global $db;
session_start();
if(isset($_SESSION[\'user_id\']) || isset($_COOKIE[\'user_id\'])) {
MysqL_query(\"update `users`
set `ckey`= \'\',`ctime`= \'\'
where `id`=\'$_SESSION[user_id]\' OR `id` = \'$_COOKIE[user_id]\'\") or die(MysqL_error());
}
/************ Delete the sessions****************/
unset($_SESSION[\'user_id\']);
unset($_SESSION[\'user_name\']);
unset($_SESSION[\'user_level\']);
unset($_SESSION[\'HTTP_USER_AGENT\']);
session_unset();
session_destroy();
/* Delete the cookies*******************/
setcookie(\"user_id\",\'\',time()-60*60*24*COOKIE_TIME_OUT,\"/\");
setcookie(\"user_name\",\"/\");
setcookie(\"user_key\",\"/\");
header(\"Location: login.PHP\");
}
// Password and salt generation
function PwdHash($pwd,$salt = null)
{
if ($salt === null) {
$salt = substr(md5(uniqid(rand(),true)),SALT_LENGTH);
}
else {
$salt = substr($salt,SALT_LENGTH);
}
return $salt . sha1($pwd . $salt);
}
function checkAdmin() {
if($_SESSION[\'user_level\'] == ADMIN_LEVEL) {
return 1;
} else { return 0 ;
}
}
?>
解决方法
ive是您当前的保护脚本的替代方法,它使它不包含cookie:
<?php
//A basic login and session script I just whacked up
session_start();
/**
* cleanit cleans unwanted chars
*
* @param string $input
* @return clean string containing only a-zA-Z0-9.,_ -
*/
function cleanit($input){
return preg_replace(\'/[^a-zA-Z0-9\\.,_ -]/s\',\'\',$input);
}
/**
* auth function called on each page you want protected
*
* @param $_SESSION[\'user_name\'] $logged_in_user
* @param $_SESSION[\'user_hash\'] $hash
* @param $_POST[\'user\'] (when logging in) $username
* @param $_POST[\'pass\'] (when logging in) $password
* @param [login|check|logout] function control $exe
* @return $_SESSION gets set returns LOGGED_IN|ERROR:MULTI:USERS|ACCESS_DENIDE|ACCESS_TIMEOUT|ACCESS_LOGGED_OUT
*/
function auth($logged_in_user,$hash,$username,$password,$exe) {
global $db;
if ($exe==\'login\') {
//LOGIN////////////////////////////////////////////////
$result = mysql_query(\'SELECT * from users where username=\"\'.cleanit(mysql_real_escape_string($username)).\'\" and password=\"\'.cleanit(mysql_real_escape_string(sha1($password))).\'\"\',$db);
$num = mysql_num_rows($result);
if($num==\'1\') {
session_regenerate_id();
$_SESSION[\'user_status\']=\'LOGGED_IN\';
while ($row = mysql_fetch_array($result)) {
$_SESSION[\'user_id\'] = $row[\'id\'];
$_SESSION[\'user_name\'] = $row[\'username\'];
$_SESSION[\'user_hash\'] = md5($_SERVER[\'REMOTE_ADDR\']);
$_SESSION[\'user_ip\'] = cleanit($_SERVER[\'REMOTE_ADDR\']);
$_SESSION[\'user_date\'] = time();
$_SESSION[\'user_level\'] = cleanit($row[\'user_level\']);
}
$result2 = mysql_query(\'REPLACE into users values (\"\'.mysql_real_escape_string($_SESSION[\'user_id\']).\'\",\"\'.mysql_real_escape_string($_SESSION[\'user_name\']).\'\",\"\'.mysql_real_escape_string(sha1($password)).\'\",\"\'.mysql_real_escape_string($_SESSION[\'user_hash\']).\'\",\"\'.mysql_real_escape_string($_SESSION[\'user_ip\']).\'\",\"\'.mysql_real_escape_string($_SESSION[\'user_date\']).\'\",\"\'.mysql_real_escape_string($_SESSION[\'user_level\']).\'\")\',$db);
$return = \'LOGGED_IN\';
return $return;
}elseif($num >=\'2\') {
$result = mysql_query(\'DELETE from users where username=\"\'.mysql_real_escape_string($username).\'\" and password=\"\'.mysql_real_escape_string(sha1($password)).\'\"\');
$error = \'ERROR:MULTI:USERS\';
return $error;
}else {
unset($_SESSION[\'user_id\']);
unset($_SESSION[\'user_name\']);
unset($_SESSION[\'user_hash\']);
unset($_SESSION[\'user_ip\']);
unset($_SESSION[\'user_date\']);
unset($_SESSION[\'user_level\']);
$_SESSION[\'user_status\']==\'\';
session_destroy();
$return = \'ACCESS_DENIDE\';
return $return;
}
return $return;
}
if($exe==\'check\') {
//CHECK////////////////////////////////////////////
$result = mysql_query(\'SELECT hash,ip,user_date from users where username=\"\'.mysql_real_escape_string($logged_in_user).\'\" and hash=\"\'.mysql_real_escape_string($hash).\'\"\',$db);
if(mysql_num_rows($result)==1) {
$rows = mysql_fetch_row($result);
$timeout = (time()-1800);
if($rows[2]<=$timeout){auth(\"\",\"\",\"logout\");
return\'ACCESS_TIMEOUT\';
}
if($hash==$rows[0] && $_SERVER[\'REMOTE_ADDR\']==$rows[1]) {
$return = \'LOGGED_IN\';
mysql_query(\'UPDATE users set user_date=\"\'.time().\'\"\',$db);
return $return;
}else {
session_regenerate_id();
$return = \'ACCESS_DENIDE\';
return $return;
}
}else{
session_regenerate_id();
$return = $_SESSION[\'user_status\'];
return $return;
}
}
if($exe==\'logout\') {
//LOGOUT///////////////////////////////////////////
unset($_SESSION[\'user_id\']);
unset($_SESSION[\'user_name\']);
unset($_SESSION[\'user_hash\']);
unset($_SESSION[\'user_ip\']);
unset($_SESSION[\'user_date\']);
unset($_SESSION[\'user_level\']);
unset($_SESSION[\'user_status\']);
session_destroy();
session_regenerate_id();
$return = \'ACCESS_LOGGED_OUT\';
return $return;
}
if($exe==\'\') {
//BLANK////////////////////////////////////////////
unset($_SESSION[\'user_id\']);
unset($_SESSION[\'user_name\']);
unset($_SESSION[\'user_hash\']);
unset($_SESSION[\'user_ip\']);
unset($_SESSION[\'user_date\']);
unset($_SESSION[\'user_level\']);
unset($_SESSION[\'user_status\']);
session_destroy();
session_regenerate_id();
$return = \'FUNCTION.ERROR:DO.MISSING\';
return $return;
}
return $return;
}
/*
SQL
CREATE TABLE IF NOT EXISTS `users` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`username` varchar(45) NOT NULL DEFAULT \'\',`password` varchar(45) NOT NULL DEFAULT \'\',`hash` varchar(45) NOT NULL DEFAULT \'\',`ip` varchar(45) NOT NULL DEFAULT \'\',`user_date` varchar(45) NOT NULL DEFAULT \'\',`user_level` varchar(45) NOT NULL DEFAULT \'\',PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
INSERT INTO `users` (`id`,`username`,`password`,`hash`,`ip`,`user_date`,`user_level`) VALUES
(1,\'admin\',\'6c7ca345f63f835cb353ff15bd6c5e052ec08e7a\',\'f528764d624db129b32c21fbca0cb8d6\',\'127.0.0.1\',\'1306757011\',\'1\');
admin/admin1
*/
//Usage
/*--------------------------------*/
//login page
session_start();
if(isset($_REQUEST[\'user\']) && isset($_REQUEST[\'pass\'])){
$user=cleanit($_REQUEST[\'user\']);
$pass=cleanit($_REQUEST[\'pass\']);
$_SESSION[\'user_status\'] = auth(\"\",$user,$pass,\"login\");
header(\'members.php\');
}else{
//Show login form
}
/*--------------------------------*/
/*--------------------------------*/
//Members page
session_start();
//Checks login on each page request put this on all pages you want to protect
$_SESSION[\'session_status\'] = @auth($_SESSION[\'user_name\'],$_SESSION[\'user_hash\'],\"check\");
if($_SESSION[\'session_status\']==\'LOGGED_IN\'){
//Logged in norm user
}elseif($_SESSION[\'session_status\']==\'LOGGED_IN\' && $_SESSION[\'user_level\']==1){
//Logged in as admin
}else{
//Logged out
}
/*--------------------------------*/
//Logout
if($_REQUEST[\'do\']==\'logout\'){
auth(\"\",\"logout\");
header(\'Location: index.php\');
}
?>
, 这是为了更好格式化而在此处发布的评论。
您必须阅读session_函数工作的手册页!这样做可以节省您的时间和精力。这里的许多内容都给您提示了问题的可能根源。首先,在session_start()之前,您将不会有任何输出。对于2,请确保您的环境中已打开错误报告。
if(!isset($_GET[\'link\'])){
$link = 1;
} else {
$link = $_GET[\'link\'];
}
if ($link == 1) {
echo \"\";
} elseif ($link == 23) {
echo \"\";
} else {
echo \"\";
}
如果您尝试回显任何内容,则此帖子顶部的此代码段将始终使脚本失败。再次,友好的建议,请花15分钟的时间阅读本手册。与懒惰地在此处发布以获得快速修复相比,您将获得有关工作这些方面的更有价值的第一手信息。再说一次,我可能不是第一个告诉你的人。