台灣最大程式設計社群網站
線上人數
1084
 
會員總數:244584
討論主題:188715
歡迎您免費加入會員
討論區列表 >> ASP >> [ASP]拜託大家給點意見...這樣的寫法會不會太慢
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
[ASP]拜託大家給點意見...這樣的寫法會不會太慢
價值 : 0 QP  點閱數:1724 回應數:7

樓主

deepdark
初學者
596 119
859 341
發送站內信

因為最近流行SQL語法攻擊,所以我限制在加入會員時,帳號及密碼二個欄位不可超過十碼及不可用
特殊字元(PS:SQL語法攻擊在寫入時應該沒關係吧,是不是只有查詢才會出事丫),所以我作了很多的IF判斷式,雖然作法笨了點,不過我想基本上大概都有過濾到了,可是我又想到,如果同時有多位使用者在加入時,這樣的程式會不會變的很慢哩...因為用了太多的IF了...會不會丫...大家給點意見吧...或者覺得那裡寫的不好的...或者有人願意幫我改改看...3Q~~

<%
  '宣告變數
   DIM LoginID,Password,RePassword,Name,Sex,ID,Address,HomeTel,OfficeTel,Extension,MPhone,Fax,BYear,BMonth,BDay,Email,News,objConn,objRecord
%>

<%
  '取得變數
   LoginID = trim(Request.Form("帳號"))  '拿掉前後空白
   Password = trim(Request.Form("密碼"))  '拿掉前後空白
   RePassword = trim(Request.Form("確認密碼"))  '拿掉前後空白
   Name = trim(Request.Form("姓名"))
   Sex = Request.Form("性別")
   ID = trim(UCase(Request.Form("身份證號")))  '拿掉前面空白,並且將ID的小寫字母變成大寫字母
   Address = trim(Request.Form("地址"))
   HomeTel = trim(Request.Form("住家電話"))
   OfficeTel = trim(Request.Form("公司電話"))
   Extension = trim(Request.Form("分機"))
   MPhone = trim(Request.Form("行動電話"))
   Fax = trim(Request.Form("傳真"))
   BYear = Request.Form("年")
   BMonth = Request.Form("月")
   BDay = Request.Form("日")
   Email = Request.Form("電子信箱")
   News = Request.Form("電子報")
%>

<%
  '檢驗兩次密碼輸入是否相同
   If Password <> RePassword Then
      Response.Redirect "../Msg.asp?Msg=6"   '密碼兩次輸入不相同,帶參數6
   End If
%>

<%
  '限制帳號及密碼不可超過十碼
   If Len(LoginID) > 10 or Len(Password) > 10 Then
     Response.Redirect "../Msg.asp?Msg=3"   '帳號或密碼超過十碼,帶參數3
   End If
%>

<%
  '限制帳號及密碼不可輸入特殊字元
   If ASC(LoginID) < 48 or ASC(LoginID) > 57 and ASC(LoginID) < 65 or ASC(LoginID) > 90 and ASC(LoginID) < 97 or ASC(LoginID) > 122 Then
     Response.Redirect "../Msg.asp?Msg=4"  '帳號不可使用特殊字元,帶參數4
   End If

   If ASC(Password) < 48 or ASC(Password) > 57 and ASC(Password) < 65 or ASC(Password) > 90 and ASC(Password) < 97 or ASC(Password) > 122 Then
     Response.Redirect "../Msg.asp?Msg=5"  '密碼不可使用特殊字元,帶參數5
   End If
%>

<%
  '先判斷身份證號後九碼是否為數字
    For i = 2 to Len(ID)
      IF ASC(MID(ID,i,1)) < 47 or ASC(MID(ID,i,1)) > 58 Then
        Response.Redirect "../Msg.asp?Msg=7"  '身份證號後九碼非數字,帶參數7
      End If
    Next
%>

<%
  '限制住家電話、公司電話、分機、行動電話、傳真僅可輸入數字
  If ASC(HomeTel) < 48 or ASC(HomeTel) > 57 and ASC(OfficeTel) < 48 or ASC(OfficeTel) > 57 and ASC(Extension) < 48 or ASC(Extension) > 57 and ASC(MPhone) < 48 or ASC(MPhone) > 57 and ASC(Fax) < 48 or ASC(FAx) > 57 Then
    Response.Redirect "../Msg.asp?Msg=15"  '住家電話、公司電話、分機、行動電話、傳真輸入非數字,帶參數15
  End If
%>

<%
  '身份證號在有輸入時才作檢驗,若沒有輸入就直接跳離開這個迴圈
  If ID <> empty Then
    If Len(ID) = 10 Then
      If ID = "A123456789" Then
        Response.Redirect "../Msg.asp?Msg=8"  'A123456789不合法,帶參數8
      ElseIf ASC(Left(ID,1)) < 64 or ASC(Left(ID,1)) > 91 Then
        Response.Redirect "../Msg.asp?Msg=9"  '第一碼非英文字母,帶參數9
      ElseIf MID(ID,2,1) <> "1" and MID(ID,2,1) <> "2" Then
        Response.Redirect "../Msg.asp?Msg=10"  '第二碼非數字1或2,帶參數10
      Else
        ID_ABC_Data ="A10B11C12D13E14F15G16H17I34J18K19L20M21N22O35P23Q24R25S26T27U28V29W32X30Y31Z33" 
        CheckID = MID(ID_ABC_Data,InStr(ID_ABC_Data,Left(ID,1)) + 1,2) & MID(ID,2)
        GetNo = 2
          SUM = Left(CheckID,1)
          For i = 9 to 1 step - 1
            SUM = SUM + MID(CheckID,GetNo,1) * i
            GetNo = GetNo + 1
          Next
          If ASC(Right(CheckID,1)) <> ASC(Right(10 - Right(SUM,1),1)) Then
            Response.Redirect "../Msg.asp?Msg=11"  '身份證號不合法,帶參數11
          End If
      End If
    Else
      Response.Redirect "../Msg.asp?Msg=12"  '身份證號不是十碼,帶參數12
    End If
  Else
    ID = empty
  End If
