2008年11月27日 星期四
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時的內文
從網路上看了一些資料,歸結出下列函數供大家參考
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";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">
當然是更安全,不過就喪失程式設計的通用性了,見仁見智,看個人習慣吧!!