目前分類:PHP (32)

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

要檢查 PHP 程式是否有 Syntax Error 的命令, 就是於 command line 使用:

php -l filename.php

註: -l Syntax check only (lint)

先用 "php -l" 檢查過, 再把程式推上線, 可以減少意外的發生, 或者說這個可以列入最基本的檢查吧~

如果產品要 Release, 要將目錄內的 php 檔都經過 "php -l" 掃一次的話, 就用下面這行指令來處理囉~ (取自: Parsing Errors on Command Line)

find . -name \*.php \! -exec php -l {} \;

如果有 .inc 或其它的, 再自己修改囉~ :)

kevin0523 發表在 痞客邦 留言(0) 人氣()

#####################################################################
# 本程式由 fiend 編寫 轉貼請註明出處
#####################################################################

前言 :

這是一支小小的簡單程式 不過 網站被 dos 攻擊時還蠻好用的 ^^

小弟之前 被一個死香港駭客

不停的用 dos 對我的 網站傳送大量封包 同時傳送上百萬的 apache 請求 封包 .

害我的 apache 忙的要死 db loding 一直衝上來 ..

因為當時我是租用主機 主機商 又沒有能力處理這種攻擊 它們遇到這種狀況一律 鎖住我的網站的權限 這是不對的不公平!! .

使用它後 cpu 的 loding 從 70~90% 降到 2% , 被攻擊的情況也變少了 .

使用這支程式 請注意 session 數不要設太少 有的 user 電腦中毒了 也會被封鎖

經驗上 16 是最嚴格的 32 算中等 64 的話 剛剛好

所以大家在設定上 16 32 64 依自己需需求去判斷

有人會問我 這樣 loding 會不會很重 不會的大家放心 因為 netstats 的技術 不是分析封包

只是判斷 sources ip 對 sources port 及 destantion ip 對 destantion port 的連線數 每秒執行cpu用不到 0.1% .

kevin0523 發表在 痞客邦 留言(0) 人氣()

Session 的瓶頸與解決方法

 

Session 的使用 這篇最後面提到了當 PHP server 超過一台時會有問題,這有蠻多的解法,不同的解法偏重在解決不同的問題。

第一種解法是修改 PHP Session 存放目錄,指到 NFS 路徑上,這樣就不會有在 web1 登入後 web2 讀不到的問題。這個在 交大資工 的 PHP server 就是這樣做,這樣做很明顯的優點是「簡單」,缺點就是 NFS 效率與穩定性的問題,不過對於小量的網站來說其實還不錯,因為第一次擴充時的瓶頸通常都是先出現在前端的 PHP server 上,NFS 的效率反而不是重點。

第二種解法則是透過 memcached 來放,這種方法通常都是因為 NFS 效率影響太大,或是覺得 NFS 的穩定性不夠,把 NFS 換成 memcached 希望能解決掉這個問題。這個作法需要利用 session_set_handle() 設定自己寫 (或是網路上抓來的) 程式碼將 Session 資料丟到 memcached 裡。另外一個方案是 Mohawk Software Session Handler Functions,沒有實際用過,不過看起來也是這一類的方案。

第三種解法是透過密碼學的方式將資料放在使用者端。如果資料不敏感 (像是只有使用者的 username),就透過 HMAC 簽,然後在使用者的瀏覽器上設 Cookie 紀錄,其他的頁面就可以利用 HMAC 檢查是不是自己簽的。如果資料比較敏感,不方便給使用者看到,那麼先透過 Cipher 加密後再用 HMAC 簽,然後再塞到使用者端瀏覽器的 Cookie。這種方式的好處是 Server 端是處於 Stateless 的狀態,這種方式等於完全不需要在 Server 端存資訊。但缺點就是 HMACCipher 用的 key 如果外洩就糟糕了。

第四種解法是透過硬體或是某些特定的 Reverse Proxy 解決 Load Balance 時 Session 所產生的問題,簡單來說就是某個 Cookie 一樣就會導到後端一樣的機器 (在這個例子裡是 PHPSESSID),於是後端就可以用最原始的 /tmp 來放 Session 資料。

這四種解法都有優缺點,並沒有哪個絕對比較好或是比較差,好壞要看使用的環境而定。

kevin0523 發表在 痞客邦 留言(0) 人氣()

PHPMailer 是一個功能豐富的函式庫,以下是用 PHPMailer 通過遠端 SMTP 認證發送郵件的例子:

