2012-08-24 98 views
2

假设我想作一个超级简单的页面,在PHP访问限制为单个用户。提供的授权用户知道的目录和网页的网址,可能他只是手动通过在地址栏的get方法的用户名和密码(他会知道),并自动检查其对脚本,其中用户名和密码的值将被硬编码在?该脚本有一个if statement,如果不是这样,将不会显示内容。会有什么缺陷?简单的单用户登录页面

的网址

http://example.com/admin.php?user=admin&password=1324 

admin.php的

<?php if($_GET['user'] == 'admin' && $_GET['password'] == '1324')){ 
// display content here 
}else{ 
echo "You're not authorized to visit this page"; 
} ?> 

方案2:在post方法

到上述场景类似,在这一个授权用户可以键入用户名,表格中的密码,将在实际的admin.php文件中处理。类似的if statement将使用与$_POST[]超全局这次检查输入。

<?php if($_POST['user'] == 'admin' && $_POST['password'] == '1324'){ 
    // display content here 
}else{ 
    echo "You're not authorized to visit this page"; 
} ?> 

回答

4

验证两者都有自己的缺陷。

如果您使用方法1,您最终将传递给标题的变量保存在页面历史记录中,这意味着任何有权访问PC的人都可以搜索并找到它们,从而在过程中给予自己访问权限。搜索引擎也可以拿起并保存链接,让它向世界开放。

如果您使用方法2,您需要重新发送POST数据每一次你访问一个安全页面,这意味着你最终按钮和形式的混乱,其中的链接可能已经足够了。但它确实消除了第一种方法的问题。

一个更好的方法,以这两个将是$ _SESSION变量的使用。这基本上允许数据被存储在服务器侧,同时给其可以被用来控制对数据的访问一个“密钥”的用户 - 该密钥被存储在cookie中,默认情况下。

一个例子用法是:

//Say the user is "admin", and the password is "1234" 
//This data could be used to 'log in' via post. 
//First of all we start the session, and check to see if the user is logged in 
//If the user has the session active, they'll have a cookie on their PC which links to it 
session_start(); 
if ($_SESSION['login']==true || ($_POST['user']=="admin" && $_POST['pass']=="1234")) { 
    //If they already have a session, give them access. 
    //If not, check for posted UN & PW and if correct, give access. 
    $_SESSION['login']=true; //Set login to true in case they got in via UN & PW 
    //Do stuff for when logged in 
} 
else { //Not already logged in, not sent a password 

    //Give the user a login form redirecting to this page. 

} 

的这个好处是:

  • 没有存储在用户端的密码
  • 当浏览器关闭时过期
  • 会话密钥
  • 密码只能通过互联网传递一次
+0

关于第二种方法:我只打算让授权用户访问一个页面。 '$ _SESSION []'在这里不起作用,因为每次登录只发送一次数据(所以如果用户离开受限制的页面,他将不得不再次通过表单)。该情景最好被简化。但是,我甚至不会想到实施这样的系统。这个问题仅仅出于好奇而出现。 – menislici

1

是它可以与GETPOST必须从一种形式通过。这是不安全的,因为很多原因。

但是,是的,您的需求可以用GET通过。只需一个URL,他就可以跳进禁区。

BTW,当您检查用户名和密码:

if($_GET['user'] == 'admin' && $_GET['password'] == '1324' && $_GET['password'] != '' && $_GET['username'] != '') 

可以排除最后一部分,因为你已经对数据

if($_GET['user'] == 'admin' && $_GET['password'] == '1324') 
+0

叫你能提一些hazzards的? – menislici

+1

搜索引擎可能会缓存该链接。它可以被蛮容易的。它是可视的。 –

+0

怎么样'POST',这样的风险呢? – menislici

0

像这样

if (!isset($_SERVER['PHP_AUTH_USER'])) { 
    header('WWW-Authenticate: Basic realm="My Realm"'); 
    header('HTTP/1.0 401 Unauthorized'); 
    echo 'Text to send if user hits Cancel button'; 
    exit; 
} else { 
    $expectdUsername = 'username'; 
    $expectedPassword = 'secret'; 

    if($_SERVER['PHP_AUTH_USER'] != $expectdUsername || 
     $_SERVER['PHP_AUTH_PW'] != $expectedPassword) { 
     echo 'Invalid username/password'; 
     exit; 
    } 

    //Add a cookie, set a flag on session or something 
    //display the page 
} 

它可以通过

http://username:[email protected]