2020年6月14日 星期日

PHP- 預防SQL injection 字串處理"htmlentities"、"stripslashes"、"real_escape_string"

要避免網頁輸入欄位的SQL injection,基本的方式是針對輸入欄位、POST、GET..
等數值進行處理。

htmlentities():去除字串中的html標籤
stripslashes():讓文字及符號呈現原始輸入的文字,不受html語法影響
real_escape_string():轉換特殊符號

可參考以下範例試試看:
<html>
<form action="trail_string_clear.php" method="post" name="textform">
原始輸入<br>
<textarea id="editor1" name="inputtext" type="textarea" style="width:400px;height:200px;"></textarea><br>
<input class="form_submit" type="Submit" value="Submit"></input>
</form>


</html>

<?php
require_once("fundation_func.php");
$link = new mysqli($dbhost,$dbuser,$dbpass,$db);
$inputtext=$_POST['inputtext'];
$stripslashes=htmlentities($inputtext);
$htmlentities=stripslashes($inputtext);
$real_escape_string=$link->real_escape_string($inputtext);
echo "<font color='black'>未處理字串:$inputtext<br></font>";
echo "<font color='blue'>stripslashes處理後:$stripslashes<br></font>";
echo "<font color='red'>htmlentities處理後:$htmlentities<br></font>";
echo "<font color='green'>real_escape_string處理後:$real_escape_string<br></font>";
?>



輸出畫面:


輸入的字串





PHP 在MAC中 move_upload_file 無法移動檔案到目錄的問題

使用upload_file上傳檔案存在暫存區後,要移動到指定路徑並變更檔名失敗;

原因是MAC 目錄權限問題,使用以下指令就可以成功將檔案存到路徑中了。

sudo chmod 777 [目錄路徑]


重啟服務

sudo apachectl restart


2020年6月10日 星期三

PHP 連線資料庫的兩種方法(mysqli_connect、new mysqli物件)

以下兩種連線資料庫的方法,(一)mysqli_connect跟 (二)使用mysqli物件:

資料庫連線基本資訊
$dbhost='[IP位置/Localhost]:[3306/Port號]';
$dbuser='[資料庫帳號]';
$dbpass='[資料庫密碼]';
$db='[資料庫名稱]';


方法一:mysqli_connect
// 1) 建立連線
$link=mysqli_connect($dbhost,$dbuser,$dbpass,$db);//建立連線
if(! $link) {
    die ('Connect Fail:'. mysqli_error($link));
}
echo 'Connect Sueccess';

//2) 查詢資料
$sql_query="SELECT * FROM table"; //查詢指令
$query=mysqli_query($link, $sql_query); //執行查詢,並將查詢結果存在$query中
while($row=mysqli_fetch_array($query,MYSQLI_ASSOC))//將查詢結果存到$row陣列中
    {
        echo"$row['欄位名稱']";//這邊就看查詢的資料有什麼欄位
    }

//3) 結束資料庫連線
mysqli_free_result($query);//釋放記憶體
mysqli_close($link);//結束連線


方法二:mysqli_connect
// 1) 建立連線
$link= new mysqli($dbhost,$dbuser,$dbpass,$db);//建立物件並連線資料庫
if($link->connect_error) {
    die ('Connect Fail:'. mysqli_error($link));
}
echo 'Connect Sueccess';

//2) 查詢資料
$sql_query="SELECT * FROM table"; //查詢指令
$query=$link->query($sql_query);//執行查詢,並將查詢結果存在$query中
while($row=mysqli_fetch_array($query,MYSQLI_ASSOC))//將查詢結果存到$row陣列中
    {
        echo"$row['欄位名稱']";//這邊就看查詢的資料有什麼欄位
    }

//3) 結束資料庫連線
    $query->free();//釋放記憶體
    $link->close();結束連線




PHP parse_ini_file() 範例

使用ini檔案儲存環境設定資料,再以parse_ini_file()取得環境設定值。

web.ini檔案
[config]
dbhost='111.111.111.111:3306';
dbuser='Alice';
dbpass='Aloceloveu';
db='ff7';

php檔案
<?php
$ini = parse_ini_file('webconfig.ini',true);// 取得資料庫設定
    $db=$ini["config"]["db"];
    $dbhost=$ini["config"]["dbhost"];
    $dbuser=$ini["config"]["dbuser"];
    $dbpass=$ini["config"]["dbpass"];

echo "db=$db <br>host=$dbhost<br>user=$dbuser<br>pass=$dbpass";
?>

結果
db=ff7
host=111.111.111.111:3306
user=Alice
pass=Aloceloveu



2020年6月2日 星期二

從MAC使用gcloud SDK傳輸檔案到GCP

為了建立在PC、MAC上都可以連到GCP測試站的開發環境;但若用GCP console的檔案傳輸需要透過Bucket或單個檔案上傳,實在有點麻煩。
所以就試著用gcloud SDK以終端機command line的方式來上傳檔案 。


安裝GCP套件需要安裝Python
-MAC中預設的是python2.7,而GCP套件目前可支援Python2.7,但未來會只支援Python3以上版本,所以就來研究一下怎麼安裝Python3囉。


開啟終端機進行Python3安裝
1) 要先安裝Brew,輸入以下指令
-ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

2) 安裝Python3,輸入以下指令
-brew install python3


安裝GCP的套件
- 下載的檔案解壓縮後,放到想要的目錄中
- 在終端機中輸入 [目錄名稱]/google-cloud-sdk/install.sh
- 會問題要不要回報問題給GCP及重新設定路徑,可以選擇不輸入就略過
- 最後重新開啟終端機


