2018年4月29日 星期日

在Linux上啟用php的mail()

在Linux上安裝了PHP後,一般來說是沒辦法是用php來寄電郵的,mail()會return nothing。若要啟用的話,需要先指定php如何寄電郵。

最簡單的方法是在其他網站註冊一個電郵賬號(例如gmail),然後用ssmtp以該電郵賬號的身份寄電郵。一般來說在自己的伺服器上架一個電郵伺服器(mail server)是個不實際的做法 ,一來相當費功夫,二來寄出去的電郵很可能會被當成spam而被擋掉,無論你怎麼設定都無法解決這個問題。這篇文章很詳細地解釋不應自己架電郵伺服器的原因:https://www.digitalocean.com/community/tutorials/why-you-may-not-want-to-run-your-own-mail-server

1. 取得電郵賬號的SMTP資料

需要知道的資料:
SMTP server的domain和port (一般來說SSL/TLS會用465)
賬號和密碼

2. 安裝ssmtp

sudo apt-get update
sudo apt-get install ssmtp

修改/etc/ssmtp/ssmtp.conf,設定以下的參數:

root=user@example.com
mailhub=smtp.example.com:465 FromLineOverride=YES AuthUser=user@example.com AuthPass=password UseTLS=YES

然後可以試試寄電郵:
echo "Hello world!" | ssmtp recipient@example.com

有些電郵伺服器指定要有From之類的header,那就先打以下的command line:
ssmtp recipient@example.com
按Enter後打電郵內容,打完按Ctrl+D,注意SUBJECT之後要空一行,再打電郵內容:
TO: recipient@example.com
FROM: <from@example.com>
SUBJECT: Testing subject

Hello world!

3. 修改php.ini

PHP5的位置: /etc/php5/apache2/php.ini
PHP7的位置: /etc/php/7.0/apache2/php.ini

修改該sendmail_path(原本這句應該是被comment掉的)

sendmail_path = /usr/sbin/ssmtp -t

重啟Apache後應該就可以用PHP的mail()了。如果電郵伺服器要求有From之類的header的話,在使用mail()時記得也要給header。

2018年4月25日 星期三

在Mediawiki上安裝navbox

看到Wikipedia的navbox非常好用,使用率也很高,所以也想在自己的Mediawiki上面安裝,但發現網上幾乎沒有這方面的教學,又或者相當模糊,讓自己花了好多時間才摸索到安裝的方法,因此記錄一下自己安裝的過程:

1. 安裝Scribunto插件

Scribunto插件的主要目的是可以讓你建立Module:XXX的頁面,然後在上面寫lua script。因為MediaWiki的navbox是用lua script寫出來的,需要建立一些Module頁面並貼上lua代碼,所以想用的話就先要安裝Scribunto。

安裝步驟:https://www.mediawiki.org/wiki/Extension:Scribunto#Installation
大致上就是下載後把資料夾放在extensions資料夾內,再於LocalSettings.php加上以下代碼:
wfLoadExtension( 'Scribunto' );
$wgScribuntoDefaultEngine = 'luastandalone';
幫Lua程式加上執行權限,(雖然我試的時候已經有執行權限了):
chmod a+x /path/to/extensions/Scribunto/engines/LuaStandalone/binaries/yourOS/lua
記得把yourOS換成自己的作業系統(我的是lua5_1_5_linux_64_generic)

如果想有syntax highlighting(代碼上色),需要先安裝SyntaxHighlight_GeSHi插件,然後再於LocalSettings.php加上:
$wgScribuntoUseGeSHi = true;

安裝SyntaxHighlight_GeSHi的步驟請看:https://www.mediawiki.org/wiki/Extension:SyntaxHighlight#Installation

不過當初我嘗試加上的時候,遇到了個問題:在自己的測試機(Ubuntu 16.04 Desktop)是可以順利啟用代碼上色的,但到了正式機(Ubuntu 16.04 Server)卻無法上色,查了很久才發現是/usr/bin內沒有以python為名的程式(只有python3.5),而測試機則已經有一個python link指著另一個python版本的程式,於是我也在正式機內加上一條link,這樣SyntaxHighlight_GeSHi執行pygmentize的時候就能找到python了。

