2013-05-01 79 views
1

我有下面的登錄腳本,我認爲這是安全的。但是,有人不斷訪問網站的管理部分並更改內容。登錄不斷被黑客入侵

if(isset($_POST['submit'])) { 
$error = false; 
$user_login = stripslashes(strip_tags(htmlentities($_POST['user_login']))); 
$pass_login = stripslashes(strip_tags(htmlentities($_POST['pass_login']))); 
if(!empty($user_login) && !empty($pass_login)) { 
    $check_details=mysql_query("SELECT * FROM `admin` WHERE email='".$user_login."' AND password='".md5($pass_login)."'"); 
    $status=mysql_num_rows($check_details); 
    if($status >= "1") { 
     $error = false; 
     $_SESSION['wmmadmin_loggedin'] = "1"; 
     $_SESSION['wmmadmin_email'] = "".$user_login.""; 
     header("Location: ./index.php"); 
    } 
    if(!$status || $status == "0") { 
     $error = true; 
     echo "<div id=\"error\"><strong>Error!</strong><br />Login details were incorrect.</div>\n"; 
    } 
} 
if(empty($user_login) || empty($pass_login)) { 
    $error = true; 
    echo "<div id=\"error\"><strong>Error!</strong><br />Enter your username and password.</div>\n"; 
} 

}

在每個腳本的頂部有一個函數調用:

function checkloggedin() { 
if($_SESSION['wmmadmin_loggedin'] == "0" || $_SESSION['wmmadmin_loggedin'] !== "1" ||  $_SESSION['wmmadmin_email'] == "") { 
header("Location: login.php"); 
exit; 
} 
} 

我缺少的東西?我需要阻止這些黑客!

感謝 皮特

+18

您可以[SQL注入](http://stackoverflow.com/q/60174)。謎團已揭開。 – 2013-05-01 16:12:42

+1

您需要使用非棄用函數**(NOT'mysql _ *)重寫** ** – brbcoding 2013-05-01 16:13:30

+3

Phew,'stripslashes(strip_tags(htmlentities($ str)))'是一個有趣的函數 - 您從哪裏得到的? '':-)。使用'mysql_real_escape_string($ str)'代替([see here](http://php.net/manual/en/function.mysql-real-escape-string.php))。 – halfer 2013-05-01 16:14:19

回答

11

有人可能會發送以下爲user_login

user_login="nobody' OR 1 OR email='nobody" 

這將導致查詢

… WHERE email='nobody' OR 1 OR email='nobody' AND password='…' 

這被解釋爲

… WHERE email='nobody' OR 1 OR (email='nobody' AND password='…') 

因爲中間部分是真的(1對MySQL意味着真實),所有事情都是真實的,並且授予訪問權限。這是一種傳統的SQL注入攻擊。

+1

爲了擴大這個答案,使用PDO和準備語句是防止這種情況的好方法。我在這裏發佈了一個例子:http://stackoverflow.com/questions/7246389/php-that-is-return-an-json-array-is-showing-up-as-null-in-javascript/7259534#7259534 – CountMurphy 2013-05-01 16:25:24

4

讓我們來看看如何正確違反逃逸的規則方面:

$user_login = stripslashes(strip_tags(htmlentities($_POST['user_login']))); 

假設用戶名中包含HTML標記。 <>將首先轉換爲實體:&lt;&gt;

然後strip_tags()嘗試過濾標籤 - 但沒有!無用的函數調用。

然後你想刪除斜槓。有沒有?這個函數調用只有在你的PHP中仍然啓用了魔術引號的情況下才有用,你應該檢查它們是否是,而不是盲目刪除它們。

htmlentities()只會將雙引號轉換爲實體,而不是單引號。而你的SQL使用單引號來終止字符串。所以使用的整個函數仍然可以讓SQL注入。

不要自己發明安全功能。在SQL中使用mysql_real_escape_string()和雙引號,並保存。或者使用mysqli或PDO使用預先準備好的語句。