安裝GCP SDK,在終端機中輸入以下指令
gcloud init
- 會開始在本機建立一個預設設定檔(default configuration)
- 接著會要求你登入Google帳號
- 會詢問要選擇哪個在GCP建立的專案,或新建專案
- 詢問要不要變更區域資料
- 設定後就安裝完成了

設定GCP專案中繼資料的區域資訊

設定專案中的中繼資料,需要設region=[選擇的區域]及-zone=[選擇的區域]

gcloud compute project-info add-metadata --metadata google-compute-default-region=asia-east1,google-compute-default-zone=asia-east1-b


設定Client預設設定檔中的區域資訊
再來要設定Client端社區域資訊,這樣使用指令時才不用每次都要輸入

gcloud config set compute/zone asia-east1-b

gcloud config set compute/region asia-east1


連線GCP VM,在終端機輸入以下指令
gcloud compute ssh [Instance_name]
- 輸入passphrase後,就會產生SSH public key跟Private Key並存在電腦中
- 之後就可以從終端機輸入gcloud compute ssh [Instance_name] 連線到GCP的VM了

設定SSH 中繼資料
- 產生後的SSH Key會存在 預設路徑user/[使用者名稱]/.ssh/
- 目錄中會有兩個檔案*.pub是public key, 另一個沒有副檔名的是private key 
- 將public key用文字檔打開並複製
- 進入GCP console compute engine > 中繼資料 > 安全殼層金鑰
- 新增,然後將複製的public Key貼上後儲存 
- 這樣用完成SSH的設定了
- 這個Key就會是root帳號的Key,以下傳輸檔案時就可以帶root作為帳號來進行操作


傳輸檔案
先確認目前終端機是在本地不是連到VM上 (輸入指令回傳找不到目錄好幾次,才發現原來已經SSH連到VM了.. Orz)

整個目錄上傳指令: gcloud compute scp --recurse [本地目錄] [帳號]@[VM_名稱]:[VM目錄]
- 在輸入兩次passphrase,就會開始上傳了。
* 在前面的SSH Key設定中沒有帳號,這個步驟可以帶root;回到GCP console中的中繼資料中看,會多一個root的金鑰

- 單一檔案上傳指令: gcloud compute scp [本地目錄] [帳號]@[VM_名稱]:[VM目錄]


GCP連線相關問題

ERROR: (gcloud.compute.scp) Could not fetch resource:

 - Insufficient Permission: Request had insufficient authentication scopes.

需要重新驗證身份
指令-sudo gcloud auth login
輸入後再重新登入Google 帳號就可以了

ERROR: (gcloud.compute.ssh) [/usr/bin/ssh] exited with return code [255]

專案可能有instance或區域重新設定:需要更新SSH 金鑰
指令-sudo gcloud compute config-ssh
出現這問題時,不一定靠更新SSH可以排除... 還需研究






Ubuntu 安裝php、mysql、phpmysdmin

記錄常用的Ubuntu安裝動作,
將安裝php、mySQL、phpmyadmin

安裝PHP、Apache
sudo apt-get update
sudo apt-get install apache2 php libapache2-mod-php
安裝後網站路徑為/var/www/html/

修改php.ini設定
設定檔路徑:
sudo vi /etc/php/7.0/apache2/php.ini

extension設定

-extension=php_mbstring.dll

-extension=php_mysqli.dll
檔案上傳設定
-upload_file_maxsize=20MB
-upload_max_filesize = 20M
開發時錯誤顯示,避免發生錯誤時只顯示空白畫面
-display_errors=On

安裝mySQL
$ sudo apt-get install mysql-server
//$ sudo apt-get install mysql-client
//以下為資安考量安裝可省略
//$mysql_secure_installation 
- 會開始設定root的密碼,以及密碼安全性的檢核程度;建議根據已設定密碼的強度來選擇
- 選擇是否要允許遠端;視情況囉
- 選擇是否要移除測試資料庫;建議移除
- 確認重新載入權限表

修改mySQL設定
- 預設MySQL是只允許本機存取,因此要修改成允許遠端存取
-  sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
-  將blind-address這一行的IP改成自己要遠端的IP,若不限制可以加上#註解掉
-在[mysqld]區塊中加上character-set-server=utf8 

設定mySQL root密碼
- 預設mySQL root 密碼為空白需變更,
-sudo mysql -uroot -p
- 進入mysql開始變更root帳號密碼
- >UPDATE mysql.user SET authentication_string=PASSWORD('[密碼]'), plugin='mysql_native_password' WHERE User='root' AND Host='localhost';
- >flush privileges;
- exit;


啟動mySQL
-輸入指令:sudo systemctl start mysql
- 查看運作狀況service mysql status

安裝php-MySQL套件
- 輸入指令:sudo apt install php-mysql

安裝phpMyAdmin
$ sudo apt-get install phpmyadmin
//$ sudo apt-get install php-mbstring

//$ sudo apt-get install php-gettext
- 安裝後會出現設定phpmyadmin的密碼

phpmyadmin設定
設定檔路徑
$sudo vi /etc/dbconfig-common/phpmyadmin.conf
dbc_dbuser='[帳號]'
dbc_dbpass='[密碼]'


在www中設定連結
$ sudo ln -s /usr/share/phpmyadmin /var/www/html/phpmyadmin

啟動apache
- 輸入指令:sudo apachectl start
*如有變更php.ini或mysql設定,需要重新啟動 sudo apachectl restart

測試:
1) php執行: 輸入 [localhost/ip]/
2) phpmyadmin: [localhost/ip]/phpmyadmin
3) 檢查mySQL語系設定,確認是否有非UTF8的語系 
-show variables where Variable_name like '%character_set%'
utf8mb4 兼容UTF8