2. 在MediaWiki上建立頁面


建立以下頁面,可以從MediaWiki把原始碼抄過來(不要用Wikipedia的,因為需要加更多額外的Module)
Template:Navbox
Module:Navbox
Module:Navbar
Module:Arguments

建立以下頁面(預設會有不過是空的),從Wikipedia把原始碼抄過來
MediaWiki:Common.css
MediaWiki.Common.js

建立完畢後就可以用navbox了。範例代碼:

{{Navbox
|name = Navbox/doc
|state = uncollapsed
|image = {{{image}}}
|title = {{{title}}}
|above = {{{above}}}
|group1 = {{{group1}}}
|list1 = {{{list1}}}
|group2 = {{{group2}}}
|list2 = {{{list2}}}
|list3 = {{{list3}}} ''without {{{group3}}}''
|group4 = {{{group4}}}
|list4 = {{{list4}}}
|below = {{{below}}}
See alternate navbox formats under: [[#Layout of table|''Layout of table'']]
}}

2018年4月19日 星期四

用dumpcap抓取網絡封包 (Capture network packets)

dumpcap是Wireshark套裝的其中一個小軟件,用來抓取你電腦上的網絡封包並存成檔案,方便之後分析或者是重播。如果用比喻來說就是在幫你電腦上的網絡活動「錄影」。

安裝Wireshark後,在Wireshark的文件夾(一般是C:\Program Files\Wireshark\)內會有dumpcap.exe。可以在command line內啟動裡面的dumpcap.exe,或者把Wireshark的文件夾加到PATH裡面,這樣就可以直接在cmd內打dumpcap開啟。

dumpcap只會錄影不會主動干涉,所以如果你想錄某個multicast group的封包但電腦本身沒有在接收這個group的話,dumpcap是不會錄到這個group的。所以記得在錄影前要先用其他軟件接收這個group。

範例用法:

dumpcap -P -i InterfaceName -a duration: DurationInSeconds -b filesize: MaxFileSizeForEachFile -f Filter & -w FilePath


詳情:https://www.wireshark.org/docs/man-pages/dumpcap.html

asp 網頁轉交 (web page forwarding)

之前試過要在web server上寫一個asp,目的是做網頁轉交 (web page forwarding)。情況是這樣的:我想存取某一個網頁,但因為某些原因我不能直接存取(例如那個網頁是在一個內部伺服器內,我不能直接透過網絡存取那個伺服器),所以我要弄一個asp放在web server,而這個web server是可以存取內部伺服器的。
這個asp會把我的GET和POST request都轉交給目標網頁,再把目標網頁的內容轉交給我。
寫法如下:

1. 先設好CodePage

CodePage用來指定IIS用哪個代碼頁來解碼的,這裡我們用UTF-8(65001)
Session.CodePage = 65001

2. 轉交網頁內容

先取得用家的POST request,還可以附帶你自己加上的ExtraPostData
Dim strPostData
strPostData = Request.form
If strPostData <> "" Then strPostData = strPostData & "&"
strPostData = strPostData & ExtraPostData
然後開啟XMLHTTP,把你的目標網頁(URLTarget)和GET request拼在一起,再連同POST request一起發送出去
SET httpRequest = Server.createObject("MSXML2.XMLHTTP")
With httpRequest
    .Open "POST", URLTarget & "?" & Request.QueryString , FALSE
    .SetRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    .Send strPostData
End With
最後再把取得的網頁內容寫出來,別忘了在Response header加上Character set,否則有些瀏覽器可能會用了錯的character set來解碼
Response.charset = "UTF-8"
Response.write(httpRequest.ResponseText)

不過這個asp只能轉交網頁,並不能轉交網頁附帶的資源(例如存放在內部伺服器的圖片和和連結)。

3. 錯誤處理

visual basic並沒有像C++之類的語言有exception handling機制,一般來說是先加入下面的代碼,這樣就算遇到錯誤不是馬上停止而是繼續下去:
On Error Resume Next
之後每當你想檢查剛剛的代碼有沒有出錯時,可以檢查Err.Number:
If Err.Number <> 0 Then
  Response.write Err.Description
  Err.Clear
End If

2018年4月17日 星期二

Ubuntu 16.04上安裝LAMP

OS版本:Ubuntu 16.04
可參考DigitalOcean的教學:https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-on-ubuntu-16-04
一篇中文的文章,雖然部分內容已過時:http://www.codingstartup.com/how-to-setup-lamp-on-ubuntu/

0. 更新軟件清單

凡是在安裝任何新軟件前都應該先執行這一步,確保自己的軟件清單是最新的:

sudo apt-get update

1. 安裝Apache

sudo apt-get install apache2
安裝完畢後便可直接打開lcaolhost,看到Apache的歡迎頁面。
預設網頁目錄在/var/www/html
這時候你應該可以在有隨便一部連上網絡的電腦上打http://ServerIP/看到你的首頁。如果你本身開啟了防火牆,記得允許Apache通過。

重啟Apache:
sudo service apache2 restart

/var/www/html的預設權限是755,如果不想每次改東西都打sudo的話可以幫資料夾加上所有人都可以修改的權限:

sudo chmod o+w /var/www/html

如果要允許使用.htaccess,可以更改/etc/apache2/sites-available/000-default.conf
至於https則是更改/etc/apache2/sites-available/default-ssl.conf
在conf內加上以下代碼:(記得重啟Apache)

<Directory "/var/www/html">
    AllowOverride All
</Directory>

假如文件夾沒有index.html之類的檔案,Apache預設會顯示該資料夾下的所有檔案。如果不想給人看的話,可在.htaccess加上以下代碼:
Options -Indexes


到了正式機的時候,可以安裝SSL,這樣別人便能用https來上你的網站,確保用家和你網站之間的交流是加密的。
前幾年要安裝SSL依然是非常麻煩的,而且也要付錢,但現在已經有各種免費的SSL簽發者了,比較有名的是Let's Encrypt,安裝起來也相當簡單。不過要留意安裝SSL前必須先在Apache上設定Virtual Host(讓Apache能根據request的domain name來判斷給予哪個網頁,這樣便能在同一個伺服器上設立多個不同domain name的網站)。
教學:https://www.digitalocean.com/community/tutorials/how-to-secure-apache-with-let-s-encrypt-on-ubuntu-16-04

2. 安裝MySQL

sudo apt-get install mysql-server
中途會要求你設定root的密碼

mysql_secure_installation
幫你設定一些安全選項,但如果只是想測試可以選擇不做某些指令,例如密碼強度(Password Policy)可以選LOW,或者乾脆不安裝validate password plugin,否則每次都要打複雜的密碼只會為自己帶來麻煩

安裝完畢後可以測試一下,看MySQL是否順利地運行中:
systemctl status mysql.service

版本資訊:
mysqladmin -p -u root version

登入MySQL:
mysql -u root -p

開啟/關閉MySQL:
service mysqld start
service mysqld stop

3. 安裝PHP

請注意Ubuntu 16.04預設只能安裝PHP7,如果要PHP5請參考:

安裝PHP7:
sudo apt-get install php libapache2-mod-php php-mcrypt php-mysql
你也可以選擇安裝 php5-curl (讀取外部網站)和 php5-gd (圖像處理)

4. 安裝phpMyAdmin

在Command line執行mysql指令或者更新database或者table可能會相當麻煩,可以安裝phpMyAdmin,這樣便能直接以網頁的方式更容易管理數據庫。記得要安裝完MySQL和PHP後才安裝此項。

sudo apt-get install phpmyadmin php-mbstring php-gettext

安裝的時候會叫你選擇web server,選apache,記得按Space打勾,再按Tab和Enter。

需要啟用的php模組:(裝完後要重啟Apache)
sudo phpenmod mcrypt
sudo phpenmod mbstring

網址:localhost/phpmyadmin

記得要幫localhost/phpmyadmin加入額外一層密碼,加多一重保障。詳情可看:
https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-phpmyadmin-on-ubuntu-16-04   (Step Two — Secure your phpMyAdmin Instance)

更安全的做法是只允許在本機存取,在/etc/phpmyadmin/apache.conf加上下列代碼:(可能需要重啟Apache)
Order Allow,Deny
Deny from All
Allow from localhost