台灣最大程式設計社群網站
線上人數
7464
 
會員總數:246136
討論主題:189720
歡迎您免費加入會員
討論區列表 >> ASP >> 被告知此網頁有SQL Injection問題!
[]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
被告知此網頁有SQL Injection問題!
價值 : 400 QP  點閱數:2208 回應數:18
樓主

小實
初學者
2 43
740 122
發送站內信

被告知此網頁有SQL Injection問題,但小弟實在不知道怎麼改~
此頁只有段程式碼~是否可以請大大!救救一下!
謝謝~感謝!!


搜尋相關Tags的文章: [ ASP ] , [ SQL Injection ] ,
本篇文章發表於2016-05-13 09:53
1樓
回應

彩虹
檢舉此回應
第6行的Request.QueryString("id")這邊
你需要加上
1.判斷是否為數字
2.是否含有特殊字元(例如單引號,雙引號...等)

基本上因為id是數字,第1點做好就可以
做法判斷是否為數字網路上找一下就有
本篇文章回覆於2016-05-13 10:47
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
回應

彩虹
檢舉此回應
如果不是數字
你就把頁面跳轉到首頁或者在畫面顯示「資料有誤,請重新選擇」

本篇文章回覆於2016-05-13 11:48
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

彩虹
檢舉此回應
以這個為主,剛剛忘記帶入CheckID
本篇文章回覆於2016-05-13 11:49
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

小實
檢舉此回應
所以大大~我只要改成您的~就沒問題了嗎?
本篇文章回覆於2016-05-13 12:35
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
回應

小實
檢舉此回應
謝謝大大~
本篇文章回覆於2016-05-13 12:37
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
回應

彩虹
檢舉此回應
恩,你改好之後再掃描看看,我上面提供的是基本的判斷是否為數字

不過我相信你很多頁面都會有這種問題~
這麼說好了,任何你用request.form()或request.QueryString()接收的地方
如果你沒有進行判斷或排除特殊字元,就會被Sql injection,甚至頁面會被進行跳轉

如果你要更深入了解Sql injection,可以上網找到許多相關資料



本篇文章回覆於2016-05-13 13:30
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
回應

MIS2000 Lab
檢舉此回應
SQL Injection有很多種攻擊型態
要阻擋與驗證的關鍵字很多,您可以上網找一下

例如:
單引號 '
SQL指令的註解符號 --
分號 ;

太多了,講不完 :-)

ASP.NET有提供「參數」的寫法,防範起來,省力些
https://dotblogs.com.tw/mis2000lab/2015/11/26/adonet_parameter_sql_injection_20151126

也要透過資料庫的權限設定,不要給程式的連結字串(Connection String)太高的使用權限...等等

不嫌棄的話,可以參閱這本書的這些章節 -- ASP.NET專題實務II:範例應用與進階功能
http://www.books.com.tw/products/0010705908
本篇文章回覆於2016-05-14 09:57
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
回應

topcat
捐贈 VP 給 topcat 檢舉此回應
用檢查替換字元的方式,並無法完全杜絕SQL Injection的問題

樓主的問題是用ADO的Recordset
建議兩個方向去處理
1.使用SQL Stored Procedure,並透過Parameter的方式來傳遞參數
2.使用Parameter的方式
ADO + Access
請參考這篇
http://dqno1.org/dqno1discuz/thread-3267-1-1.html

^_^
本篇文章回覆於2016-05-14 17:07
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
回應

topcat
捐贈 VP 給 topcat 檢舉此回應
不好意思~
因為#6並沒有真正解掉SQLInjection,所以我重設的狀態
請樓主確認一下#8所提到的兩種方式

^_^
本篇文章回覆於2016-05-14 22:32
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
回應

Bill
檢舉此回應
原來 ASP 的問題, 可以用 ASP.NET 解, 我真是開了眼界. (你應該建議他整個專案翻掉重寫啊)
本篇文章回覆於2016-05-14 23:50
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
回應

彩虹
檢舉此回應
不好意思~

一、「這是我第一次知道原來討論區版主對於「已結案」有「重設狀態」的能力」 (於8樓回覆後隔了5小時之後)

小舖規則說明是:
注意:當您決定接受解答並分配點數後,分配點數的機會只有一次,請三思,並善盡責任。

現在代表著可以有很多次了,對吧?

二、「請樓主確認一下#8所提到的兩種方式」 (你的回復)
這樣子的舉動,是否是「間接」設定自己為「最佳解答」
====================================================================

「用檢查替換字元的方式,並無法完全杜絕SQL Injection的問題」
1.你的意思是是不是要打趴所有網路上所有提供基本解決的方式
2.只要有人問SQL Injection的問題,一律只能用Parameter的方式
3.「檢查替換字元無法杜絕」我不太同意,但你可以說這樣的方式比較不好,因為可能會漏掉判斷,或者會讓程式碼更繁雜

「因為#6並沒有真正解掉SQLInjection,所以我重設的狀態」
我希望#topcat版主,可以提供IsNumeric()的範例
IsNumeric("1 or 1=1"),要如何通過測試,回傳為true

PS:
要排除的sql injection的方式有好幾種
1.我認為初學者至少要學會基本的排除方式,懂原理,後續再來了解如何透過參數來防止
(很多人甚至連什麼是Sql Injection都不知道)

2.也許你會說我的方式只是針對數字,如果是where name='xxx'呢? (這當然要改用正則)
可以寫兩個function來套用,如















本篇文章回覆於2016-05-15 10:04
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
12樓
回應

topcat
捐贈 VP 給 topcat 檢舉此回應
#11

