2008年11月25日 星期二

win32 下 PHP讀取中文檔名

在設計程式時,常會用到上傳圖檔或其他檔案,
但是PHP讀取時會因為跳脫字元而使的中文檔名掛掉,
所以一般都會重新編碼
但這樣在管理上就比較麻煩

讀取中文檔時:htmlentities(urlencode($pic_file))

寫入中文檔時:
function BIG5_name($name){

 //判別中文是否能轉換為BIG5碼,若不行則以日期顯示
 
 $tname=iconv("utf-8","big5",$name);
  if( mb_strlen($name,"utf-8")  <>  mb_strlen($tname,"big5")  ){
  $per_name_big5="";
        for($ai=0;$ai < mb_strlen($name,"UTF-8");$ai++){
             $str_tmp=mb_substr($name,$ai,1,"UTF-8");
             
             mt_srand((double)microtime()*1000000);
             if( mb_strlen(iconv("utf-8","big5",$str_tmp),"big5") ==0 )
               $per_name_big5 .= mt_rand(10,99);
             else $per_name_big5 .=$str_tmp;   
        }
 }else $per_name_big5=$name;


 
 //判別中文是否為跳脫字元(許功蓋),若不行則以日期顯示
 $name=$per_name_big5;
 $tname=iconv("utf-8","big5",$name);
  if(substr_count(urlencode($tname),"%5C") > 0 ) {
        $per_name_big5="";
        for($ai=0;$ai < mb_strlen($name,"UTF-8");$ai++){
             $str_tmp=mb_substr($name,$ai,1,"UTF-8");
             
             mt_srand((double)microtime()*1000000);
             if(substr_count(urlencode(iconv("utf-8","big5",$str_tmp)),"%5C") > 0 )
               $per_name_big5 .= mt_rand(10,99);
             else $per_name_big5 .=$str_tmp;   
        }
   
  }else $per_name_big5=$name;

  

  return $per_name_big5;
}

2008年11月19日 星期三

檢查網頁上發送EMAIL時的內文

如果你在網路上有用到 PHP的mail function,那就必須注意一些 語法漏洞,避免被當成垃圾信跳板。

從網路上看了一些資料,歸結出下列函數供大家參考

mail($to, $subject, $message, $headers);

//$to = 'bob@example.com';  //$subject = 'Email Subject';  //$message = 'Enter your messages (HTML tags)'  // To send HTML mail, the Content-type header must be set $headers  = 'MIME-Version: 1.0' . "\r\n"; $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
$headers .= "Organization: Sender Organization\r\n"; $headers .= "X-Priority: 3\r\n"; $headers .= "X-Mailer: PHP". phpversion() ."\r\n";
$headers .= 'To: Twist , Sanu ' . "\r\n"; $headers .= 'From: Birthday Reminder ' . "\r\n"; $headers .= 'Reply-To: Birthday Reminder ' . "\r\n"; $headers .= 'Cc: birthdayarchive@example.com' . "\r\n"; $headers .= 'Bcc: birthdaycheck@example.com' . "\r\n";








非常嚴謹檢查EMAIL

function check_email_address($email) {
    if (!ereg("^[^@]{1,64}@[^@]{1,255}$", $email)) {
  return false;
    }
    $email_array = explode("@", $email);
    $local_array = explode(".", $email_array[0]);
    for ($i = 0; $i < sizeof($local_array); $i++)
 {
  if (!ereg("^(([A-Za-z0-9!#$%&'*+/=?^_`{|}~-][A-Za-z0-9!#$%&'*+/=?^_`{|}~\.-]{0,63})|(\"[^(
\\|\")]{0,62}\"))$", $local_array[$i]))
  {
   return false;
  }
    }
    if (!ereg("^\[?[0-9\.]+\]?$", $email_array[1]))
 {
  $domain_array = explode(".", $email_array[1]);
  if (sizeof($domain_array) < 2) {
   return false;
  }
  for ($i = 0; $i < sizeof($domain_array); $i++)
  {
   if (!ereg("^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]+))$", $domain_array[$i])) {
    return false;
   }
  }
    }
    return true;
}

檢查信件內文(MULTI-AREA)
function contains_bad_str($str_to_test) {
  $bad_strings = array(
                "content-type:"
                ,"mime-version:"
                ,"multipart/mixed"
    ,"Content-Transfer-Encoding:"
                ,"bcc:"
    ,"cc:"
    ,"to:"
  );
 
  foreach($bad_strings as $bad_string) {
    if(eregi($bad_string, strtolower($str_to_test))) {
      echo "發現危險字詞 $bad_string ,此字詞可能導致  injection 漏洞攻擊,故無法發送MAIL。";
      exit;
    }
  }
}

檢查單行(TEXT)資料
function contains_newlines($str_to_test) {
   if(preg_match("/(%0A|%0D|\\n+|\\r+)/i", $str_to_test) != 0) {
     echo "你所輸入的資料有關鍵字詞  $str_to_test 可能隱含 injection 漏洞攻擊,請重新檢查!!";
     exit;
   }
}
檢查

2008年11月18日 星期二

小心$_SERVER['PHP_SELF]使用漏洞

如果你習慣在FORM傳遞資料時用PHP_SELF,那就必須注意Cross-site scripting attacks的問題!!

如果你習慣在FORM傳遞資料時用PHP_SELF,那就必須注意Cross-site scripting attacks的問題!!


一般在寫  FORM 時,習慣都會在 傳址網頁寫 
action=$_SERVER['PHP_SELF']
但是有時這將導致XSS的漏洞攻擊,簡單說明如下。

  假設此為 test.php 內容:
  <form action="<?=$_SERVER['PHP_SELF'];?>">
   <input type="submit" value="Submit!">
  </form>
如果輸入者在網址列搞花樣
test.php/%22%3E%3Cscript%3Ealert('Hello,word')%3C/script%3E
結果會變成下面的狀態
<form action="test.php/"><script>alert('xss')</script>"

就這樣可以把 script 勘入搞花樣了,最安全的方式還是要將任何外部引用資料做檢查及安全處理($_GET,$_POST,$_COOKIE等)
最簡單的方式就是 htmlentities
所以應該如下才是安全的寫法
<form action="<?=htmlentities($_SERVER['PHP_SELF']); ?>">

當然,你直接寫成
<form action="test.php">
當然是更安全,不過就喪失程式設計的通用性了,見仁見智,看個人習慣吧!!