今天從嘉義跑到台南聽 酷!學園 舉辦的 2008八月份 SA@Tainan PHP 程式設計 - 初階資訊安全(8/30) ,今天一大早就起床了,差點沒趕上火車,到了台南地點在社區大學,其實蠻近的,大概騎車5分鐘就到了喔,其實不會很趕,到了現場,第一次看到梁楓大大阿,感覺很有威勢,我看現場年齡層分佈好像很廣,有很多都是長輩了,不過大部分還是學生為主,然後我想大概有很多是工作人員,其實我都不太認識,我大概只知道梁楓大大,因為在酷!學園也一段時間了,哈哈,今天講的主題,我非常的有興趣,我看投影片還蠻多的,可是都是跳著講,然後一些實做的部份,然後最後一小時是在解如何拿到 Linux 的主機 /etc/passwd 的資訊。
Archive for the 'sql' Category
轉載自: PHPChina
近來接受 BBT 的培訓,做一個投票系統。系統程式碼倒不是很難,但是我的時間主要花費在了研究字符集和編碼上面。MySQL 和 Apache 兩個系統的編碼(字符集)問題讓我費勁腦筋,吃盡苦頭。網上對這些問題的解決比較零散,比較片面,大部分是提供解決方法,卻不說為什麼。於是我將這幾天收穫總結一下,避免後來者再走彎路。這篇文章對 PHP 編寫有一點幫助(看完你就知道,怎樣讓你的 PHP 程式在大部分空間提供商的伺服器裡顯示正常),但是更多幫助在於網路伺服器的架設和設置。
先說 MySQL 的字符集問題。Windows 下可透過修改 my.ini 內的
# CLIENT SECTION
[mysql]
default-character-set=utf8
# SERVER SECTION
[mysqld]
default-character-set=utf8
其實這個安全性的問題,在目前台灣網站都存在這樣的問題,大家平常用 $_POST,$_GET 用得很順利,但是沒有想過帳號密碼被 SQL injection 破解,當網站被破解了,基本上你損失就是相當嚴重,網路上也有很多攻擊方式,不過這方法是最常被拿出來講的,我自己有一套解決方式,除了比較重要的地方,就是輸入帳號密碼的地方要加強防護之外,加上數字驗證碼,還要 check 帳號的特性,我底下是我驗證帳號密碼機制
if($user_name == '' || $user_passwd == ''){
ErrMsg("帳號或密碼不得空白");
}
if (!preg_match('/^\w+$/', $user_name)){
ErrMsg("請勿攻擊本站台");
}
最近在幫友人處理他們web跟資料庫的轉移,然後發現他們的資料庫是很古早的資料庫 MySQL 3.23.49 版本,相當古老吧,因為那個時候我才正值大二時代,剛開始接觸電腦的時候而已,連最基本的資料庫都不知道是什麼,哈哈經過這麼久終於發展到 MySQL 5版本了,不過從 MySQL 4.x 開始支援的 Unicode 系統,所以當時也有很多人遇到轉換問題,我今天也遇到相同問題,不過是在轉換到 Linux Centos 5.1 版本底下,原本機器使用 Red Hat Linux 7.3,真是一個很舊的版本,因為 Red Hat Linux 已經到 9.0 版本了,而且目前不維護了。
之前版本轉換都沒有什麼問題,就是 4.x 轉到 5.x 版本,參可我之前寫的這篇 [Mysql] 資料庫備份[big5]latin1轉換成utf-8,如果這篇文章解決不了的話,那就可能用我底下的方法了,不過過上面那個方法不適合用在 3.23 轉到 5.x 版,因為還是會發生亂碼現象,可是這只會發生在 Linux 底下,因為我用 FreeBSD 7.0 R 版,在這環境底下是沒有問題的,所以今天很囧,都在處理 Linux 的部份,哈哈,所以大家還是去用 FreeBSD 吧
[MySQL] outer join 使用
Posted in sql on Jan 26th, 2008
之前我遇到問題,有兩個表格 a 跟 b,分別利用 id 當作連接,當你使用 where a.id = b.id 的時候,當 b 資料表沒有對應到的時候,撈出來的資料就會少一筆,問題如下
: 想請教各位大大,
: 如果我現在有兩個table t1,t2
: Table t1:
: uid INT
: name NCHAR(10)
: Table t2:
: uid INT
: [...]
今天老師寄信給我,說我轉移的 journal.CN 的文章,出現以前的文章,不能看到圖片,我去查了一下,發現 AMS 文章系統的編輯軟體,相當爛,它的插入圖片,竟然是用絕對網址,然後他會先讀取 mainfile.php 裡面的
define('XOOPS_URL', 'http://journal.cn.ee.ccu.edu.tw');
然後把圖片的網址寫死,而不是動態的,就是利用相對路徑,所以我利用了 replace 的功能來解決全部文章圖片的問題,語法如下
UPDATE `xoops_ams_text` SET `hometext` = REPLACE(`hometext`,'140.123.107.38/~cnews','journal.cn.ee.ccu.edu.tw');
上面是說,取代 hometext 這個欄位的,找到 140.123.107.38/~cnews 取代成 journal.cn.ee.ccu.edu.tw
這語法相當好用,大家可以嘗試看看,畢竟如果用 php 的 replace 語法,還要利用陣列方式,比較麻煩
[BCB] 如何利用連結 MySQL 5以上跟 MSSQL Server
Posted in BCB[Borland C/C++ Builder], sql on Jan 18th, 2008
這兩天開始玩 BCB 的這東西,其實我原本就有打算要學一套視窗軟體,畢竟好像還不錯,可以寫寫軟體,所以就拿了 BCB 來學習。
剛開始想說寫個要跟 MSSQL 資料庫的統計圖,發現 BCB 並不支援 MSSQL,解決方式,當然就是拿 Delphi 的元件
利用 Delphi 7 的 MSSQL Driver Update 內的「dbexpmss.dll」 Copy 到「 $(BCB)\BIN 」
然後在設定 dbxconnections.ini
[MSSQL]
GetDriverFunc=getSQLDriverMSSQL
LibraryName=dbexpmss.dll
VendorLib=oledb
HostName=ServerName
DataBase=Database Name
User_Name=user
Password=password
BlobSize=-1
ErrorResourceFile=
LocaleCode=0000
MSSQL TransIsolation=ReadCommited
OS Authentication=False
然後再來是 MySQL5,原本的 BCB 並不支援 MSQL5 所以自己另外找了文
http://www.justsoftwaresolutions.co.uk/delphi/dbexpress_and_mysql_5.html
剛剛在 ptt 遇到之前當兵的工作同事,話說他要去中華電信工作了,還真是不錯,他在 database 版問一個取代的問題,然後我幫他找一下答案,解決了,這可以用 sql 語法解決,或者是用程式都可以
問題:
在MySQL
我有大約50000筆資料 有個欄位像這樣
0040000001~0040050000
現在因故要把 004改成005
變成像這樣
0050000001~0050050000
我的解法:
UPDATE `test` SET `test` = CONCAT( '005', SUBSTRING( `test` , 4 ) ) WHERE
SUBSTRING( `test` , 1, 3 ) = '004'
有更快解法嗎?
REPLACE 好像不行,因為後面數字也會被改到,不過還是主要用 SUBSTRING
剛剛在處理老闆的機器移機問題,雖然有給我 root 權限,可是 MySQL 密碼沒有給我 root 的,然後我去看程式,都沒有用到 root ,都是用普通使用者,所以就上網找一下忘記密碼怎麼處理,其實找到的方法就是利用 command line 的方法,相當方便,最終解決方法還是文字介面,作法如下
首先先 Kill 掉所有 MySQL 的連線
# on Linux
/etc/init.d/mysqld stop
# on FreeBSD
/usr/local/etc/rc.d/mysql-server stop
killall -9 mysqld
然後進入 MySQL 安全模式
mysqld_safe -u root --skip-grant-tables &
然後利用文字介面修改 MySQL root 密碼
mysql
>use mysql
>UPDATE user SET password=password('這裡輸入你的密碼') where user='root';
>FLUSH PRIVILEGES;
>exit
dump database
mysqladmin -uroot -p flush-logs
mysqldump phpbb2 -B -uroot [...]
這個功能還蠻需要的,底下就是三個例子
以下方法,可以幫助隨機取得廣告資料、最新消息等,隨機產生資料。
使用 SQL 語法的 TOP n 來指定取得筆數,再用 ORDER BY 的方式,來亂數取得資料,並排序。
MS SQL:SELECT TOP 1 * FROM TABLE WHERE 條件 ORDER BY NEWID()
ACCESS:SELECT TOP 1 * FROM TABLE WHERE 條件 ORDER BY RND(數字欄位名稱)
MYSQL:SELECT * FROM TABLE ORDER BY RAND() LIMIT 1
http://blog.xuite.net/jameschih/java/8308864
