2011-10-29 64 views
0

我編輯別人的PHP,而且他們有他們直接在代碼中使用條件後數據的「認證」系統,看起來像這樣:

if($database_password == $_POST['password']){ 
//access granted 
}else{ 
//access denied 
} 

這看起來不正確,首先,密碼是以明文存儲的,但我想知道$ _POST ['password']部分是否安全。我不知道這是否可行,但是不能只是寫''OR 1 == 1或其他東西來訪問網站?我在問,因爲我必須花費大量時間來說服他們,我需要引入密碼規則並強制每個內部網用戶更改密碼以遵循新規則,特別是當我的任務不是應該涉及編輯這部分代碼或數據庫。

謝謝!

回答

1

不,這是不可能的。一個變量是一個原子單元,與SQL中的例子不同,它不會被評估爲一個字符串,然後執行。

你的例子就是簡單地評價到(在大多數情況下)是false如下:

if ($database_password == " OR 1==1") 
+0

請注意,這不是一個嚴格的比較!看到我的文章 – Terence

+0

這在這個例子中沒有任何區別。 – str

0

沒有,用字符串比較是沒有注射的危險。但「安全」系統顯然是要改寫的。

+0

是的,我明白這一點。我從不相信任何用戶數據,這是我早期學到的一個教訓。我有一個有許多雜項字符串剝離函數的對象,並且我總是在任何用戶輸入中使用這些對象,所以看到其他人在那裏使用未過濾的用戶輸入,以一種簡單的條件,以這種特殊方式,只是令人不安。如果我把它留在那裏,我只是想清楚自己的良心。 – David

2

由於我們看不到剩下的代碼,我所能做的只是猜測。如果您將任何類型的用戶生成內容放入查詢中(在這種情況下,可能是$_POST['password']或用戶名),則始終使用mysql_real_escape_string()。這將避免引號,所以你的輸入是安全的。

如果您正在比較if()語句中的變量,則不需要轉義輸入。

你應該總是加密你的密碼。 總是。除了在某些地方違反法律,這是非常不安全的。如果你不想做大量的PHP,你甚至可以在MySQL查詢中使用SHA1。

1

Extremeley不安全......

預期不好的人可以成爲認證:一個布爾值TRUE或整數0
來源:http://php.net/manual/en/types.comparisons.php

+0

所以你說'(「密碼」== TRUE)'或'(「密碼」== 0)'將評估爲真?這是錯誤的。如果密碼爲空,第二個將評估爲「true」,但由於$ _POST總是字符串,所以在示例中這是不可能的。 – str

+0

也注意到你的例子是編碼不好,對於一個簡單的安全系統,嘗試使用SHA-512(如果他們不知道如何正確實現密鑰伸展,則忽略它) – Terence

+0

這不是我的例子,我只是評估一個字符串在它裏面(如果你說的「你」是指我的話)。請告訴我,你打算用「一個布爾值TRUE,或整數0」。 – str

0

這是OK,因爲它是一個字符串比較。但一般來說,它只是可怕的

<?php 
if($database_password == true){ 
    echo "ACCESS"; 
}else{ 
    //access denied 
} 

返回真正

使用===運算符來改進該代碼。

if("rd" === true){ 
    echo 3; 
}else{ 
    //access denied 
} 

這將是錯誤的。

+0

this例子不安全,它不是一個嚴格的比較! – Terence

0

它是安全的,密碼只傳遞給條件if-else,不包含在查詢中。 這將是危險的,如果你做到這一點

mysql_query("SELECT user_id FROM table WHERE password='".$_POST['password']."'"); 
+0

這個例子是不安全的,它不是一個嚴格的比較!看我的帖子 – Terence

0

喜歡的人說,這裏我們就無從進行SQL注入,因爲在此代碼中沒有SQL。對於密碼,我之前做過的一種方式是在存儲到數據庫之前使用md5()函數將其轉換爲md5哈希,然後在登錄期間將密碼轉換爲md5並比較兩個哈希值。可能不是最好的方式,但肯定比這個更安全。