%>

<%
  Application.lock

    '資料庫連結
     set objConn = Server.CreateObject("ADODB.Connection")  '建立ODBC
     Provider = "Provider = Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database Password=;"  '撰擇對應的驅動程式及輸入密碼
     DBPath = "Data Source=" & Server.MapPath("../WebDB/Member.mdb")  '指定資料庫路徑
     objConn.Open Provider & DBPath  '開啟資料庫
     Set objRecord = Server.CreateObject("ADODB.Recordset")
     objRecord.Open "Member", objConn, 3, 3

       objRecord.AddNew
         objRecord("LoginID") = LoginID
         objRecord("Password") = Password
         objRecord("Name") = Name
         objRecord("Sex") = Sex
         objRecord("ID") = ID
         objRecord("Address") = Address
         objRecord("HomeTel") = HomeTel
         objRecord("OfficeTel") = OfficeTel
         objRecord("Extension") = Extension
         objRecord("MPhone") = MPhone
         objRecord("Fax") = Fax
         objRecord("BYear") = BYear
         objRecord("BMonth") = BMonth
         objRecord("BDay") = BDay
         objRecord("Email") = Email
         objRecord("News") = News
         objRecord("RegistTime") = Now
       objRecord.UpDate
       
       Response.Redirect "../../Msg.asp?Msg=14"  '加入會員成功,帶參數14
              
  Application.Unlock
%>

本篇文章發表於2002-05-17 18:25
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
小建議
判斷是否為數字型態的資料
可以用IsNumeric()
來做判斷

本篇文章回覆於2002-05-17 18:56
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

deepdark
檢舉此回應
嗯......謝謝版工......這裡我改了.....還有別的地方要改嗎......

PS:新的程式碼...等我改到沒地方需要改時...再丟出來給大家參考....所有大家再給點意見吧
本篇文章回覆於2002-05-17 19:06
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

darkmousy
檢舉此回應
有些判斷東西利用java script或vb script會減輕server的負擔....
會大大的減輕..............
本篇文章回覆於2002-05-17 20:12
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

sabcat
檢舉此回應
關於darkmousy所說並不是不正確
但是請留意一下這個程式的主要目的~是在防止隱碼攻擊的手法
因此個人認為這些還是在server端執行會比較好
畢竟寫成javascript的話..有經驗的使用者只需要另存新檔
再把驗證的部份去掉...改一下url~填資料..submit~
ok~驗証破功了...那寫這段驗證就等於白寫了不是嗎?
所以個人覺得這個還是在server端做會比較好^^~(個人意見)
本篇文章回覆於2002-05-17 20:23
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
作者回應

deepdark
檢舉此回應
謝謝版工,darkmousy,sabcat的意見....
那再請問大家,如果這樣可以防止攻擊了的話,
除了這些還有什麼地方要改進的嗎.....例如執行速度之類的....


其實我寫這個程式的意義是在於經由大家的討論,我可以明白的知道,我到底要防些什麼
因為我才剛學ASP,只知道怎麼把程式run出來,不過有關防黑的技術,是一點也不懂...
所以我希望經由討論讓自己以後在寫程式時,可以把這些觀念帶入...
而且寫一個範本出來放在站上,也讓一些像我一樣的新手,知道寫ASP時該怎麼去防止資料外流...

所以....還請大家多多幫忙啦....3Q~~
本篇文章回覆於2002-05-18 11:13
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
回應

依藍米亞
檢舉此回應
<那再請問大家,如果這樣可以防止攻擊了的話,
<除了這些還有什麼地方要改進的嗎.....例如執行速度之類的....
這只是在防止[寫入]攻擊罷了!
並不代表主機可以永遠平安。

>
另外,還可以加上偵測是否是從指定表格頁進來存檔的,
否則停止處理。
本篇文章回覆於2002-05-18 14:09
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
作者回應

deepdark
檢舉此回應

這只是在防止[寫入]攻擊罷了!
^^^^^^^^^^^^^^^^
這句話的意思是說讀出還是有可能被攻擊囉,可是我的讀出欄位
如果也限制不可超過十碼及不可用特殊字元,這樣是不是寫入及讀出都OK了哩

並不代表主機可以永遠平安。
^^^^^^^^^^^^^^^
我是指光因ASP語法的部份,當然如果是系統漏洞要另外補囉...這樣沒錯吧...

另外,還可以加上偵測是否是從指定表格頁進來存檔的,否則停止處理。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
這個不會也...可不可以教一下...寫給簡單範本來參考一下吧
本篇文章回覆於2002-05-18 16:37
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.