簡體   English   中英

在PHP的fopen()的文件名前加上“ http://”是否足夠安全,可以防止讀取本地文件?

[英]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.net/manual/en/function.escapeshellarg.php

這有點脆弱,因為安全性取決於所注冊的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM