2013-03-05 69 views
0

我是整個PHP/SQLite安全性遊戲的新手;我不知道如何防範注入攻擊,基於PHP_SELF的威脅等等。有人可以通過我的55行登錄頁面指出我可能擁有的任何安全漏洞嗎?我真的很感激。PHP/SQLite安全

<?php 
// Begin Redirector ****************************************************************************************** 
if (isset($_COOKIE["session"])) { header("location:http://pagesnap.tk/"); } 
// End Redirector ****************************************************************************************** 

else 
{ 
?> 
    <html> 
     <head> 
      <title>Sign In - PageSnap</title> 
     </head> 
     <body> 
      <h1>PageSnap</h1> 
      <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post"> 
       <input name="username" type="text" placeholder="Username "/> 
       <br /> 
       <input name="password" type="password" placeholder="Password" /> 
       <br /> 
       <br /> 
       <input name="signin" type="submit" value="Sign In" /> 
      </form> 
     </body> 
    </html> 
<?php 
    if ($_POST["signin"]) // If Form Is Submitted 
    { 
     // Variables 
     $username = $_POST["username"]; 
     $password = $_POST["password"]; 
     $password = hash("sha512", $password); 

     // Database Connection 
     $database = new PDO("sqlite:database.sqlite"); 

     // Entry Finder 
     $result = $database -> query("SELECT COUNT (*) FROM accounts WHERE username = '$username' AND password = '$password'"); 

     // Success 
     if ($result -> fetchColumn() > 0) 
     { 
      $id = $database -> query("SELECT id FROM accounts WHERE username = '$username' AND password = '$password'"); 
      $id = $id -> fetchColumn(); 
      setcookie("session", "$id", time()+3600); 
      header("location:http://pagesnap.tk/"); 
     } 

     // Failure (Entry Not Found) 
     else 
     { 
      echo "You have entered your username or password incorrectly."; 
     } 
    } 
} 
?> 

非常感謝!

+0

順便說一句,我的網站的網址是pagesnap.tk,如果你想嘗試一下。 – 2013-03-05 20:38:38

+0

永遠不要信任用戶提交的信息。盲目地將信息推送到您的查詢中,就像*完全*如何獲得SQL注入。 http://bobby-tables.com/ – cimmanon 2013-03-05 20:43:47

+0

至少你正在使用pdo,但你需要綁定你的變量。 – 2013-03-05 20:44:57

回答

-1
  1. 你應該使用ctype_ *或filter_var功能過濾所有的輸入:

    if(ctype_alnum($_POST["username"] ) ) { 
    
         $username = $_POST["username"]; 
    
    } else { 
    
        //error 
    
    } 
    

    所有其他投入

  2. 你應該使用預處理語句

  3. 你應該使用綁定參數

  4. 你應該逃避所有輸出在這種情況下:

     setcookie("session", htmlentities($id), time()+3600);