(php 3, php 4, php 5)
dirname -- 返回路徑中的目錄部分
stringdirname( string path )
給出乙個包含有指向乙個檔案的全路徑的字串,本函式返回去掉檔名後的目錄名。
在 windows 中,斜線(/)和反斜線(\)都可以用作目錄分隔符。在其它環境下是斜線(/)。
例子 1.dirname()例子
<?php
$path
= "/etc/passwd"
;$file
= dirname
($path
); // $file is set to "/etc"
?>
注:在 php 4.0.3 中,dirname()被修正為 posix 相容。本質上就意味著如果在 path 中沒有斜線,則返回乙個點('.'),表示當前目錄。否則返回的是把 path 中結尾的 /component(最後乙個斜線以及後面部分)去掉之後的字串。注意這意味著在老的函式返回乙個空字串的情形下你通常從dirname()得到的是斜線或者乙個點。
dirname()從 php 4.3.0 開始有所改變 請看以下例子:
<?php
// php 4.3.0 以前
dirname
('c:/'
); // 返回 '.'
// php 4.3.0 以後
dirname
('c:/'
); // 返回 'c:'
?>
dirname()的操作從 php 5.0.0 版開始是二進位制安全的。
2. explode() 函式把字串分割為陣列。
在本例中,我們將把字串分割為陣列:
<?php輸出:$str = "hello world. it's a beautiful day.";
print_r (
explode(" ",$str)
);?>
array/test.php/123456的話([0] => hello
[1] => world.
[2] => it's
[3] => a
[4] => beautiful
[5] => day.
)3.$_server['script_name']
$_server['script_name']結果是/test.php
4.__file__ :被稱為php魔術常量,返回當前執行php指令碼的完整路徑和檔名,包含乙個絕對路徑
比如檔案 b.php 包含如下內容:
<?php
$basedir = dirname(__file__);
echo $basedir
//將在頁面列印出乙個這個檔案所在
絕對路徑!
?>
我做的測試得到結果: e:\website\othertest\cms
如果b.php被其他目錄裡的a.php檔案require 或者 include 去引用的話。
變數$basedir 的內容還是b.php所在的那個資料夾的路徑。 而不是變成a.php檔案所在的目錄。
5.
當 register_globals 開啟以後,各種變數都被注入**,例如來自 html 表單的請求變數。再加上 php 在使用變數之前是無需進行初始化的,這就使得更容易寫出不安全的**。這是個很艱難的抉擇,但 php 社群還是決定預設關閉此選項。當開啟時,人們使用變數時確實不知道變數是**來的,只能想當然。但是 register_globals 的關閉改變了這種**內部變數和客戶端傳送的變數混雜在一起的糟糕情況。下面舉乙個錯誤使用 register_globals 的例子:
example #1 錯誤使用 register_globals = on 的例子
<?php
// 當使用者合法的時候,賦值 $authorized = true
if (authenticated_user())
// 由於並沒有事先把 $authorized 初始化為 false,
// 當 register_globals 開啟時,可能通過get auth.php?authorized=1 來定義該變數值
// 所以任何人都可以繞過身份驗證
if ($authorized)
?>
當 register_globals = on 的時候,上面的**就會有危險了。如果是 off,$authorized
就不能通過如 url 請求等方式來改變,這樣就好多了,儘管初始化變數是乙個良好的程式設計習慣。比如說,如果在上面的**執行之前加入$authorized = false 的話,無論 register_globals 是 on 還是 off 都可以,因為使用者狀態被初始化為未經認證。
另乙個例子是關於會話的。當 register_globals = on 的時候,$username
也可以用在下面的**中,但要意識到$username
也可能會從其它途徑進來,比如說通過 url 的 get。
example #2 使用會話時同時相容 register_globals on 和 off 的例子
<?php
// 我們不知道 $username 的**,但很清楚 $_session 是
// **於會話資料
if (isset($_session['username'])) ";
} else
?>
採取相應的預防措施以便在偽造變數輸入的時候給予警告是完全有可能的。如果事先確切知道變數是**來的,就可以檢查所提交的資料是否是從不正當的表單提交而來。不過這不能保證變數未被偽造,這需要攻擊者去猜測應該怎樣去偽造。如果不在乎請求資料**的話,可以使用 $_request
陣列,它包括了 get、post 和 cookie 的所有資料。詳情可參見本手冊的來自 php 之外的變數。
example #3 探測有害變數
<?php
if (isset($_cookie['magic_cookie'])) elseif (isset($_get['magic_cookie']) || isset($_post['magic_cookie'])) else
?>
當然,單純地關閉 register_globals 並不代表所有的**都安全了。對於每一段提交上來的資料,都要對其進行具體的檢查。永遠要驗證使用者資料和對變數進行初始化!把 error_reporting() 設為e_notice
級別可以檢查未初始化的變數。
更多關於模擬 register_globals 為 on 或 off 的資訊,請見此 faq。
php幾個函式
ob get contents 函式的用法 下面3個函式的用法 ob get contents ob end clean ob start 可以借助這幾個函式實現緩衝本地檔案,以及執行本地指令碼 使用ob start 把輸出那同輸出到緩衝區,而不是到瀏覽器。然後用ob get contents得到緩...
幾個常用的PHP函式
最近在看 發現以下是幾個比較實用的函式。1,取客戶端ip 檢視複製列印?這裡,如果使用多級 的使用者,真實ip是取不到的。2,字串擷取,支援中文 檢視複製列印?function getstrtruncate string length 80,etc str c return str etc else...
php 幾個函式理解
1,addslashes php 指令 magic quotes gpc 為 on 它主要是對所有的 get post 和 cookie 資料自動執行 addslashes 不要對已經被 magic quotes gpc 轉義過的 字串使用 addslashes 因為這樣會導致雙層轉義。遇到這種情況...