安全指令碼程式的編寫 V1.0(2)

來源:互聯網
上載者:User
安全|程式|指令碼 2.2 cookie的問題
2.2.1 概念介紹
按照Netscape官方文檔中的定義,Cookie是在HTTP協議下,伺服器或指令碼可以維護客戶工作站上資訊的一種方式。Cookie是由Web伺服器保
存在使用者瀏覽器上的小廣西檔案,它可以包含有關使用者的資訊(如身份識別號碼、密碼、使用者在Web網站購物的方式或使用者訪問該網站的次數)
。無論何時使用者連結到伺服器,Web網站都可以訪問Cookie資訊。

通俗地講,瀏覽器用一個或多個限定的檔案來支援Cookie。這些檔案在使用Windows作業系統的機器上叫做Cookie檔案,在Macintosh機器上
叫做magic Cookie 檔案,這些檔案被網站用來在上面儲存Cookie資料。網站可以在這些Cookie檔案中插入資訊,這樣對有些網路使用者就有些
副作用。有些使用者認為這造成了對個人隱私的侵犯,更糟的是,有些人認為Cookie是對個人空間的侵佔,而且會對使用者的電腦帶來安全性的危
害。

目前有些Cookie是臨時的,另一些則是持續的。臨時的Cookie只在瀏覽器上儲存一段規定的時間,一旦超過規定的時間該Cookie就會被系統清
除。例如在PHP中Cookie被用來跟蹤使用者進程直到使用者離開網站。持續的Cookie則儲存在使用者的Cookie檔案中,下一次使用者返回時,仍然可以
對它進行調用。

要瞭解Cookie,必不可少地要知道它的工作原理。一般來說,Cookie通過HTTP Headers從伺服器端返回到瀏覽器上。首先,伺服器端在響應
中利用Set-Cookie header來建立一個Cookie,然後,瀏覽器在它的請求中通過Cookie header包含這個已經建立的Cookie,並且反它返回
至伺服器,從而完成瀏覽器的論證。 例如,我們建立了一個名字為login的Cookie來包含訪問者的資訊,建立Cookie時,伺服器端的Header如
下面所示,這裡假設訪問者的註冊名是"Michael Jordan",同時還對所建立的Cookie的屬性如path、domain、expires等進行了指定。

Set-Cookie:login=Michael Jordan;path=/;domain=msn.com;
expires=Monday,01-Mar-99 00:00:01 GMT

上面這個Header會自動在瀏覽器端電腦的Cookie檔案中添加一條記錄。瀏覽器將變數名為"login"的Cookie賦值為"Michael Jordon"。注意
,在實際傳遞過程中這個Cookie的值是經過了URLEncode方法的URL編碼操作的。

這個含有Cookie值的HTTP Header被儲存到瀏覽器的Cookie檔案後,Header就通知瀏覽器將Cookie通過請求以忽略路徑的方式返回到伺服器
,完成瀏覽器的認證操作。

此外,我們使用了Cookie的一些屬性來限定該Cookie的使用。例如Domain屬效能夠在瀏覽器端對Cookie發送進行限定,具體到上面的例子,
該Cookie只能傳達室到指定的伺服器上,而決不會跑到其他的如www.hp.com的Web網站上去。Expires屬性則指定了該Cookie儲存的時間期
限,例如上面的Cookie在瀏覽器上只儲存到1999年3月1日1秒。當然,如果瀏覽器上Cookie太多,超過了系統所允許的範圍,瀏覽器將自動對
它進行刪除。至於屬性Path,用來指定Cookie將被發送到伺服器的哪一個目錄路徑下。

說明:瀏覽器建立了一個Cookie後,對於每一個針對該網站的請求,都會在Header中帶著這個Cookie;不過,對於其他網站的請求Cookie是
絕對不會跟著發送的。而且瀏覽器會這樣一直發送,直到Cookie到期為止。

2.2.2 要點方法
setcookie-----送出 Cookie 資訊到瀏覽器。
文法: int setcookie(string name, string value, int expire, string path, string domain, int secure);
傳回值: 整數
本函數會跟著標識 Header 送出一段小資訊字串到瀏覽器。使用本函數要在送出 HTML 資料前,實際上 cookie 也算標識的一部份。本函數的
參數除了第一個 name 之外,都是可以省略的。參數 name 表示 cookie 的名稱;value 表示這個 cookie 的值,這個參數為空白字串則表示取
消瀏覽器中該 cookie 的資料;expire 表示該 cookie 的有效時間;path 為該 cookie 的相關路徑;domain 表示 cookie 的網站;secure 則
需在 https 的安全傳輸時才有效。想得到更多的 cookie 資訊可以到 http://www.netscape.com/newsref/std/cookie_spec.html,由
cookie 原創者 Netscape 所提供的完整資訊。

