2012-07-17 16 views
3

我有一個保留變量的問題。我想當你提交表單時,變量將被重置爲默認值。所以我不知道如何限制3次登錄嘗試,直到它說「Go Away!Hacker!」。只使用PHP,沒有別的。 任何人都有線索?不要擔心安全問題,因爲這只是我的教授給予我們的練習的一個例子,我們只需要使用php就可以完成。所以不要擔心黑客重置cookie。PHP登錄計數器

注意:我只使用XAMPP來使php在localhost中工作。

下面的代碼在PHP中:

<center><form action="" method="post"><br> 
User ID: <input type="text" name="id"><br> 
Password: <input type="password" name="pass"><br> 
<input type="submit" name="submit" value="login"> 
</form> 

<?php 
if(isset($_POST['submit'])){ 
    $counter = 0; 
    $counter++; 
    $vid = 'hanzo'; 
    $vpass = '123456'; 
    $id = $_POST['id']; 
    $pass = $_POST['pass']; 
    $c = "<center>"; 
    if(empty($id)) echo "$c Please Input Username.<br>"; 
    else if(empty($pass)) echo "$c Please Input Password.<br>"; 
    else if($vid==$id && $vpass==$pass) echo "$c Login Succesfully<br>";  
    else if($counter>3) echo "$c Go Away! Hacker!<br>"; 
    else echo "$c Invalid Username/Password<br> Login Attempt: $counter"; 
} 
?> 
+2

你在使用Sessions嗎? – Elen 2012-07-17 14:25:25

+1

我建議在數據庫中記錄失敗的嘗試,並且當它們達到3時,在最後5分鐘內,即使正確但沒有給出失敗原因的登錄失敗。這應該有助於防止蠻力攻擊 – Waygood 2012-07-17 14:27:53

+0

您需要將計數器存儲在永久存儲器中,例如數據庫。然後在發生成功登錄或足夠的時間後重置爲零。 – 2012-07-17 14:28:07

回答

0

你可以將其存儲在$_SESSION但他們只要保持復位會話cookie是不可靠的。我建議您使用memcacheapc_store,具體取決於您使用哪一個IP地址運行和識別。

+0

我們可以考慮DB中的值作爲另一種選擇嗎? – Dev 2012-07-17 14:27:36

+0

我們可以,但您需要設置一個cron或計劃的事件來減少計數器到期後(或無限期地保留),但它也不是非常有效。 – Martin 2012-07-17 14:29:13

+0

不需要cron。 (*)FROM bad_logins WHERE username ='POSTED USERNAME'AND login_attept_date> DATE_SUB(NOW(),INTERNAL X MINUTE) – Waygood 2012-07-17 14:31:55

4

您可以在會話中粘貼變量,以便通過多頁加載保留用戶/客戶端計算機的變量。 http://us3.php.net/manual/en/intro.session.php

每次腳本運行時,它都會以空白的石板開始。除魔術$ _X變量外,所有變量都是未定義的。您需要將自己的任何數據放在通過多次運行持續存在的地方 - 會話,cookie,數據庫,文本文件等。

會話可能是最簡單的方法。因爲他們有一個客戶端元素,但它們並不完全安全。一個相對複雜的用戶可以規避會話檢查。

+2

我不認爲阻止Cookie需要一個非常複雜的用戶:) – Martin 2012-07-17 14:30:59

+0

@Martin無論如何,黑客可能會使用某種自動化,並不會阻止在瀏覽器中的Cookie – galymzhan 2012-07-17 14:33:41

+0

@galymzhan你是正確的自動化,但它這可能是一個原始腳本,所以cookie可能會被默認禁用 – Martin 2012-07-17 14:40:37

0

您可以使用會話並將登錄保存到這些會話。

if(!isset($_SESSION['logonCounter'])) { 
    $_SESSION['LogonCounter'] = 0; 
} 

if($LogonFail == true) { // do something that check if its correct 
    $_SESSION['LogonCounter']++; 
} 

if($_SESSION['LogonCounter'] < 3) { 
    // Do something 
} 
0

保存在SESSION櫃檯,並在每次失敗登錄增加它的價值..否則,你可以創建數據庫中的表,並保持登錄嘗試在一排與用戶的IP地址一起。隨着第二種方法,如果你需要,你可以永久阻止某些IP的...

希望這有助於

0

個人而言,我會使用一個數據庫,以便您可以看到發生了什麼,這是不容易被避免黑客,但只使用PHP中可以登錄嘗試的次數存儲在一個會話變量:

<?php 
// only check on posts 
if ($_SERVER['REQUEST_METHOD'] === 'POST') 
{ 
    session_start(); 
    $_SESSION['login_attempts'] = isset($_SESSION['login_attempts']) ? ($_SESSION['login_attempts'] + 1) : 0; 
    // do checking on number of attempts 
    if ($_SESSION['login_attempts'] > 3) 
    { 
    echo "Go Away! Hacker!"; 
    die(); 
    // or just do a redirect to another page... 
    } 
} 
?> 
<center><form action="" method="post"><br> 
... 
+0

因此,它是檢查$ _SESSION ['login_attempts' ]> 3?以及如何在回顯登錄嘗試#中使用$ _SESSION變量? – 2012-07-17 15:11:01

+0

@Hanzo Kimura起初我沒有補充說,但現在它在那裏。請注意,您可以在腳本中的任何位置使用該變量,但是在輸出到瀏覽器之前,需要將'session_start();'放在頂部。 – jeroen 2012-07-17 15:13:07

+0

謝謝我會試試看:D – 2012-07-17 15:17:40

0
if(isset($_SESSION['attempts'])) 
{ 
    if $_SESSION['attempts'] == 3{ 
     echo "Go away!"; 
    } else { 
     $_SESSION['attempts']=$_SESSION['attempts']+1; 
    } 
} 
else 
{ 
    $_SESSION['attempts']=0; 
} 
0

你很可能會提供最好的服務爲通過一個簡單的實現會話做到這一點。但是,用戶可以通過刪除會話cookie來輕鬆終止會話。真正最安全的方法是將IP地址的所有登錄請求記錄到數據庫中,然後在來自給定IP地址的Y次失敗請求數量爲Y的情況下顯示安全警告。

1

嘗試使用

<input type='hidden' /> 

不會真的做很多工作來防止意志堅定的黑客,但如果你有一個特別的厭惡他們,你可以用它來存儲頁面之間的變量不啓用會話。

否則

session_start(); 
if (isset($_SESSION['loginCount'])) 
{ 
    $_SESSION['loginCount']++; 
    if ($_SESSION['loginCount'] > 3) 
    { 
    echo 'Bog Off!'; 
    exit; 
    } 
} else { 
    $_SESSION['loginCount'] = 1; 
} 

這將是更好,但被告知,如果你是黑客清除瀏覽器緩存中的會話將被重置。最好的辦法是跟蹤數據庫中的源IP地址,但即使這樣也可以用代理來解決。

+0

我將如何處理隱藏的輸入?無論如何,我會嘗試一個 – 2012-07-17 14:57:17

+0

會話與隱藏的輸入,您可以將value元素設置爲一個相同名稱的變量,例如''/>'或其他值。您可以使用它在用戶提交表單時在頁面視圖之間存儲值。 – Bappy1988 2012-07-18 07:30:50