目前分類:程式 (64)

瀏覽方式: 標題列表 簡短摘要
參考竹貓星球此篇文章 - [分享] phpBB 討論區由 2.0.23 轉換為 3.0.1 成功經驗

原本的環境是 MySQL 4.0.27,用的是 Big5 編碼

按照教學文章的做法相當順利,除了中間有遇到使用者 ID 重複的問題外 ( 進 phpbb_users Table  刪除即可 )

其它都還蠻順利的,升級完就是 3.0.1 + UTF-8 編碼了

希望這次升級能擋住機器人留言的攻擊

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

前幾天在唸 PHP5 OO 的東西,邊看邊學邊練英文(有些看不太懂 Orz)

http://devzone.zend.com/manual/language.oop5.html

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

新的語言,記錄下來也分享一下,以後陸續更新

[1] What the C or C++ Programmer Needs to Know About C# and the .NET Framework [ 來源網址 ]

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

最近在找工作,暫時記下連結,未來再來玩耍 : )

[1] http://hades.phparch.com/ceres/public/article/index.php/art::zend_framework::tutorial

[2] http://akrabat.com/zend-framework-tutorial/ ( 感謝 Jace 提供與推薦 )

ps. 最近發現好多公司都需要用 .NET 的工具來開發,似乎該來學習了 ?!
ps2. 我有一台了,已經打入冷宮
ps3. 沒錢,目前買不起,但對 Wii 比較有興趣
ps4. ( 夠了 .... 已經很冷了 )

Bojack 發表在 痞客邦 留言(1) 人氣()

這是個很久的問題了,還是記錄一下吧。

若先前從 MySQL 4.0 開發的資料庫升級到 4.1 版本之後,大部份都會有所謂「編碼」的問題。

今天處理的情況就是原本用 Big5 編碼的 Database 移到 MySQL 5.0 之後就變一堆亂碼了 ( 應該說都變成用 UTF-8 編碼 )

過去處理的情況就是將網頁也都一起轉為 UTF-8 的格式就可以解決了( 在這我是用 ConvertZ 來轉換 ),且用 UTF-8 編碼可以處理掉很多不必要的麻煩,像許功蓋亂碼的問題。

那要怎麼做?介紹一下二種方法。

第一個就是將全部的 SQL 內容都轉為 UTF-8 ,在建立 Database「校對」時選「utf8_general_ci」,SQL 語法如下。

CREATE DATABASE `資料庫名稱` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;


接下來就是匯入原本的 SQL 了,確認一下是否此時瀏覽器是否是用 UTF-8 編碼來觀看。

OK 的話,就再去設定一下連結資料庫的部份。

$dbhost="localhost";
$dbuser="xxx";
$dbpass="xxx";
$all_db="xxx";  //database
$db=mysql_connect($dbhost,$dbuser,$dbpass);
mysql_query("set character set utf8",$db);
mysql_query("SET CHARACTER_SET_database= utf8",$db);
mysql_query("SET CHARACTER_SET_CLIENT= utf8",$db);
mysql_query("SET CHARACTER_SET_RESULTS= utf8",$db);

mysql_select_db($all_db,$db);

另外網頁的部份,在 <head> 和 </head> 中間要加入或修改成這樣,這樣大部份亂碼的問題就會解決了。

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

但若堅持用原來的 Big5 來編碼呢?其實也是可行的。

在用 phpMyAdmin 建立資料庫的時候,在「校對」時選擇用「Big5」,SQL 語法如下:

CREATE DATABASE '資料庫名稱' DEFAULT CHARACTER SET big5 COLLATE big5_chinese_ci;

接下來匯入原本的 Dump 出來的 SQL ( 記得也是要用 Big5 來校對 )

最後我們去設定連接資料庫的部份,加入紅色那行即可。

$dbhost="localhost";
$dbuser="xxx";
$dbpass="xxx";
$all_db="xxx";  //database
$db=mysql_connect($dbhost,$dbuser,$dbpass);
mysql_query('SET NAMES big5');
mysql_select_db($all_db,$db);

當然這樣就可以解決亂碼的問題了,不過還是建議用 UTF-8 編碼才可以真正解決編碼的問題。

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

XML/SWF Charts

Peace Palace - 新一代的網路圖表工具

My Program - 好用的繪製圖表組件

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

參考 php manualforeach 就可以達成了!

function showpost_and_get()
{
    print "<hr><h2>POST</h2><br>";
    foreach($_POST as $varName => $value)
    {
        $dv=htmlspecialchars($value);
        print "Variable: $varName Value: $dv<br>";
    }

    print "<hr><h2>GET</h2><br>";
    foreach($_GET as $varName => $value)
    {
        $dv=htmlspecialchars($value);
        print "Variable: $varName Value: $dv<br>";
    }
}

Bojack 發表在 痞客邦 留言(1) 人氣()

先前看了一本 Ajax與Google Map API入門實作,裡面就有提到一些防止 SQL Injection & XSS 攻擊應注意的事項。還來不及記錄下來就將書還回去了,今晚從 Gea-Suan Lin 這又看到應注意的事項,我也來記錄一下好了,並附上我的註記。( 下面有些專有名詞小弟就不另做解釋了,請自查 Google )

1. PHP.ini 內的 Global register 務必設成 off

老生常談了,看一下 Darkhero 的說明吧。這個問題也是最常在 PHP 相關討論區被提出來的,都是 Global register 惹的禍丫!

2.防止 SQL Injection 攻擊

在經過 mysql_query 之前,先對傳進來的變數做 mysql_escape_string 處理。之前我做了一件蠢事,一直用錯用法。錯誤的用法如下:( Orz )

$sql = "select * from table where id = '$_POST[form_id]'";
mysql_escape_string($sql);
mysql_query($sql);


後來一直發生錯誤訊息,直到參考別人範例後才知道正確的用法如下:

$_POST["form_id"] = mysql_escape_string($_POST["form_id"]);
$sql = "select * from table where id = '$_POST[form_id]'";
mysql_query($sql);


附上一個說明 SQL Injection 的範例

3.防止 XSS 攻擊

XSS 也是一種可怕的攻擊方式,在 PHP 中可以利用 htmlentities 或 htmlspecialchars 把 INPUT 類的字串包起來處理!避免東西被人家看光光。 ( htmlentities 和 htmlspecialchars 的差別是在中文處理上,前者處理中文後會變成一堆亂碼就是了 )

4.善用 urlencode 來將 URL 的值編碼

引用一下 php 手冊內的說明:URL 由幾部分組成。如果你希望自己的資料被當作其中一項來解釋,則必須用 urlencode() 對其編碼

5.呼叫外部程式時記得用 escapeshellarg 函式來過濾

這情況是在 PTT 的 PHP 板看到的,有個好心人 ( 或有心人 ?? ) 分享了一個程式,讓大家去呼叫後可以處理並顯示目前的 ISP 為何。看起來還不賴,不過還是被 DarkKiller ( 也就是 Gea-Suan Lin ) 直接指出,若在程式內加入一行程式 system("rm -rf"); 那不就毀了 ?? 因此利用 escapershellarg 函式來過濾一下也是個不錯的方法。

6.避免使用常見的變數來命名

相信一些常見的變數,如 user 、 password 等字串都是最常見的命名規則,若試著改變其命名習慣,也能大幅降低被攻擊的可能性!

先記錄到這邊,以後若有想到再來update ~

Bojack 發表在 痞客邦 留言(1) 人氣()

若設計出來的 PHP 程式必須改 php.ini 的設定,但自己又不是系統管理者該怎辦?

請教 YDL 後,得知可以直接在程式內加入參數,修改後再看一下 phpinfo() 資訊果然有改變了。我的範例如下:

ini_set('max_execution_time', 0);
phpinfo();

不過也不是每個參數都可以改,詳細的參數設定請參照官網 ini_set manual

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

php5 網管實驗室 看到的好物,由於是用 socket 的方式來寄信,所以主機就算沒有架設 SMTP 也可以寄,但前提是要有一台可以讓你 relay 的機器。

先 copy 下面這段程式碼儲存成 phpbb-smtp.php

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

找了一下檔案下載的程式,在 EcStart 看到這個 Function,用它下載檔案的話,都會以「下載」的方式呈現,而不是直接在瀏覽器開啟檔案。

//下載的 Function
function dl_file($file){

   //First, see if the file exists
   if (!is_file($file)) { die("<b>404 File not found!</b>"); }

   //Gather relevent info about file
   $len = filesize($file);
   $filename = basename($file);
   $file_extension = strtolower(substr(strrchr($filename,"."),1));

   //This will set the Content-Type to the appropriate setting for the file
  switch( $file_extension ) {
     case "pdf": $ctype="application/pdf"; break;
     case "exe": $ctype="application/octet-stream"; break;
     case "zip": $ctype="application/zip"; break;
     case "doc": $ctype="application/msword"; break;
     case "xls": $ctype="application/vnd.ms-excel"; break;
     case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
     case "gif": $ctype="image/gif"; break;
     case "png": $ctype="image/png"; break;
     case "jpeg":
     case "jpg": $ctype="image/jpg"; break;
     case "mp3": $ctype="audio/mpeg"; break;
     case "wav": $ctype="audio/x-wav"; break;
     case "mpeg":
     case "mpg":
     case "mpe": $ctype="video/mpeg"; break;
     case "mov": $ctype="video/quicktime"; break;
     case "avi": $ctype="video/x-msvideo"; break;
     case "txt": $ctype="text/plain"; break;

     //The following are for extensions that shouldn't be downloaded (sensitive stuff, like php files)
     case "php":
     case "htm":
     case "html":die("<b>Cannot be used for ". $file_extension ." files!</b>"); break;

     default: $ctype="application/force-download";
   }

   //Begin writing headers
   header("Pragma: public");
   header("Expires: 0");
   header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
   header("Cache-Control: public");
   header("Content-Description: File Transfer");
  
   //Use the switch-generated Content-Type
   header("Content-Type: $ctype");

   //Force the download
   $header="Content-Disposition: attachment; filename=".$filename.";";
   header($header );
   header("Content-Transfer-Encoding: binary");
   header("Content-Length: ".$len);
   @readfile($file);
   exit;
}

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

今天參考了 IBM 台灣developerWorks 這篇 掌握 Ajax,第 1 部分 的文章實作出用 AJAX 技術來驗證使用者是否已註冊。為什麼要用 AJAX 來驗證呢?相信常常寫動態網頁程式的人都會遇到一個情況,使用者往往在填好表單 ( Form ) 裡的資料後 submit 到下一頁才能開始做處理。就以「註冊」這件事來說,使用者花了一些時間填好資料再送出到下一頁才發現,原來這個使用者名稱已經被使用了,就要請使用者另外再換個名稱才能完成註冊。

想看看,每一次 submit 都要將整個網頁的資料傳送到 Web Server 才能進行處理,那是不是能只將我要確認的資料先送過去處理,無須將整頁的資料都傳過去,既可快速達到我們的目的也能節省不必要的資料傳輸。AJAX 這東西就能幫我們處理的相當完美,引用一下 Sajax 網站 AJAX 運作示意圖。


當使用者使用任何一個瀏覽器時,可以透過 JavaScript 先幫我們傳送要處理的資料到 Web Server 上某個應用程式,當然這個應用程式要怎樣處理都可以囉!以我的例子來說,要找資料庫中有沒有一樣的身份證字號,如圖。

當使用者時按下「檢查是否已報名」時,就會去呼叫特定的 PHP 程式,將目前身份證字號這個 Text 框裡的值帶到指定的 PHP 中去處理,也就是去找有沒有這筆資料,有的話就回傳 1,反之 0 。最後再 Client 端再做處理,我是使用 alert 彈出式視窗來告訴使用者是否可以使用該名稱。

附上我的效果測試網址:( id 用 admin )
http://203.68.223.94/~bojack0812/ajax/ajax.html

Bojack 發表在 痞客邦 留言(1) 人氣()

PHP 宣布 PHP4 即將維護到 2007-12-31 後就不再支援了,希望所有使用 PHP4 的使用者能盡速升級到 PHP 5 ~ 未來若有緊急安全性的問題,還是會有 Patch 啦,這不必擔心,不過也只 Patch 到 2007-08-08 了。

原文如下:

Today it is exactly three years ago since PHP 5 has been released. In those three years it has seen many improvements over PHP 4. PHP 5 is fast, stable & production-ready and as PHP 6 is on the way, PHP 4 will be discontinued.

The PHP development team hereby announces that support for PHP 4 will continue until the end of this year only. After 2007-12-31 there will be no more releases of PHP 4.4. We will continue to make critical security fixes available on a case-by-case basis until 2008-08-08. Please use the rest of this year to make your application suitable to run on PHP 5.

For documentation on migration for PHP 4 to PHP 5, we would like to point you to our migration guide. There is additional information available in the PHP 5.0 to PHP 5.1 and PHP 5.1 to PHP 5.2 migration guides as well.

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

<?php

    $d = dir("路徑");

    echo "Handle: ".$d->handle."<br>\n";

    echo "Path: ".$d->path."<br>\n";

    while($entry=$d->read()) {

          echo $entry."<br>\n";

    }
   $d->close();

?>

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

老實說,這應該是不被允許的行為  ... 還是分享一下。

我現在改的這個版本是 vbulletin 2.2.2,因為版本老舊加上不會再花錢升級,所以只好用「手動」的方式來新增驗證碼的功能。

今天研究一下 vbulletin 的架構,它把每一頁的 HTML 都存在資料庫裡的 template table 裡面,這時才瞭解原來 vbulletin 如果被 hack 改掉首頁的話,就是因為資料庫被改掉了,難怪復原的方式就只要把資料庫再倒回去就好了。

要在註冊頁面產生驗證碼的話,首先一定要有一個產生亂數圖型的程式,程式碼如下,將它全部複製起來另外存成一個名叫 show_vaildcode.php ,同時上傳到 vbulletin 的目錄下。

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

<?php
echo $check = ( 2 > 1 ) ? 1 : 0;
?>

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

<?php
/*
Function Name: get_browser_version
Version: 0.1 (20070626)
Description: The function is to analyze what your browser is.
Author: Bojack
Author URL: http://blog.pixnet.net/bojack
*/

function get_browser_version()
{
        $browser_version = array("MSIE","Firefox","Opera","Safari","Netscape");
        $i = 0;
        while($i < count($browser_version))
        {
                if(strstr($_SERVER["HTTP_USER_AGENT"],$browser_version[$i])) {
                        echo $browser_version[$i];
                        exit;
                }
                $i++;
        }
        echo "Unknow";
}

get_browser_version();
?>

上面這個是自己硬寫出來的,就目前常見的瀏覽器來做分類。另外在 PTT 上也得知用 get_browser 這函式也可以達成,且得到的資訊又更多。不過要使用 get_browser 這函式要先去下載 php_browscap.ini 這檔案,再到 php.ini 去設定 browscap 的參數,將路徑指到 php_browscap.ini 所存放的位置後,重新啟動 Web Server 即可使用此函式。

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

有時候文字太長時,不想全部顯示出來的話,必須切到某一個長度後再加上 "..."

PHP 內建就有 mb_substr 這個好用的工具,不管哪種編碼都通吃!

只是在 compiler 時要加入 --with-mbstring 的參數

附上一個簡單的範例 ( Big5專用 )

<?php
$orginal_string = "今天天氣非常好";
$result = mb_substr($orginal_string, 0, 3, 'BIG-5');
echo $result; // 會輸出 "今天天"
?>

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

這是從 NEO 那看來的程式碼 !!

if (get_magic_quotes_gpc() == 1){
        switch ($REQUEST_METHOD)
        {
                case "POST":
                        while (list ($key, $val) = each ($HTTP_POST_VARS)){
                        $$key = stripslashes($val);
                        }
                break;


                case "GET":
                        while (list ($key, $val) = each ($HTTP_GET_VARS)){
                        $$key = stripslashes($val);
                        }
                break;
        }
}

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

1.Call-by-reference(又稱為call-by-address,或Call-by- location):呼叫程式傳送一個位址值(稱為l-value)給被呼叫的副程式,而這個位址值便是真正參數值(稱為r-value)所存放的位置。 如果所傳送的參數是一個表示式,如A+B時,則將其計算結果置於一個新的位置,並將位置的位址傳送給被呼叫的副程式。

2.Call-by-value:真正參數(actual parameter,即argument)首先被計算成值,然後將這個值傳送給被呼叫副程式的形式參數(formal parameter)。當副程式執行完畢後,並不將參數的結果值傳回給呼叫程式。

另外可以參考一下 Jollen's PHP 專欄 這篇 什麼是 call by reference 的說明。

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