檔案系統跨越
無論你用什麼方法使用文件,你都要在某個地方指定文件名。在許多情況下,檔案名稱會作為fopen()函數的一個參數,同時其它函數會呼叫它所傳回的句柄:
<?php $handle = fopen('/path/to/myfile.txt', 'r'); ?>
當你把被污染資料當作檔案名稱的一部分時,漏洞就產生了:
<?php $handle = fopen("/path/to/{$_GET['filename']}.txt", 'r'); ?>
由於在本例中路徑和檔案名稱的前後兩部分無法由攻擊者所操縱,攻擊的可能性受到了限制。可是,需要緊記的是有些攻擊會使用NULL(在URL中表示為%00)來使字串終止,這樣就能繞過任何檔案副檔名的限制。在這種情況下,最危險的攻擊手段是透過使用多個../來方問上級目錄,以達到檔案系統跨越的目的。例如,想像一下filename的值被指定如下:
http://www.php.cn/ ... nother/path/to/file
與許多攻擊的情況相同,在構造一個字符串時如果使用了被污染數據,就會給攻擊者以機會來更改這個字符串,這樣就會造成你的應用以你不希望方式運行。如果你養成了只使用已過濾資料來建立動態字串的習慣,就可以防止許多類型包括許多你不熟悉的漏洞的出現。
由於fopen()所呼叫的檔案名稱前導的靜態部分是/path/to,所以上面的攻擊中向上跨越目錄的次數比所需的更多。因為攻擊者在發動攻擊前無法察看原始碼,所以典型的策略是過多次重複../字符串。 ../字符串使用太多次並不會破壞上面的攻擊效果,所以攻擊者沒有必要猜測目錄的深度。
在上面的攻擊中使fopen()調用以你不希望方式運行,它簡化後等價於:
<?php $handle = fopen('/another/path/to/file.txt', 'r'); ?>
在意識到這個問題或遭遇攻擊後,許多開發者都會犯下試圖糾正潛在的惡意資料的錯誤,有時根本不會先對資料進行檢查。如第一章所述,最好的方法把過濾看成檢查過程,同時迫使使用者遵守你所製定的規則。例如,如果合法的檔案名稱只包含字母,則下面的程式碼能加強這個限制:
<?php $clean = array(); if (ctype_alpha($_GET['filename'])) { $clean['filename'] = $_GET['filename']; } else { /* ... */ } $handle = fopen("/path/to/{$clean['filename']}.txt", 'r'); ?>
並沒有必要對filename值進行轉義,這是因為這些資料只用在PHP函數而不會傳送到遠端系統。
basename( )函數在檢查是否有不必要的路徑時非常有用:
<?php $clean = array(); if (basename($_GET['filename']) == $_GET['filename']) { $clean['filename'] = $_GET['filename']; } else { /* ... */ } $handle = fopen("/path/to/{$clean['filename']}.txt", 'r'); ?>
這個流程比只允許檔案名稱是字母的安全性要差了一些,但你不太可能要求那麼嚴格。比較好的深度防範流程是綜合上面的兩種方法,特別是你在用正規表示式檢查程式碼合法性時(而不是用函數ctype_alpha( ))。
當檔案名稱的整個尾部是由未過濾資料組成時,一個高風險漏洞就產生了:
<?php $handle = fopen("/path/to/{$_GET['filename']}", 'r'); ?>
給予攻擊者更多的彈性意味著更多的漏洞。在這個例子中,攻擊者能操縱filename參數指向檔案系統中的任何文件,而不管路徑和檔案副檔名是什麼,這是因為檔案副檔名是$_GET['filename']的一部分。一旦WEB伺服器具有能讀取該檔案的權限,處理就會轉向這個攻擊者所指定的檔案。
如果路徑的前導部分使用了被污染資料的話,這一類的漏洞會變得更龐大。這也是下一節的主題。
以上就是PHP安全-檔案系統跨越的內容,更多相關內容請關注PHP中文網(www.php.cn)!

tostartaphpsession,usesesses_start()attheScript'Sbeginning.1)placeitbeforeanyOutputtosetThesessionCookie.2)useSessionsforuserDatalikeloginstatusorshoppingcarts.3)regenerateSessiveIdStopreventFentfixationAttacks.s.4)考慮使用AttActAcks.s.s.4)

會話再生是指在用戶進行敏感操作時生成新會話ID並使舊ID失效,以防會話固定攻擊。實現步驟包括:1.檢測敏感操作,2.生成新會話ID,3.銷毀舊會話ID,4.更新用戶端會話信息。

PHP会话对应用性能有显著影响。优化方法包括:1.使用数据库存储会话数据,提升响应速度;2.减少会话数据使用,只存储必要信息;3.采用非阻塞会话处理器,提高并发能力;4.调整会话过期时间,平衡用户体验和服务器负担;5.使用持久会话,减少数据读写次数。

PHPsessionsareserver-side,whilecookiesareclient-side.1)Sessionsstoredataontheserver,aremoresecure,andhandlelargerdata.2)Cookiesstoredataontheclient,arelesssecure,andlimitedinsize.Usesessionsforsensitivedataandcookiesfornon-sensitive,client-sidedata.

phpIdentifiesauser'ssessionSessionSessionCookiesAndSessionId.1)whiwsession_start()被稱為,phpgeneratesainiquesesesessionIdStoredInacookInAcookInAcienamedInAcienamedphpsessIdontheuser'sbrowser'sbrowser.2)thisIdallowSphptpptpptpptpptpptpptpptoretoreteretrieetrieetrieetrieetrieetrieetreetrieetrieetrieetrieetremthafromtheserver。

PHP會話的安全可以通過以下措施實現:1.使用session_regenerate_id()在用戶登錄或重要操作時重新生成會話ID。 2.通過HTTPS協議加密傳輸會話ID。 3.使用session_save_path()指定安全目錄存儲會話數據,並正確設置權限。

phpsessionFilesArestoredIntheDirectorySpecifiedBysession.save_path,通常是/tmponunix-likesystemsorc:\ windows \ windows \ temponwindows.tocustomizethis:tocustomizEthis:1)useession_save_save_save_path_path()


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SublimeText3漢化版
中文版,非常好用

Dreamweaver Mac版
視覺化網頁開發工具