2008年12月12日 星期五

偷學ㄧ招 JQuery

  1. /*在 <body>...</body> 內放置超連結 a 元素和一個 id 為 mytext 的 div 元素*/
  2. <a href="http://www.google.com.tw/" id="link">Google</a>
  3. <div id="mytext"></div>
  4.    
  5. /*在 <head>...</head> 內加入下列 script*/
  6. <script type="text/javascript">
  7. /* 建立 onload 事件 */
  8. $(function(){
  9.   /* 建立 id 為 link 元素的 mouseover 滑鼠移入事件 */
  10.   $("#link").mouseover(function(){
  11.     /* 將 id 為 mytext 元素的 inline 內容改為 link 元素的 inline 文字 */
  12.     $("#mytext").html($("#link").html());
  13.   });
  14.        
  15.   /* 建立 id 為 link 元素的 mouseout 滑鼠移出事件 */
  16.   $("#link").mouseout(function(){
  17.     /* 將 id 為 mytext 元素的 inline 內容清空 */
  18.     $("#mytext").html("OOKK");
  19.   });
  20. });
  21. </script>

頁面讀取完成即聚焦於第一個表單元件,並加入聚焦提示。送出時驗證是否都有填寫資料,若無則浮現提示文字,表單送出後將 submit 按鈕停用。

 

  1. <form action="javascript:void(0);" id="form1">
  2.     <div>
  3.       <label for="uname">姓名:</label>
  4.       <input type="text" name="uname" id="uname" class="input" />
  5.       <span id="name_msg" class="msg"></span>
  6.     </div>
  7.     <div>
  8.       <label for="pwd">密碼:</label>
  9.       <input type="password" name="pwd" id="pwd" class="input" />
  10.       <span id="pwd_msg" class="msg"></span>
  11.     </div>
  12.     <p><input type="submit" /></p>
  13.   </form>

Javascript 源碼

  1. /* 頁面 onload 事件 */
  2. $(function(){
  3.   /* 定義 boolean 變數,記錄是否驗證成功 */
  4.   var flag = false;
  5.  
  6.   /* 加入 input 類型為 text, password 元件的聚焦事件 */
  7.   $(":text, :password").focus(function(){
  8.     /* 將這些物件聚焦時的 css 設為 1 像素的黑色邊框,底色為淡黃色 */
  9.     $(this).css({border: "1px solid #000", background: "#ffea45"});
  10.   });
  11.   /* 加入 input 類型為 text, password 元件的失焦事件 */
  12.   $(":text, :password").blur(function(){
  13.     /* 將這些物件失焦時的 css 設為 1 像素的灰色邊框,底色為白色 */
  14.     $(this).css({border: "1px solid #ccc", background: "#fff"});
  15.   });
  16.   /* 表單送出事件加入 submit 按鈕停用 */
  17.   $("form").submit(function(){
  18.  
  19.     /* 驗證表單內命名為 uname 的元件是否有值,若無則顯示提示文字。
  20.        ※這邊使用了 jQuery 的串接特色
  21.        ※find 為尋找元素的函式 */
  22.     if($(this).find("input[@name=uname]").val() == ""){
  23.       $("#name_msg").html("請輸入姓名").css("color", "#f00").fadeIn();
  24.       flag = false;
  25.     }else{
  26.       $("#name_msg").hide();
  27.       flag = true;
  28.     }
  29.    
  30.     /* 驗證表單內命名為 pwd 的元件是否有值,若無則顯示提示文字 */
  31.     if($(this).find("input[@name=pwd]").val() == ""){
  32.       $("#pwd_msg").html("請輸入密碼").css("color", "#f00").fadeIn();
  33.       flag = false;
  34.     }else{
  35.       $("#pwd_msg").hide();
  36.       flag = true;
  37.     }
  38.    
  39.     /* 若驗證通過則停用 submit 按鈕,反之則取消送出 */
  40.     if(flag)
  41.       $(":submit").attr("disabled", "true");
  42.     else
  43.       return false;
  44.   });
  45.  
  46.   /* 選擇第一個 input 元件,並加入聚焦(focus)事件 */
  47.   $("input:first").focus();
  48. })


JQuery 在網頁執行的時候
會load一次JQuery 的function

但是如果用ajax時,因為第一次抓的時候,並沒有抓到ajax的頁面
所以當用ajax並更出來的頁面,就不會執行JQuery function的指令。

jQuery.ajaxComplete(function(){//你要做的事});

 

寫給設計人的10個jQuery特效

http://easonyo.pixnet.net/blog/post/22888002

15天學會jQuery (11-15)

http://easonyo.pixnet.net/blog/post/22802674

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">
當然是更安全,不過就喪失程式設計的通用性了,見仁見智,看個人習慣吧!!