對於一個網站會員而言,經常存在需要一次註冊,多次認證的問題,例如我們經常接觸到的論壇、社區等,一般採用手段為cookie或 input
type=hidden來傳遞認證參數。這裡面有幾點隱患:

I. setcookie內容必須完整包含帳號密碼,或類似的完整安全資訊,如果只攜帶帳號資訊或用某種許可權標誌來認證,極容易造成非法入侵。
例如某網站中的會員更新頁面中攜帶的認證資訊是兩個,使用者名稱和Uid(均為明文傳送)已知Uid對於每個會員是唯一的。由於我們只需要知道對
方的帳號和Uid就可以更改對方資訊(不需要知道密碼!),只要攻擊者知道Uid(攻擊者可以通過暴力猜測的方法來得到Uid,有時候網站本身
也會泄露使用者的Uid,例如在論壇等處)那麼,攻擊者就可以通過遍曆攻擊完成對任意一個帳號的資訊更改。

II. 必須所有需要許可權操作的頁面都必須執行認證判斷的操作。如果任何一頁沒有進行這種認證判斷,都有可能給攻擊者以惡意入侵的機會。

III. 很多網站為了方便,將使用者名稱以及口令資訊儲存在Cookie中,有的甚至以明文方式儲存口令。如果攻擊者可以訪問到使用者的主機,就可能
通過儲存的Cookie檔案得到使用者名稱和口令。

3. 指令碼保護的問題
3.1 概念介紹
在程式編寫時優秀的程式員都會知道,用有意義的變數名,檔案名稱有助於增加程式的可讀性,具有良好的程式風格。這個非常好但在指令碼語言不太
適合,為了不讓惡意使用者猜到你的變數或資料庫名等資訊,必須改掉這些資訊。動態網頁在伺服器端執行後返回給客戶的是執行後的代碼,這可
以保護伺服器端的很多不想叫或不能叫瀏覽者知道的資訊。安全是相對的,每天都在有新的安全性漏洞被發現,如果惡意的使用者在你之前知道了一個
可以看你的指令碼原始碼的漏洞或這個漏洞一時間無法修補怎麼辦?
3.2 主意要點
建議用一些比較怪異的名字命名,刪掉指令碼中的注釋。如果還需要保持程式的可讀性的話,可以建立一個映射,你可以寫個具有良好風格的指令碼程
序,然後再做一個變數名映射建立一個具有較安全命名方法的指令碼,去掉這個指令碼中的注視和所有能去掉的資訊,修改時作個同步就可以了
我們可以在程式的使用前對程式進行加密,以保護我們自己的程式再萬一的情況下部被泄漏。
3.3 保護方法

我看到過很多的對指令碼的加密方法,都很不錯,有的是專門的加密軟體,有的是通過一些技巧加上利用語言的特性進行加密的,例如隨機產生一個
密匙,把密匙放在"不可見的"地方,通過一些演算法對指令碼進行加解密,就是由於某些系統漏洞導致你的指令碼原始碼泄漏,也無濟於事。

4 .執行個體說明
下面這個例子是在網上經常被提到的,這是個非常經典的例子,所以在這裡通過這個執行個體告訴大家可能存在的危險。
問題描述:
  大部分網站把密碼放到資料庫中,在登陸驗證中用以下sql,(以asp為例)
sql="select * from user where username='"&username&"'and pass='"& pass &'"
  此時,您只要根據sql構造一個特殊的使用者名稱和密碼,如:ben' or '1'='1
就可以進入本來你沒有特權的頁面。再來看看上面那個語句吧:
sql="select * from user where username='"&username&"'and pass='"& pass&'"
  此時,您只要根據sql構造一個特殊的使用者名稱和密碼,如:ben' or '1'='1 這樣,程式將會變成這樣: sql="select*from username where
username="&ben'or'1'=1&"and pass="&pass&" or 是一個邏輯運算子,作用是在判斷兩個條件的時候,只要其中一個條件成立,那麼等式
將會成立.而在語言中,是以1來代表真的(成立).那麼在這行語句中,原語句的"and"驗證將不再繼續,而因為"1=1"和"or"令語句返回為真值.。

  另外我們也可以構造以下的使用者名稱:
username='aa' or username<>'aa'
pass='aa' or pass<>'aa'
  相應的在瀏覽器端的使用者名稱框內寫入:aa' or username<>'aa 口令框內寫入:aa' or pass<>'aa,注意這兩個字串兩頭是沒有'的。這
樣就可以成功的騙過系統而進入。

具體實施是這樣的,首先我會到註冊的地方去收集資訊,瞭解儘可能多的資訊,例如目標資料庫中都有使用者的什麼樣的資訊,隨便的填寫資訊然後
提交,當你要註冊的使用者名稱被註冊的是有系統會提示你已被註冊,有的網站做的更好的,就是他們



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

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

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