目前分類:PHP程式設計 (11)

瀏覽方式: 標題列表 簡短摘要

使用unlink來刪除檔案,

unlink("本地路徑");

如果輸入的是網路路徑會出錯。

 

使用is_file()來判斷檔案是否存在,

if(is_file("本地路徑"))

 

使用is_dir()來判斷目錄是否存在,

if(is_dir("本地路徑"))

風影淚 發表在 痞客邦 留言(0) 人氣()

在網頁程式撰寫的時候,經常需要把使用者輸入的字串做過濾

但有些時候並非惡意攻擊字串

可能使用者只是輸入錯誤 

因此我們需要做一些基本的檢查來預防和提式

下面是使用 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);

風影淚 發表在 痞客邦 留言(0) 人氣()

加入以下的函數可防止惡意的表單資料

 

function safe_input($data) {
$data = trim($data); //去除多的空白
$data = stripslashes($data); //去掉斜線
$data = htmlspecialchars($data); //去掉特殊字元
return $data;
}

風影淚 發表在 痞客邦 留言(0) 人氣()

最近研究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{
  • //未通過
  • }

風影淚 發表在 痞客邦 留言(0) 人氣()

//英文一律轉大寫

$str="a123456789";

echo strtoupper($str)."<br>";

 

//英文一律轉小寫

$str="A123456789";

echo strtolower($str)."<br>";

 

//如果字串還有中文,而網頁編碼方式為big5時,會產生錯誤。

風影淚 發表在 痞客邦 留言(0) 人氣()

使用date函式
都會有一個疑問
為什麼時間都會對不準
因為
時區預設是格林威治天文臺的時間
所以必須修改php.ini的date.timezone
改成
date.timezone = Asia/Taipei
簡單的一個步驟就解決嚕~


如果說主機不是自己的呢
那只要在使用date函式之前加上
date_default_timezone_set("Asia/Taipei");
就可以了~

風影淚 發表在 痞客邦 留言(0) 人氣()

PHP反斜線去除、保留方法與時機 stripslashes

一般用PHP程式寫入文本中,為了安全和編碼相容性
會使用 htmlspecialchars 將特殊字元轉換特殊字元成為HTML實體
並且將跳脫字元(逃脫字元)避免掉
自動加上反斜線,以利資料庫正確安全的寫入和讀取

但是如果只需使用一般文件之間的寫入和讀取時,
則無須這樣的程序
反而會在每次寫入文本時增加一個反斜線 \
後台管理者每次編輯一次文章都會增加一個反斜線 \
越來越多....像這樣 \"\"\"\"
如果遇到這樣的問題
只要將 htmlspecialchars 用 stripslashes 代替掉即可
例1:
       $txt = htmlspecialchars($txt);
改成
       $txt = stripslashes($txt);

例2:
fwrite($re_text,$_POST[context],60000);
改成
fwrite($re_text,stripslashes($_POST[context]),60000);
這樣就可以避免掉寫入讀取之間的反斜線了,PHP就不會再用反斜線來逃脫特殊的字元了。

風影淚 發表在 痞客邦 留言(0) 人氣()

迴圈 (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)
    // 迴圈工作

風影淚 發表在 痞客邦 留言(0) 人氣()

把中文URL進行編碼:

echo urlencode("中文");//%E4%B8%AD%E6%96%87

 

把轉碼後的URL轉換回中文:

echo urldecode("%E4%B8%AD%E6%96%87");//中文

風影淚 發表在 痞客邦 留言(0) 人氣()

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;
?>

風影淚 發表在 痞客邦 留言(0) 人氣()

用PHP抓取網頁如果出現Unable to find the socket transport "ssl"的話,

在 php.ini 啟用 extension=php_openssl.dll 這個選項即可

風影淚 發表在 痞客邦 留言(0) 人氣()