不好意思,彩虹大

討論區討論問題,除了要解決樓主的提問
也希望,遇到類似問題的其他網友,再看到這一篇的時候,能夠從討論上標註的最佳解答,得到一個較為好的概念或方向


3.「檢查替換字元無法杜絕」我不太同意,但你可以說這樣的方式比較不好,因為可能會漏掉判斷,或者會讓程式碼更繁雜


如果小喵的言語中有不妥的地方讓您不舒服,小喵很抱歉,向您說Sorry

但,就誠如您所說,這樣的方式的確有不容易完整的狀況~
如果有相對更好的方式,是否要讓樓主,甚至後續看到這篇的讀者,能夠知道、理解
以免後續的人、或者樓主,問題解了一半,又留了一半的問題後續出狀況了才來解

這樣子的舉動,是否是「間接」設定自己為「最佳解答」


小喵希望樓主可以不要因為是誰提出的,或者因為受了誰的導引,而設定為最佳解答

要設定為最佳解答,希望是依據提出的方式方法,可以真正解決問題,而且是相對比較不會有缺漏的狀況,才來設定
如果那個提出的方式,還要更多處理才能完整的話,希望先不要設定,或許可以等補充完整了,確定沒問題了再來設定。

^_^

其實,小舖的點數不能拿來做啥
最後,不設定小喵提出的為最佳解答也沒關係

小喵身為版主,很不好意思的是,asp這邊小喵已經比較少來,較多的是在asp.net版
剛好在別的地方看到有人在討論這篇,討論中有提到似乎會給其他人後續看到的人一些誤解的可能

小喵既然有這機緣看到別人在討論,而小喵又之前有申請過版主
就順著這機緣,希望能夠給樓主、或者未來有機緣可以看到這篇的朋友們,可以看看另外的方向或解法

真的,不必給小喵為最佳解答~OK的~
只是單純的希望,網友在遇到相同的問題時,思考一下,什麼樣的方式是對他們來說相對較好的
只是這樣而已

造成彩虹大的不舒服的地方,小喵再次的道歉~
希望我們專注在問題上,一起討論出對於問題相對較好的一個解決方式
^_^
本篇文章回覆於2016-05-15 12:50
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
13樓
回應

彩虹
檢舉此回應
TO 小喵:
我能了解你的意思
但我想你也知道我要得並不是點數,強調的也不是最佳解答的問題,而是權益的問題。

1.已結案的文章,後續一樣可以透過留言來討論、互相切磋吧,而重設狀態的舉動,是否會有點讓人不舒服、不尊重的感覺
2.「尚未事先詢問告知」,如果有使用站內信先通知我,我會接受,我也很樂意自行進行補充

最後也謝謝小喵幫忙補充Parameter的方式

我相信還有很多篇有這種問題需要處理
1.該結案但未結案
2.不合適/不對的方式,成為最佳解答
本篇文章回覆於2016-05-15 14:42
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
14樓
最有價值解答

彩虹
檢舉此回應
首先先謝謝 topcat 小喵
當我再回去看我所提供的方式,覺得粗糙許多
一開始只是想說提供比較簡單的方式給作者,因為第6行部分「id=" & Request.QueryString("id")」
只要判斷「Request.QueryString("id")」是否為「數值」即可,就不需要對原本的程式碼做太多變化,對發文者來說也會比較好懂

但問題來了,如果未來有網友遇到相同的問題,看到了最佳解答後,反而會接續採這樣「粗糙」的方式來處理

在此要再次感謝topcat小喵將方向導正回來,提出解決Sql Injection最合適的方式

我這邊再做一些補充
SQL攻擊(SQL injection),簡稱隱碼攻擊 (wiki資料)
https://zh.wikipedia.org/wiki/SQL%E8%B3%87%E6%96%99%E9%9A%B1%E7%A2%BC%E6%94%BB%E6%93%8A

SQL Injection (w3schools)
http://www.w3schools.com/sql/sql_injection.asp

簡單來說,假設有一個member資料表,裡面有id、name、account、password四個欄位
你後續做了一個帳密登入介面
login.asp


loginCheck.asp
如果你直接採用透過組字串的方式,是不安全的


如果當使用者輸入
「account」的值為:「' or 'A'='A」
「password」的值為:「BBB」

此時帶入到Sql語句時,會變成
select * from member where account='' or 'A'='A' and password='BBB'
最後再去執行query後,發現竟然可以成功登入,因為語句被注入了多餘的「' or 'A'='A」
所以不管你後面有多少and條件,都相當於「select * from memberTable」,因為or 'A'='A'已經打壞了條件,會撈出所有資料

如果對方知道你的table名稱,甚至可以直接「drop table member」

為了避免Sql Injection,最佳的方式就是透過Parameter的方式來傳遞
topcat 小喵版主提供的範例網址
http://dqno1.org/dqno1discuz/thread-3267-1-1.html

Classic ASP SQL injection prevention by using query parameter
https://vikaskanani.wordpress.com/2012/05/07/classic-asp-sql-injection-prevention-by-using-query-parameter/

使用方式如下(片段):



要更了解ADO Parameter請查看這邊
ADO Parameter Object
http://www.w3schools.com/asp/ado_ref_parameter.asp
本篇文章回覆於2016-05-16 22:05
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
15樓
回應

純真的人
捐贈 VP 給 純真的人 檢舉此回應
路過...

其實他會被提出SQL Injection警告~

是因為被測試到該頁顯示錯誤頁(404)的顯示~

如果怕被提醒~可以用錯誤頁自動轉址提示~
本篇文章回覆於2016-05-17 08:03
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   

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