PHP:
  1. <?php
  2. // 建立 PHPMailer 物件及設定 SMTP 登入資訊
  3. require("../phpMailer/class.phpmailer.php");
  4. $mail = new PHPMailer();
  5. $mail->IsSMTP(); // send via SMTP
  6. $mail->Host = "remote.smtp.server"; // SMTP servers
  7. $mail->SMTPAuth = true; // turn on SMTP authentication
  8. $mail->Username = "me@localhost"; // SMTP username
  9. $mail->Password = "123456"; // SMTP password
  10.  
  11. $mail->From = "myemail@localhost";
  12. $mail->FromName = "My Name";
  13.  
  14. // 執行 $mail->AddAddress() 加入收件者,可以多個收件者
  15. $mail->AddAddress("to@email.com","Josh Adams");
  16. $mail->AddAddress("to2@email.com"); // optional name
  17.  
  18. $mail->AddReplyTo("jyu@aemtechnology.com","AEM");
  19.  
  20. $mail->WordWrap = 50; // set word wrap
  21.  
  22. // 執行 $mail->AddAttachment() 加入附件,可以多個附件
  23. $mail->AddAttachment("path_to/file"); // attachment
  24. $mail->AddAttachment("path_to_file2", "INF");
  25.  
  26. // 電郵內容,以下為發送 HTML 格式的郵件
  27. $mail->IsHTML(true); // send as HTML
  28. $mail->Subject = "testing email";
  29. $mail->Body = "This is the <b>HTML body</b>";
  30. $mail->AltBody = "This is the text-only body";
  31.  
  32. if(!$mail->Send())
  33. {
  34.     echo "Message was not sent <p>";
  35.     echo "Mailer Error: " . $mail->ErrorInfo;
  36.     exit;
  37. }
  38.  
  39. echo "Message has been sent";
  40. ?>

kevin0523 發表在 痞客邦 留言(0) 人氣()

以下是用 PHP 列出目錄內容的方法,當然也可以略為修改以程式碼改為 function 使用:

PHP:
  1. <?php
  2. // 定義要開啟的目錄
  3. $dir = "/var/www/vhosts/dir";
  4.  
  5. // 用 opendir() 開啟目錄,開啟失敗終止程式
  6. $handle = @opendir($dir) or die("Cannot open " . $dir);
  7.  
  8. echo "<b>Files in " . $dir . ":</b><br/>";
  9.  
  10. // 用 readdir 讀取檔案內容
  11. while($file = readdir($handle)){
  12.     // 將 "." 及 ".." 排除不顯示
  13.     if($file != "." && $file != ".."){
  14.         echo "$file<br/>";
  15.     }
  16. }
  17.  
  18. // 關閉目錄
  19. closedir($handle);
  20. ?>

kevin0523 發表在 痞客邦 留言(0) 人氣()

現在網上購物越來越普及,所以對信用卡號碼的檢查也變得重要。要檢查信用卡號碼,一般可以用 LUHN 演算法來實現。現在大部份的主要信用卡也是使用 LUHN 演算法,包括 Visa, Master Card, American Express 及 Discover 等。LUHN 演算法只可以檢查信用卡號碼的合法性,而不會檢查信用卡其他資訊,包括是否過期。使用方法為:

1. 檢查信用卡號碼是否 16 位。
2. 將信用卡號碼切割成 16 個個別數字。
3. 將上面切割得的所有數字,由左至右起計,每逄單數位置的數值乘 2。
4. 將加總後所有結果都切割成個別數字再相加。
5. 將上面求得的總數求出 10 的餘數,如果餘數是 0 便表示信用卡號碼正確,否則便是錯誤。

以下是 PHP 使用 LUHN 演算法檢查信用卡號碼的函式:

