2013-01-13 95 views
0

我有一个漫画网站,我想我的上传图像路径到数据库。管理员登录和上传安全

我有一个登录界面,检查这样正确的凭据:

  <?php 

     $username = isset($_POST['username']) ? $_POST['username'] : ""; 
     $password = isset($_POST['pw']) ? $_POST['pw'] : ""; 


     if($_SERVER['REQUEST_METHOD'] == 'POST') { 
      if(verify($username, $password) == 1) { 
       header("Location: ?action=admin"); 
      } 
      else { 
       echo "<center>Incorrect credentials</center>"; 
      } 
     } 

     function verify($user, $pw) { 
      include './scripts/dbconnect.php'; 

      $result = $mysqli->query("SELECT username, password FROM users WHERE username='" . $user . "' AND password='" . $pw . "'"); 

      return $result->num_rows; 
     } 

     include 'include/footer.php'; 
     ?> 

然后将它们记录在上传画面。

不幸的是,所有的用户所要做的就是猜出我的网址可能是上传网页,让他们可以跳过我的登录屏幕...

/HTWS /?动作=登录(只需更换“登录”与'管理员',你在那里...)所以,我的第一道防线将不会让我的上传页面名称如此明显......但如果用户仍然猜测它会发生什么......我可以验证另一种方式,不会让他们只是改变了网址?

谢谢!

+1

通常的做法是让登录过程创建会话变量,如果未设置,将导致用户被重定向到登录页面。 – SirDarius

+1

你使用mysqli很棒。但是你仍然很容易注射,因为你只是把输入权倾倒入它。 –

+0

你可能只需使用'.htauth',除非你有十几个管理员。是的,并且http://bobby-tables.com/ – mario

回答

1

那么这是非常不安全的。你想要做的是在登录时设置一些会话变量($_SESSION[user_id]$_SESSION[permission_type]等)。然后,您可以在每个管理页面的顶部有一个功能,例如verifyAdmin(),通过检查您刚刚设置的$_SESSION变量来检查登录用户是否实际上是管理员。如果他们不是,他们会被重定向到登录页面。

当管理员日志,设置一些会话变量,例如:

$_SESSION[user_id] = id_of_admin; 
$_SESSION[permission_type] = 'admin'; 

verifyAdmin会是这个样子:

function verifyAdmin() { 
    if(!isset($_SESSION[username]) || !isset($_SESSION[permission_type]) || $_SESSION[permission_type] != 'admin'){ 
     header("Location: login.php"); 
    } 
} 

然后你可以简单地做每个管理页面顶部这个:

verifyAdmin();

Your verify fun ction应该看起来像这样:

function verify($user, $pw) { 
    include './scripts/dbconnect.php'; 
    $result = $mysqli -> query("SELECT username, password FROM users WHERE username='" . $user . "' AND password='" . $pw . "'"); 
    if ($result -> num_rows == 1) { 
     $_SESSION[username] = $user; 
     $_SESSION[permission_type] = 'admin'; 
    } 
    return $result -> num_rows; 
} 
+0

我想过这样做,但并没有真正获得使用会话的权限。你能提供一个简短的例子给我的代码,你如何整合会话检查? – Growler

+0

检查我的更新。 – SeanWM

+0

好凉快。我理解的细节是这样的:我知道其他超级全局变量从哪里获得它们的值,比如$ _POST(从表单提交中获得它的值)或$ _GET(从URL获取它的值),但是$ _SESSION从哪里获得它的值价值从? $ _SESSION ['user_id']中的'user_id'来自哪里?我检查了http://php.net/manual/en/reserved.variables.session.php的答案,但它仍然不清楚。 – Growler

0

这段代码也容易受到SQL注入的影响。你需要清理这些$ _POST变量。