解析PHP中的安全模式(safe_mode)
什麼是PHP安全模式:safe_mode
簡單來說,PHP安全模式就是以安全模式運行php。
php的安全模式提供一個基本安全的共享環境,在一個有多個使用者帳戶存在的php開放的web伺服器上。當一個web伺服器上運行的php開啟了安全模式,那麼一些函數將被完全的禁止,並且會限制一些可用的功能。
在安全模式下,一些嘗試存取檔案系統的函數功能將被限制。執行web伺服器使用者id,如果想要操作某個文件,則必須擁有該文件讀取或寫入的存取權 限,實現這個限制功能對於php來說是沒有問題的。
在安全模式開啟的時候,嘗試讀取或寫入一個本機檔案的時候,php將檢查目前存取使用者是否是該目標文 件的擁有者。如果不是所有者,則該操作會被禁止。
(寫入權限:在較低層級的文件存取權限下,可能會允許讀取或寫入系統作業系統的文件,透過php的安全模式實現了防止你操作另外一個使用者文件的操作。當然,一個網頁伺服器可能能夠存取一個具有全域寫入權限的任意檔案。)
當安全模式開啟的時候,以下函數清單的功能將會受到限制:
chdir, move_uploaded_file, chgrp, parse_ini_file, chown, rmdir, copy, rename, fopen, require, highlight_file, show_source, include, symlink, link, touch, mkdir, unlink
#.一些php擴充中的函數也會受到影響。 (載入模組:在安全模式下dl函數將被禁止,如果要載入擴充的話,只能修改php.ini中的擴充選項,在php啟動的時候載入)
在php安全模式開啟的時候,需要執行系統程式的時候,必須是在safe_mode_exec_dir選項指定目錄的程序,否則執行將失敗。即使允許執行,那麼也會自動的傳遞給escapeshellcmd函數進行過濾。
以下執行指令的函數清單將會受到影響:
exec,shell_exec,passthru,system,popen另外,背部標記操作符(`)也將關閉。
當運行在安全模式下,雖然不會造成錯誤,但putenv函數將無效。同樣的,其他一些嘗試改變php環境變數的函數set_time_limit, set_include_path也將被忽略。
如何開啟PHP安全模式(請注意,PHP5.3將不再有安全性模式)開啟或關閉php的安全模式是利用php.ini中的safe_mode選項:
safe_mode=On(使用安全模式) safe_mode=Off(关闭安全模式)
在apache的httpd.conf中VirtualHost的對應設定方法
php_admin_flag safe_mode On(使用安全模式) php_admin_flag safe_mode Off(关闭安全模式) 或者: php_admin_value safe_mode1(使用安全模式) php_admin_value safe_mode0(关闭安全模式)
當函數在存取檔案系統的時候將進行檔案擁有者的檢查。預設情況下,會檢查該檔案擁有者的使用者id,當你能夠修改檔案擁有者的群組id(gid)為safe_mode_gid選項所指定的。
如果你有一個共享庫檔案在你的系統上,當你碰到需要include或require的時候,那麼你可以使用 safe_mode_include_dir選項來設定你的路徑,保證你的程式碼正常運作。 (包含路徑:如果你想要使用safe_mode_include_dir選項包含更多的包含路徑,那麼你可以像include_path選項一樣,在unix/linux系統下使用冒號進行分割,在windows下使用分號進行分割)
例如你想要在安全模式下包含/usr/local/include/php下的文件,那麼你可以設定選項為:
safe_mode_include_dir=/usr/local/include/php
如果你的包含的文件是需要執行的,那麼你可以設定safe_mode_exec_dir選項。
例如你需要/usr/local/php-bin路徑下的檔案是可以執行的,那麼可以設定選項為:
safe_mode_exec_dir=/usr/local/php-bin
(可執行:如果你執行的程式在/ usr/bin目錄下,那麼你可以把這些的二進位文件,連接到你指定選項下能夠執行的路徑)
如果你想設定某些環境變量,那麼可以使用safe_mode_allowed_env_vars選項。這個選項的值是一個環境變量的前綴,缺省是允許php_開頭的環境變量,如果你想要改變,可以設定該選項的值,多個環境變量前綴之間使用逗號進行分割。
例如下面允許時區的環境變數tz,那麼修改該選項的值為:
safe_mode_allowed_env_vars=php_,tz
除了安全模式以外,php還提供了許多其他許多特徵來確保php的安全。
1、[隱藏php的版本號碼]你能夠在php.ini裡使用expose_php選項來防止web伺服器洩漏php的報告資訊。如下:
expose_php=on
利用整個設置,你能夠阻礙一些來自自動腳本針對web伺服器的攻擊。通常情況下,http的頭資訊裡麵包含如下資訊:
server:apache/1.3.33(unix)php/5.2.4mod_ssl/2.8.16openssl/0.9.7c
在expose_php選項打開以後,php的版本資訊將不包含在上面的頭資訊裡。
当然,用户访问网站的时候同样能够看到.php的文件扩展名。如果你想整个的使用不同的文件扩展名,你需要在httpd.conf中找到如下这行:
addtype application/x-httpd.php
你就可以修改.php为任何你喜欢的文件扩展名。你能够指定任意多个的文件扩展名,中间使用空格进行分割。如果你想在服务器端使用php来解析.html和.htm文件的时候,那么你设置选项如下:
addtype application/x-httpd.html.htm
(解析html:配置你的web服务器使用php去解析所有的html文件,但是如果非服务器端代码也需要php去解析,会影响服务器的性能。静态页面你可以使用不同的扩展名,这样能够消除对php脚本引擎的依赖,增强性能。)
2、[文件系统安全]
安全模式限制了脚本所有者只能访问属于自己的文件,但是你可以使用open_basedir选现来指定一个你必须访问的目录。如果你指定了一个目录,php将拒绝访问除了该目录和该目录子目录的其他目录。open_basedir选项能够工作在安全模式之外。
限制文件系统只能访问/tmp目录,那么设置选项为:
open_basedir=/tmp
3、[函数访问控制]
你能够在disable_functions选项中使用逗号分割来设定函数名,那么这些函数将在php脚本中被关闭。这个设置能够工作在安全模式之外。
disable_functions=dl
当然,同样的你能够使用disable_classes选项来关闭对一些类的访问。
4、[数据库安全]
假设你的php脚本中包含一个基于表单值来执行的mysql查询:
$sql=”update mytable set col1=”.$_post[“value”].”where col2=’somevalue'”; $res=mysql_query($sql,$db);
你希望$_post[“value”]包含一个整数值来更新你的列col1。可是,一个恶意用户能够输入一个分号在表单字段里,接着,是一段他/她想被任意执行的sql语句。
举例,假设下面是$_post[“value”]提交的值:
0;insert into admin_users(username,password) values (‘me’,’mypassword’);
那么当这个查询发送给mysql查询的时候,那么就变成了下面这条sql:
update mytable set col1=0; insert into admin_users(username,password) values (‘me’,’mypassword’); where col2=’somevalue';
这明显是一个有害的查询!首先这个查询会在mytable表里更新col1。这个并没有什么麻烦的,但是第二个表达式,它将执行insert表达式 来插入一个能登陆的新管理员。第三个表达式就废弃了,但同时sql解析器将抛出一个错误,这个有害的查询才完成。这个攻击就是大家常说的sql injection(注:sql注入)。
当然,sql injection存在一个问题,对方必须了解你的数据库结构。在这个例子中,攻击者是知道你有一个表admin_users,并且知道包含username和password字段,同时,存储的密码是没有加密的。
除了你自己,一般的网站访问者是不知道这些关于数据库的信息。可是,如果你使用了一个开发源代码的在线电子商务程序,或者使用一个自由的讨论版程序,这些数据表的定义都是已知的,或者有一些用户能够访问到你的数据库。
此外,你的脚本输出会提示一个查询错误,这些信息里包含了很多关于数据库结构的重要信息。在一个正常工作的网站上,你应该考虑设置 display_errors选项为off,并且使用log_errors来代替display_errors,把警告和错误信息插入到文件中。
(数据库权限:它是一个非常重要的东西,你只有正确的权限,才能通过脚本正确的连接数据库。你应该不要在脚本中使用管理员去连接数据库。如果你这么 做,那么一个攻击者将可能获取全部的数据库权限,并且包括其他相同服务器的权限。攻击者将可能运行grant或create user命令来获取更多的访问权限。)
如果你要防止sql injection攻击,你必须保证用户表单里提交的内容不是一个能够执行的sql表达式。
前一个例子中,我们使用一个整型值来进行更新。如果在单引号后面跟上一个字符串,这个攻击者在分号之前必须提交一个闭合的引用在整个sql表达式中。可是,当magic_quotes_gpc选项是开启的时候,在web表单中提交的引号将自动被转义。
为了防止被恶意的攻击者进行sql injection攻击,你应该总是确认提交的数据是合法的。如果你需要的是一个整数值,那么你可以使用is_numeric函数来测试这个表达值,或者使用settype函数来转换为一个数字,清除任何一个傻傻的sql语句。
如果你开发的程序需要几个提交的值在一个sql表达式里,你能够使用sprintf函数来构建一个sql字符串,使用格式化字符来指示数据类型的每个值。看下面的例子:
$sql=sprintf(“update mytable set col1=%d where col2=’%s'”, $_post[“number”], mysql_escape_string($_post[“string”]));
在上一个例子中,整个mysql的数据已经被使用,所以这个字符串已经通过mysql_escape_string函数进行过滤。对于其他数据库,你可以使用addslashes函数进行转义,或者使用其他方法。
更多php相關知識,請造訪php教學!
以上是解析PHP中的安全模式(safe_mode)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

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

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

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7
