用 PHP 的 get_cfg_var 函式取出 php.ini 設定檔的參數值:
get_cfg_var("upload_max_filesize");
get_cfg_var("post_max_size");
其中 upload_max_filesize 和 post_max_size 都是 php.ini 裡面的變數,有這二個參數在檔案上傳的時候會蠻有用的。
軟體開發和生活瑣事
用 PHP 的 get_cfg_var 函式取出 php.ini 設定檔的參數值:
get_cfg_var("upload_max_filesize");
get_cfg_var("post_max_size");
其中 upload_max_filesize 和 post_max_size 都是 php.ini 裡面的變數,有這二個參數在檔案上傳的時候會蠻有用的。
自從上次改過別人的 PHP Captcha 以後,這次玩得更瘋了。
今天跟 scwu 聊過以後想出一堆鬼主意來當作 captcha 上面的文字,可以考慮的有注音文、火星文和一堆有的沒的符號。後來想整人所以決定讓大家動動頭腦,出點數學題目讓大家做,如加減乘除:
不過加減乘除對對電腦來說太簡單了,以後要試試看來點方程式求解,有必要來個微積分也行,不過這樣就得大費周章的請 LeTex 出來幫忙了。
上面的 captcha 我改名叫做「mathcha」,程式碼如下:
<?php
$font_face = 'arialbd.ttf'; //font you want to use
$width='80';
$height='25';
$font_size = $height * 0.65;
$image = imagecreate($width, $height) or die('Cannot initialize new GD image stream');
$background_color = imagecolorallocate($image, 0, 0, 0);
$text_color = imagecolorallocate($image, 255, 255, 255);
$noise_color = imagecolorallocate($image, 150, 255, 150);
//create dots
for( $i=0; $i<($width*$height)/3; $i++ ) {
imagefilledellipse($image, mt_rand(0,$width), mt_rand(0,$height), 1, 1, $noise_color);
}
//print text
$n1 = mt_rand(1,20);
$n2 = mt_rand(1,20);
$string = "$n1 + $n2";
$textbox = imagettfbbox($font_size, 0, $font_face, $string) or die('Error in imagettfbbox function');
$x = ($width - $textbox[4])/2;
$y = ($height - $textbox[5])/2;
imagettftext($image, $font_size, 0, $x, $y, $text_color, $font_face , $string) or die('Error in imagettftext function');
/* output captcha image to browser */
header('Content-Type: image/jpeg');
imagejpeg($image);
imagedestroy($image);
$_SESSION['mathcha'] = $n1 + $n2;
?>
記得你把你用的字型和這個程式放在同一個目錄。
SQL Injection 是一個寫 PHP 時大家常常忘掉的問題,但是一忘掉就會讓駭客有機可乘。
用 PHP 做登入時,SQL 語法大概會長這樣:
select * from member where ID = '$USER_ID' and password = '$PASSWORD'
其中錢字號的是 PHP 的變數。登入時使用者填「test」、密碼填「123」,則 SQL 語法會變成下面這樣:
select * from member where ID = 'test' and password = '123'
不過萬一有人要惡作劇,使用者填「test」、密碼填「’ or ”=’」,則 SQL 語法就會變成下面這樣:
select * from member where ID = 'test' and password = '' or ''=''
看出來了嗎?如果把顏色去掉,最後一個判斷式是「or ”=”」,而這個判斷永遠會成立,所以即使前面沒有密碼也有資料會被列出來。這是最簡單的 SQL Injection,如果駭客心狠手辣的話,還能夠將機密資料列出、修改資料,甚至直接將資料庫刪除,所以不小心不行。如果有興趣的話可以參考以下相關網頁:
資安論壇 :: 觀看文章 – SQL Injection之解決建議措施及相關資訊彙整
http://forum.icst.org.tw/phpBB2/viewtopic.php?t=4376
SQL Injection WhitePaper
http://www.spidynamics.com/whitepapers/WhitepaperSQLInjection.pdf
PHP 5 有提供 magic quote 會自動將單引號、雙引號加上反斜線,網路上也有寫好的程式可以使用,像是我之前寫的「PHP avoid SQL Injection 2」,但事實上這樣還是不夠的。
SQL 語法中,欄位的資料型態會有不同的語法,像說 SerialNumber = 123 和 UserName = ‘zero’,就有單引號的差別,如果 PHP 讀取欄位資料後沒有特別去注意資料型態,可能就會發生 SQL 語法中字串沒有使用引號的錯誤,丟出錯誤訊息一樣很危險。所以在開始使用變數時,最好做資料型態的轉換或是辨認,以免發生意想不到的狀況。
想要試試看自己的網頁有沒有上述的漏洞,可以使用 Parosproxy 這套漏洞檢測軟體做測試,他會再抓取所有可以使用的網頁連結以後,對每個網頁進行特定的檢測。
首先要先設定瀏覽器的 proxy 設定,讓瀏覽器透過 Paros 來上網,設定如下:

接下來把 Paros 啟動,然後讓瀏覽器瀏覽你準備要測試的網頁,這樣 Paros 就會抓到網頁位置,抓到以後就可以準備掃瞄。

在上面的清單中,選擇要掃瞄的網站以後,點選功能表的 Analyse -> Spider,抓取整個網站所有的超連結。

抓取後左下方應該會出現網站內的超連結列表,Paros 之後就針對這幾個連結進行漏洞測試。準備好開始測試後,點選 Analyse -> Scan 即可。

待掃瞄結束後,左下角 alert 頁籤中會顯示出你網站有漏洞的網頁,以及漏洞的類型,但是並不是有顯示就表示一定有漏洞,也不表示找不到漏洞就絕對安全,請自行判斷掃瞄結果。

掃瞄結束後,記得把瀏覽器的 proxy 設定改回來,不然 Paros 關掉以後就不能上網了。
int a = 0;
int b = 1;
if ((a=1) || (b=2)) {
printf("Hello, a=%d, b=%d", a, b);
}
else {
printf("World! a=%d, b=%d", a, b);
}
令我出乎意料的,結果是「Hello, a=1, b=1」,也就是說「||」在第一個判斷成立以後不會執行第二個判斷。
不過,這題題目其實是要考你 if 必須注意不可將「==」打成「=」。但是既然是錯誤的程式碼,還要我們告訴他執行結果,我很想知道出題老師在想什麼。
Necessary ports:/usr/ports/graphics/ImageMagick
/usr/ports/print/teTeX
/usr/ports/print/ghostscript-gpl
/usr/ports/print/dvips
Following the official wiki, install the plugins in the directory. It will be in dokuwiki/lib/plugins. After this, fix class.latexrender.php because the paht of the program is not the same as Linux system.
class.latexrender.php (line:36 – 39):var $_latex_path = "/usr/local/bin/latex";
var $_dvips_path = "/usr/local/bin/dvips";
var $_convert_path = "/usr/local/bin/convert";
var $_identify_path="/usr/local/bin/identify";
If Latex won’t work, try this way:
https://b2.zeroplex.tw/2009/02/use-latex-in-mediawiki-in-freebsd.html