safe_mode 开启后linux下影响
生活随笔
收集整理的這篇文章主要介紹了
safe_mode 开启后linux下影响
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
2019獨角獸企業(yè)重金招聘Python工程師標準>>>
什么是PHP安全模式:safe_mode簡單說,PHP安全模式就是以安全模式運行php。
php的安全模式提供一個基本安全的共享環(huán)境,在一個有多個用戶帳戶存在的php開放的web服務(wù)器上。當一個web服務(wù)器上運行的php打開了安全模式,那么一些函數(shù)將被完全的禁止,并且會限制一些可用的功能。
在安全模式下,一些嘗試訪問文件系統(tǒng)的函數(shù)功能將被限制。運行web服務(wù)器用戶id,如果想要操作某個文件,則必須擁有該文件讀取或者寫入的訪問權(quán)限,實現(xiàn)這個限制功能對于php來說是沒有問題的。在安全模式開啟的時候,嘗試讀取或者寫入一個本地文件的時候,php將檢查當前訪問用戶是否是該目標文件的所有者。如果不是所有者,則該操作會被禁止。(寫入權(quán)限:在較低級別的文件訪問權(quán)限下,可能會允許讀取或者寫入系統(tǒng)操作系統(tǒng)的文件,通過php的安全模式實現(xiàn)了防止你操作另外一個用戶文件的操作。當然,一個web服務(wù)器可能能夠訪問一個具有全局寫入權(quán)限的任意文件。)
當安全模式打開的時候,以下函數(shù)列表的功能將會受到限制:
??? 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擴展中的函數(shù)也將會受到影響。(加載模塊:在安全模式下dl函數(shù)將被禁止,如果要加載擴展的話,只能修改php.ini中的擴展選項,在php啟動的時候加載)
在php安全模式打開的時候,需要執(zhí)行系統(tǒng)程序的時候,必須是在safe_mode_exec_dir選項指定目錄的程序,否則執(zhí)行將失敗。即使允許執(zhí)行,那么也會自動的傳遞給escapeshellcmd函數(shù)進行過濾。
以下執(zhí)行命令的函數(shù)列表將會受到影響:
??? exec,shell_exec,passthru,system,popen
另外,背部標記操作符(`)也將被關(guān)閉。
當運行在安全模式下,雖然不會引起錯誤,但是putenv函數(shù)將無效。同樣的,其他一些嘗試改變php環(huán)境變量的函數(shù)set_time_limit, set_include_path也將被忽略。
如何開啟PHP安全模式(請注意,PHP5.3將不再有安全模式)
打開或者關(guān)閉php的安全模式是利用php.ini中的safe_mode選項:
??? safe_mode=On(使用安全模式)
??? safe_mode=Off(關(guān)閉安全模式)
在apache的httpd.conf中VirtualHost的相應(yīng)設(shè)置方法
??? php_admin_flag safe_mode On(使用安全模式)
??? php_admin_flag safe_mode Off(關(guān)閉安全模式)
或者:
??? php_admin_value safe_mode1(使用安全模式)
??? php_admin_value safe_mode0(關(guān)閉安全模式)
啟用安全模式后的影響:
當函數(shù)在訪問文件系統(tǒng)的時候?qū)⑦M行文件所有者的檢查。缺省情況下,會檢查該文件所有者的用戶id,當你能夠修改文件所有者的組id(gid)為safe_mode_gid選項所指定的。
如果你有一個共享庫文件在你的系統(tǒng)上,當你碰到需要include或require的時候,那么你可以使用safe_mode_include_dir選項來設(shè)置你的路徑,保證你的代碼正常工作。(包含路徑:如果你想要使用safe_mode_include_dir選項包含更多的包含路徑,那么你可以象include_path選項一樣,在unix/linux系統(tǒng)下使用冒號進行分割,在windows下使用分號進行分割)
比如你想要在安全模式下包含/usr/local/include/php下的文件,那么你可以設(shè)置選項為:
??? safe_mode_include_dir=/usr/local/include/php
如果你的包含的文件是需要執(zhí)行的,那么你可以設(shè)置safe_mode_exec_dir選項。
比如你需要/usr/local/php-bin路徑下的文件是可以執(zhí)行的,那么可以設(shè)置選項為:
??? safe_mode_exec_dir=/usr/local/php-bin
(可執(zhí)行:如果你執(zhí)行的程序在/usr/bin目錄下,那么你可以把這些的二進制文件,連接到你指定選項下能夠執(zhí)行的路徑)
如果你想設(shè)置某些環(huán)境變量,那么可以使用safe_mode_allowed_env_vars選項。這個選項的值是一個環(huán)境變量的前綴,缺省是允許php_開頭的環(huán)境變量,如果你想要改變,可以設(shè)置該選項的值,多個環(huán)境變量前綴之間使用逗號進行分割。
比如下面允許時區(qū)的環(huán)境變量tz,那么修改該選項的值為:
??? safe_mode_allowed_env_vars=php_,tz
除了安全模式以外,php還提供了許多其他許多特征來保證php的安全。
1、[隱藏php的版本號]
你能夠在php.ini里使用expose_php選項來防止web服務(wù)器泄露php的報告信息。如下:
??? expose_php=on
利用整個設(shè)置,你能夠阻礙一些來自自動腳本針對web服務(wù)器的攻擊。通常情況下,http的頭信息里面包含了如下信息:
??? server:apache/1.3.33(unix)php/5.2.4mod_ssl/2.8.16openssl/0.9.7c
在expose_php選項打開以后,php的版本信息將不包含在上面的頭信息里。
當然,用戶訪問網(wǎng)站的時候同樣能夠看到.php的文件擴展名。如果你想整個的使用不同的文件擴展名,你需要在httpd.conf中找到如下這行:
??? addtype application/x-httpd.php
你就可以修改.php為任何你喜歡的文件擴展名。你能夠指定任意多個的文件擴展名,中間使用空格進行分割。如果你想在服務(wù)器端使用php來解析.html和.htm文件的時候,那么你設(shè)置選項如下:
??? addtype application/x-httpd.html.htm
(解析html:配置你的web服務(wù)器使用php去解析所有的html文件,但是如果非服務(wù)器端代碼也需要php去解析,會影響服務(wù)器的性能。靜態(tài)頁面你可以使用不同的擴展名,這樣能夠消除對php腳本引擎的依賴,增強性能。)
2、[文件系統(tǒng)安全]
安全模式限制了腳本所有者只能訪問屬于自己的文件,但是你可以使用open_basedir選現(xiàn)來指定一個你必須訪問的目錄。如果你指定了一個目錄,php將拒絕訪問除了該目錄和該目錄子目錄的其他目錄。open_basedir選項能夠工作在安全模式之外。
限制文件系統(tǒng)只能訪問/tmp目錄,那么設(shè)置選項為:
??? open_basedir=/tmp
3、[函數(shù)訪問控制]
你能夠在disable_functions選項中使用逗號分割來設(shè)定函數(shù)名,那么這些函數(shù)將在php腳本中被關(guān)閉。這個設(shè)置能夠工作在安全模式之外。
??? disable_functions=dl
當然,同樣的你能夠使用disable_classes選項來關(guān)閉對一些類的訪問。
4、[數(shù)據(jù)庫安全]
假設(shè)你的php腳本中包含一個基于表單值來執(zhí)行的mysql查詢:
??? $sql=”update mytable set col1=”.$_post["value"].”where col2=’somevalue’”;
??? $res=mysql_query($sql,$db);
你希望$_post["value"]包含一個整數(shù)值來更新你的列col1。可是,一個惡意用戶能夠輸入一個分號在表單字段里,接著,是一段他/她想被任意執(zhí)行的sql語句。
舉例,假設(shè)下面是$_post["value"]提交的值:
??? 0;insert into admin_users(username,password) values (‘me’,'mypassword’);
那么當這個查詢發(fā)送給mysql查詢的時候,那么就變成了下面這條sql:
??? update mytable set col1=0;
??? insert into admin_users(username,password) values (‘me’,'mypassword’);
??? where col2=’somevalue’;
這明顯是一個有害的查詢!首先這個查詢會在mytable表里更新col1。這個并沒有什么麻煩的,但是第二個表達式,它將執(zhí)行insert表達式來插入一個能登陸的新管理員。第三個表達式就廢棄了,但同時sql解析器將拋出一個錯誤,這個有害的查詢才完成。這個攻擊就是大家常說的sql injection(注:sql注入)。
當然,sql injection存在一個問題,對方必須了解你的數(shù)據(jù)庫結(jié)構(gòu)。在這個例子中,攻擊者是知道你有一個表admin_users,并且知道包含username和password字段,同時,存儲的密碼是沒有加密的。
除了你自己,一般的網(wǎng)站訪問者是不知道這些關(guān)于數(shù)據(jù)庫的信息。可是,如果你使用了一個開發(fā)源代碼的在線電子商務(wù)程序,或者使用一個自由的討論版程序,這些數(shù)據(jù)表的定義都是已知的,或者有一些用戶能夠訪問到你的數(shù)據(jù)庫。
此外,你的腳本輸出會提示一個查詢錯誤,這些信息里包含了很多關(guān)于數(shù)據(jù)庫結(jié)構(gòu)的重要信息。在一個正常工作的網(wǎng)站上,你應(yīng)該考慮設(shè)置display_errors選項為off,并且使用log_errors來代替display_errors,把警告和錯誤信息插入到文件中。
(數(shù)據(jù)庫權(quán)限:它是一個非常重要的東西,你只有正確的權(quán)限,才能通過腳本正確的連接數(shù)據(jù)庫。你應(yīng)該不要在腳本中使用管理員去連接數(shù)據(jù)庫。如果你這么做,那么一個攻擊者將可能獲取全部的數(shù)據(jù)庫權(quán)限,并且包括其他相同服務(wù)器的權(quán)限。攻擊者將可能運行g(shù)rant或create user命令來獲取更多的訪問權(quán)限。)
如果你要防止sql injection攻擊,你必須保證用戶表單里提交的內(nèi)容不是一個能夠執(zhí)行的sql表達式。
前一個例子中,我們使用一個整型值來進行更新。如果在單引號后面跟上一個字符串,這個攻擊者在分號之前必須提交一個閉合的引用在整個sql表達式中。可是,當magic_quotes_gpc選項是開啟的時候,在web表單中提交的引號將自動被轉(zhuǎn)義。
為了防止被惡意的攻擊者進行sql injection攻擊,你應(yīng)該總是確認提交的數(shù)據(jù)是合法的。如果你需要的是一個整數(shù)值,那么你可以使用is_numeric函數(shù)來測試這個表達值,或者使用settype函數(shù)來轉(zhuǎn)換為一個數(shù)字,清除任何一個傻傻的sql語句。
如果你開發(fā)的程序需要幾個提交的值在一個sql表達式里,你能夠使用sprintf函數(shù)來構(gòu)建一個sql字符串,使用格式化字符來指示數(shù)據(jù)類型的每個值。看下面的例子:
??? $sql=sprintf(“update mytable set col1=%d where col2=’%s’”, $_post["number"], mysql_escape_string($_post["string"]));
在上一個例子中,整個mysql的數(shù)據(jù)已經(jīng)被使用,所以這個字符串已經(jīng)通過mysql_escape_string函數(shù)進行過濾。對于其他數(shù)據(jù)庫,你可以使用addslashes函數(shù)進行轉(zhuǎn)義,或者使用其他方法。
轉(zhuǎn)載于:https://my.oschina.net/ailingling/blog/305651
總結(jié)
以上是生活随笔為你收集整理的safe_mode 开启后linux下影响的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python之命令行解析工具argpar
- 下一篇: 《C和指针》读书笔记 第5章-操作符和表