使用unlink來刪除檔案,
unlink("本地路徑");
如果輸入的是網路路徑會出錯。
使用is_file()來判斷檔案是否存在,
if(is_file("本地路徑"))
使用is_dir()來判斷目錄是否存在,
if(is_dir("本地路徑"))
使用unlink來刪除檔案,
unlink("本地路徑");
如果輸入的是網路路徑會出錯。
使用is_file()來判斷檔案是否存在,
if(is_file("本地路徑"))
使用is_dir()來判斷目錄是否存在,
if(is_dir("本地路徑"))
在網頁程式撰寫的時候,經常需要把使用者輸入的字串做過濾
但有些時候並非惡意攻擊字串
可能使用者只是輸入錯誤
因此我們需要做一些基本的檢查來預防和提式
下面是使用 preg_match() 這個函數來檢查字串的方式
首先先簡單介紹一下 preg_match() 這個函數的用法
preg_match( 正則表達式 , 要比對的字串 , 比對結果)
其中比對結果是一個陣列,其中陣列結果是 $result[0]=原字串、$result[1]=第一個符合規則的字串、$result[2]=第二個符合規則的字串...以此類推
比對結果則回傳 1(正確) 或是 0(錯誤)
下面是一個簡單的範例
if(preg_match($regex, $resource , $result)) {
echo "OK";
} else {
echo "error";
}
另外附上幾個常用的表達式
//A. 檢查是不是數字
$standard_A = "/^([0-9]+)$/";
//B. 檢查是不是小寫英文
$standard_B = "/^([a-z]+)$/";
//C. 檢查是不是大寫英文
$standard_C = "/^([A-Z]+)$/";
//D. 檢查是不是全為英文字串
$standard_D = "/^([A-Za-z]+)$/";
//E. 檢查是不是英數混和字串
$standard_E = "/^([0-9A-Za-z]+)$/";
//F. 檢查是不是中文
$standard_F = "/^([\x7f-\xff]+)$/";
//G. 檢查是不是電子信箱格式
//$standard_G_1 這組正則允許 "stanley.543-ok@myweb.com"
//但 $standard_G_2 僅允許 "stanley543ok@myweb.com" ,字串內不包含 .(點)和 -(中線)
$standard_G_1 = "/^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/";
$standard_G_2 = "/^[\w]*@[\w-]+(\.[\w-]+)+$/" ;
//下面則是個簡單的範例,大家可以嘗試看看
$string = "stanley.543-ok@myweb.com" ;
$standard_G_1 = "/^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/";
$standard_G_2 = "/^[\w]*@[\w-]+(\.[\w-]+)+$/" ;
function checkString($strings, $standard){
if(preg_match($standard, $strings, $hereArray)) {
return 1;
} else {
return 0;
}
}
echo checkString($string, $standard_G_1);
echo "<br>";
echo checkString($string, $standard_G_2);
加入以下的函數可防止惡意的表單資料
function safe_input($data) {
$data = trim($data); //去除多的空白
$data = stripslashes($data); //去掉斜線
$data = htmlspecialchars($data); //去掉特殊字元
return $data;
}
最近研究Ajax之餘,
卻發現一些ajax可能造成的安全性問題,
就拿表單來源來說,
就是一個非常致命危險~
如果不限制表單來源,
可能會讓你的網站成為有心人事的釣魚目標~
不僅會讓帳號資料外洩,
甚至可能會賠上網站信譽呢~
而目前看到許多解決辦法,
今天就提出其中一個簡單的方法囉~
首先要先了解的部分就是以下兩個函數囉:
1.$_SERVER['HTTP_REFERER'] 取得上一頁面的來源網址
ex:http://www.abc.com/post.htm
2.$_SERVER['HTTP_HOST'] 取得Server端的網名(IP位址)
ex: www.cde.com
透過以上兩項函數,
我們將能做到表單來源判別~
從上面兩個函數的回傳值範例,
大家有看見判別點了嘛?
對!
就是在域名(or IP)位置~
我們只要去比對來源的表單的域名位置是否與SERVER端的域名相同,
就能過濾非法來源表單囉!
不過講那麼多,
還是直接來個範例給大家看比較實在~XD
---------------------------
程式碼:
- $http_p=explode("/",$_SERVER['HTTP_REFERER']);//取得上一頁面的域名(or IP)
- if($_SERVER['HTTP_HOST']==$http_p[2]){
- //通過
- }else{
- //未通過
- }
//英文一律轉大寫
$str="a123456789";
echo strtoupper($str)."<br>";
//英文一律轉小寫
$str="A123456789";
echo strtolower($str)."<br>";
//如果字串還有中文,而網頁編碼方式為big5時,會產生錯誤。
使用date函式
都會有一個疑問
為什麼時間都會對不準
因為
時區預設是格林威治天文臺的時間
所以必須修改php.ini的date.timezone
改成
date.timezone = Asia/Taipei
簡單的一個步驟就解決嚕~
如果說主機不是自己的呢
那只要在使用date函式之前加上
date_default_timezone_set("Asia/Taipei");
就可以了~
迴圈 (loop) 是用來進行進行重複性的工作,關鍵字 (keyword) foreach 與 as 構成 PHP 中迴圈的一種,用於取得陣列 (array) 元素進行迴圈工作,有兩種形式,第一種為 key 從 0 開始依序遞增的陣列,這時只需取得 value 即可,如下
foreach (array_name as $value ) // 迴圈工作 |
array_name 為陣列變數或運算式, $value 則是自行定義的變數,用來暫存陣列元素。
第二種則是任意的 key-value 組合,此時需要兩個變數 $key 為 key 的值, $value 為 value 的值
foreach (array_name as $key => $value ) // 迴圈工作 |
把中文URL進行編碼:
echo urlencode("中文");//%E4%B8%AD%E6%96%87
把轉碼後的URL轉換回中文:
echo urldecode("%E4%B8%AD%E6%96%87");//中文
PHP抓網頁內容
1.file_get_contents
<? $url = http://www.xxx.com/; $contents = file_get_contents($url); //如果出現中文亂碼使用下面代碼 //$getcontent = iconv("gb2312", "utf-8",file_get_contents($url)); //echo $getcontent; echo $contents; ?>
2.curl
我們必須先建立一個「curl」的連線,也因此,必須使用到「$ch = curl_init()」這個函式。而為了怕建立連線忘了關閉。因此,必須先寫好關閉的函式,「curl_close($ch)」。
接下來,你可以設定他截取網頁的選項,一般來說常用的有「CURLOPT_RETURNTRANSFER」、「CURLOPT_URL」、「CURLOPT_HEADER」、「CURLOPT_FOLLOWLOCATION」、「CURLOPT_USERAGENT」這幾個選項。而這幾個選項分別代表「將結果回傳成字串」、「設定截取網址」、 「是否截取header的資訊」、「是否抓取轉址」及「瀏覽器的user agent」。最後,再執行「curl_exec($ch)」以取出結果就可以了。
<? $url = "http://www.xxx.com/"; $ch = curl_init(); $timeout = 5; curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); //在需要用戶檢測的網頁裡需要增加下面兩行 //curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY); //curl_setopt($ch, CURLOPT_USERPWD, US_NAME.":".US_PWD); $contents = curl_exec($ch); curl_close($ch); echo $contents; ?>
以抓取yahoo為例,若我們要偽裝成google bot去抓取,那麼我們可以寫成下列的樣子:
$ch = curl_init(); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_URL, "www.yahoo.com.tw"); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_USERAGENT, "Google Bot"); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); $output = curl_exec($ch); curl_close($ch); echo $output;
也可以將選項們設定一個陣列,以增加設定時的閱讀度。這時就得動用「curl_setopt_array()」這個函式了:
$ch = curl_init(); $options = array(CURLOPT_URL => 'www.yahoo.com.tw', CURLOPT_HEADER => false, CURLOPT_RETURNTRANSFER => true, CURLOPT_USERAGENT => "Google Bot", CURLOPT_FOLLOWLOCATION => true ); curl_setopt_array($ch, $options); $output = curl_exec($ch); curl_close($ch); echo $output;
3.fopen->fread->fclose
<? $handle = fopen ("http://www.xxx.com/", "rb"); $contents = ""; do { $data = fread($handle, 8192); if (strlen($data) == 0) { break; } $contents .= $data; } while(true); fclose ($handle); echo $contents; ?>
用PHP抓取網頁如果出現Unable to find the socket transport "ssl"的話,
在 php.ini 啟用 extension=php_openssl.dll 這個選項即可。