跟蹤資料 作為一個有安全意識的開發人員,最重要的一件事就是隨時跟蹤資料。不只是要知道它是什麼和它在哪裡,還要知道它從哪裡來,要到哪裡去。有時候要做到這些是困難的,特別是當你對WEB的運做原理沒有深入理解時。這也就是為什麼儘管有些開發人員在其它開發環境中很有經驗,但他對WEB不是很有經驗時,經常會犯錯並製造安全性漏洞。
表單與資料 在典型的PHP應用開發中,大多數的邏輯涉及資料處理任務,例如確認使用者是否成功登入,在購物車中加入商品及處理信用卡交易。 資料可能有無數的來源,做為一個有安全意識的開發人員,你需要簡單可靠地區分兩類資料: l 已過濾資料l 被汙染資料 所有你自己設定的資料可信資料,可以認為是已過濾資料。一個你自己設定的資料是任何的寫入程式碼資料,例如下面的email地址資料: $email =
語義URL攻擊
檔案上傳攻擊 有時在除了標準的表單資料外,你還需要讓使用者進行檔案上傳。由於檔案在表單中傳送時與其它的表單資料不同,你必須指定一個特別的編碼方式multipart/form-data:CODE: <form action="upload.php"
跨站請求偽造 跨站請求偽造(CSRF)是一種允許攻擊者通過受害者發送任意HTTP請求的一類攻擊方法。此處所指的受害者是一個不知情的同謀,所有的偽造請求都由他發起,而不是攻擊者。這樣,很你就很難確定哪些請求是屬於跨站請求偽造攻擊。事實上,如果沒有對跨站請求偽造攻擊進行特意防範的話,你的應用很有可能是有漏洞的。 請看下面一個簡單的應用,它允許使用者購買鋼筆或鉛筆。介面上包含下面的表單:CODE: <form action="buy.php"
欺騙表單提交 製造一個欺騙表單幾乎與假造一個URL一樣簡單。畢竟,表單的提交只是瀏覽器發出的一個HTTP請求而已。請求的部分格式取決於表單,某些請求中的資料來自於使用者。 大多數表單用一個相對URL地址來指定action屬性: <form action="process.php"method="POST"> 當表單提交時,瀏覽器會請求action中指定的URL,同時它使用當前的URL地址來定位相對URL。例如,如果之前的表單是對http:
SQL 注入 SQL注入是PHP應用中最常見的漏洞之一。事實上令人驚奇的是,開發人員要同時犯兩個錯誤才會引發一個SQL注入漏洞,一個是沒有對輸入的資料進行過濾(過濾輸入),還有一個是沒有對發送到資料庫的資料進行轉義(轉義輸出)。這兩個重要的步驟缺一不可,需要同時加以特別關注以減少程式錯誤。 對於攻擊者來說,進行SQL注入攻擊需要思考和實驗,對資料庫方案進行有根有據的推理非常有必要(當然假設攻擊者看不到你的來源程式和資料庫方案),考慮以下簡單的登入表單:CODE: <form
這篇文章主要介紹了PHP進程通訊基礎知識中的訊號量與共用記憶體通訊的相關資料,有需要的小夥伴可以查看下由於進程之間誰先執行並不確定,這取決於核心的進程調度演算法,其中比較複雜。由此有可能多進程在相同的時間內同時訪問共用記憶體,從而造成不可預料的錯誤。訊號量這個名字起的令人莫名其妙,但是看其英文原意,就十分容易理解。 semaphore 英[ˈseməfɔ:(r)] vt. 發出訊號,打旗語; 類似於指揮官的作用。 下面我們看下一個虛擬碼訊號量的使用。1、建立訊號量唯一識別碼$ftok =
工作階段劫持 最常見的針對會話的攻擊手段是工作階段劫持。它是所有攻擊者可以用來訪問其它人的會話的手段的總稱。所有這些手段的第一步都是取得一個合法的會話標識來偽裝成合法使用者,因此保證會話標識不被泄露非常重要。前面幾節中關於會話暴露和固定的知識能協助你保證會話標識只有伺服器及合法使用者才能知道。
php 匯出CSV抽象類別,根據總記錄數與每批次記錄數,計算總批次,迴圈匯出。避免記憶體不足的問題。ExportCSV.class.php<?php/** php Export CSV abstract class,根據總記錄數與每批次記錄數,計算總批次,迴圈匯出。* Date: 2014-05-16* Author: fdipzone* Ver: 1.0** Func:* public setPageSize 設定每批次匯出的記錄條數*
後門URL 後門URL是指雖然無需直接調用的資源能直接通過URL訪問。例如,下面WEB應用可能向登入使用者顯示敏感資訊: <?php $authenticated = FALSE; $authenticated = check_auth(); /* ... */ if ($authenticated) { include './sensitive.php'; } ?>
檔案名稱操縱 在很多情形下會使用動態包含,此時目錄名或檔案名稱中的部分會儲存在一個變數中。例如,你可以緩衝你的部分動態網頁來降低你的資料庫伺服器的負擔。 <?php include "/cache/{$_GET['username']}.html"; ?>
檔案系統跨越 無論你用什麼方法使用檔案,你都要在某個地方指定檔案名稱。在很多情況下,檔案名稱會作為fopen()函數的一個參數,同時其它函數會調用它返回的控制代碼:<?php $handle = fopen('/path/to/myfile.txt', 'r'); ?> 當你把被汙染資料作為檔案名稱的一部分時,漏洞就產生了: <?php $handle
重播攻擊 重播攻擊,有時稱為示範攻擊,即攻擊者重現以前合法使用者向伺服器所發送的資料以擷取訪問權或其它分配給該使用者的許可權。 與密碼嗅探一樣,防止重播攻擊也需要你意識到資料的暴露。為防止重播攻擊,你需要加大攻擊者擷取任何用於取得受限資源的存取權限的資料的難度。這主要要求做到避免以下做法: 設定受保護資源永久訪問權的資料的使用;設定受保護資源訪問權的資料的暴露(甚至是只提供臨時訪問權的資料);
源碼暴露 你的WEB伺服器必須要能夠讀取你的源確並執行它,這就意味著任意人所寫的代碼被伺服器運行時,它同樣可以讀取你的源碼。在一個共用主機上,最大的風險是由於WEB伺服器是共用的,因此其它開發人員所寫的PHP代碼可以讀取任意檔案。 <?php header('Content-Type: text/plain'); readfile($_GET['file']); ?>
檔案系統瀏覽 除了能在共用伺服器上讀取任意檔案之外,攻擊者還能建立一個可以瀏覽檔案系統的指令碼。由於你的大多數敏感檔案不會儲存在網站主目錄下,此類指令碼一般用於找到你的源檔案的所在位置。請看下例: <pre> <?php if (isset($_GET['dir'])) { ls($_GET['dir']); } elseif (isset($_GET['file'])) { cat($_GET[
加密 作為一本相關安全方面的書,通常加密是需要提及的話題。我之所以在本書的主體部分忽略了加密問題,是因為它的用途是狹窄的,而開發人員應從大處著眼來考慮安全問題。過分依賴於加密常常會混淆問題的根源。儘管加密本身是有效,但是進行加密並不會神奇地提高一個應用的安全性。 一個PHP開發人員應主要熟悉以下的加密方式: l 對稱式加密l 非對稱式加密(公開金鑰)l Hash函數(資訊摘要)l 資訊驗證碼
CSSUpdate.class.php<?php/** css 更新類,更新css檔案內圖片的版本*Date: 2013-02-05*Author: fdipzone*Ver:1.1**Func:*update();** Ver: 1.1 增加search_child參數,可遍曆子檔案夾*/class CSSUpdate{ private $csstmpl_path = null; private $css_path = null; private
php 支援斷點續傳,主要依靠HTTP協議中 header HTTP_RANGE實現。HTTP斷點續傳原理Http頭 Range、Content-Range()HTTP頭中一般斷點下載時才用到Range和Content-Range實體頭,Range使用者要求標頭中,指定第一個位元組的位置和最後一個位元組的位置,如(Range:200-300)Content-Range用於回應標頭請求下載整個檔案: GET /test.rar HTTP/1.1 Connection: close Host: 11
FindFile.class.php用於遍曆目錄檔案<?php/** 遍曆檔案夾及檔案類* Date: 2013-03-21* Author: fdipzone* Ver: 1.0*/class FindFile{ public $files = array(); // 儲存遍曆的檔案 protected $maxdepth; // 搜尋深度,0表示沒有限制 /* 遍曆檔案及檔案夾 * @param String