[英]Is prepending “http://” to a filename for PHP's fopen() safe enough to prevent reading local files?
我有一個PHP腳本,該腳本通過GET接受文件URL,並使用fopen打開它。
此解決方案是否足夠安全還是違反安全性?
$filename = $_GET['file'];
if( substr( $filename, 0, 7 ) !== 'http://' )
$filename = 'http://'.$filename;
fopen( $filename, 'r' );
// etc...
這樣,您就不能強制腳本的本地路徑從中讀取。
那應該起作用,但是這里還有兩件事要考慮:
允許訪問其他服務器。 如果您的服務器位於防火牆后,則有人可以使用它通過HTTP,FTP等從防火牆后的另一台服務器中獲取數據(或訪問服務等)。
遞歸拒絕服務。 確保沒有任何人可以給您提供腳本本身的URL的方式來進行遞歸循環。
不確定,但是為了安全起見,可能還需要轉義它。
$filename=escapeshellarg ( $filename );
這有點脆弱,因為安全性取決於所注冊的http
處理程序。 如果在將來的PHP版本中將其刪除或可選怎么辦?
這是問題所在。 這實際上有效(警告之后):
stream_wrapper_unregister('http');
file_get_contents('http://../../../../../etc/passwd');
另一個安全措施/選項是使用chroot()
http://php.net/manual/en/function.chroot.php
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.