PHP:
  1. <?php
  2. /* luhn_checker(): This is a small PHP function for checking valid *
  3. * credit card with LUHN algorithm                                  *
  4. *                                                                  *
  5. * Last updated: 26 August 2007                                     *
  6. * This is a free PHP script under GNU GPL version 2.0 or above     *
  7. * Copyright (C) 2007 Sam Tang                                      *
  8. * Feedback/comment/suggestions : http://www.real-blog.com/        */
  9.  
  10. function luhn_checker($card_num){
  11.     // 將非數字的字串移除
  12.     $card_num = preg_replace("/\D|\s/", "", $card_num);
  13.  
  14.     $sum = 0;
  15.     for($i=0; $i<strlen($card_num); $i++){
  16.         $digit = substr($card_num, $i, 1);
  17.         if(($i % 2) == 0){
  18.             // 在單數位置的數值乘 2
  19.             $digit = $digit * 2;
  20.         }
  21.  
  22.         if ($digit> 9)  $digit = $digit - 9;
  23.         $sum += $digit;
  24.     }
  25.  
  26.     if(($sum % 10) == 0 && strlen($card_num) == 16){
  27.         return TRUE;
  28.     }else{
  29.         return FALSE;
  30.     }
  31. }
  32.  
  33. /* Example
  34. if(luhn_checker("1234567812345678")){
  35.     echo "Correct!";
  36. }else{
  37.     echo "Wrong card number!";
  38. }
  39. */
  40. ?>
9) $digit = $digit - 9; $sum += $digit; } if(($sum % 10) == 0 && strlen($card_num) == 16){ return TRUE; }else{ return FALSE; } } /* Example if(luhn_checker("1234567812345678")){ echo "Correct!"; }else{ echo "Wrong card number!"; } */ ?>

kevin0523 發表在 痞客邦 留言(0) 人氣()

  1. 在 PHP 內用 mail() 發出郵件時,如果沒有指定 Return Path,系統便會以預設的電郵地址代替 (例如 me@localhost 這類)。以下是一個常見的錯誤:

    PHP:
    1. <?php
    2. $header = "From:My Name<my_name@mydomain.com>";
    3. mail($to, $subject, $email_body, $header);
    4. ?>

     

    以上設定了所發出的郵件的 From 內容,但這是不夠的,只要查看所發出郵件的 header,會發現有一個 Return-Path 顯示系統的預設電郵。因為現時 spam 非常猖獗,很多 email server 會這類 email 檔掉或者標示成 spam,將以上程式碼改成這檔便可以避免這個問題:

    PHP:
    1. <?php
    2. $header = "From:My Name<my_name@mydomain.com>\r\n";
    3. $header .= "Reply-To: My Name<my_name@mydomain.com>\r\n";
    4. $header .= "Return-Path: My Name<my_name@mydomain.com>\r\n";
    5. mail($to, $subject, $email_body, $header);
    6. ?>

     

  2.  

kevin0523 發表在 痞客邦 留言(0) 人氣()


防止機器人大量註冊程式

http://www.ez2.us/~ricky/RobotAway/

kevin0523 發表在 痞客邦 留言(0) 人氣()

# POP3 檢查 user 身份

Code:

function ecstart_pop3_check($popserver, $user, $password) {
        $imap = imap_open("{".$popserver.":110/pop3}INBOX", $user, $password) ;
        if ($imap) {
                return true ;
        }
        else {
                return false ;
        }
}

kevin0523 發表在 痞客邦 留言(0) 人氣()


如果你網站空間的php.ini文件的magic_quotes_gpc設成了off,
那麽PHP就不會在敏感字元前加上反斜杠(\),
由於表單提交的內容可能含有敏感字元,如單引號('),
就導致了SQL injection的漏洞。在這種情況下,
我們可以用addslashes()來解決問題,
它會自動在敏感字元前添加反斜杠。

但是,上面的方法只適用於magic_quotes_gpc=Off的情況。
作爲一個開發者,
你不知道每個用戶的magic_quotes_gpc是On還是Off,
如果把全部的資料都用上addslashes(),
那不是“濫殺無辜”了?假如magic_quotes_gpc=On,
並且又用了addslashes()函數,那讓我們來看看:

kevin0523 發表在 痞客邦 留言(0) 人氣()

以下函數用來取出檔案中的數行存到陣列中。

PHP CODE:

<?php

function FetchFileLine($file,$count=0
){
 
$handle fopen($file"r"
);
 if (
$handle
) {
   while (!
feof($handle
)) {
     if(
$c>=$count
)
       break;

       
$lines[] = trim(fgets($handle4096
));
       
$c+=1
;
   }
   
fclose($handle
);
 }
  return  
$lines
;
}

?>

kevin0523 發表在 痞客邦 留言(0) 人氣()

用來計算程式所需的執行時間。

PHP CODE:

 <?php
function caclutime
(){ 
  $time explode" "microtime
()); 
  $usec = (double)$time[0
]; 
  $sec = (double)$time[1
]; 
return 
$sec $usec

}


?>

kevin0523 發表在 痞客邦 留言(0) 人氣()

«12