阻止非會員駭客
Python直接控制資料庫, 需傳入資料庫的帳號, 如下
conn=mysql.connect(host="ip", user="thomas", password="123456", database="cloud")
上面的資料庫連線帳號密碼直接寫在程式碥裏, 這還得了. 當程式賣給客戶後, 客戶隨便也能看到, 以後就直接使用workbench登入資料庫, 要怎麼搞就怎麼搞.
解決方式就是給客戶一個會員帳號密碼. 此會員帳密傳送給Server後, 由Server驗証會員帳密是否正確, 若正確的話, 才傳送資料庫帳密給客戶端.

此法可以將非會員的高手擋在外面。當然, 客戶端的會員中,若有高手的話,一樣能隨意破解啦。此時又需要加密之類的技術加入,但這不在此篇討論範圍中。
Python語法
import requests, json
import mysql.connector as mysql
url="http://mahaljsp.asuscomm.com/lcc/login_post.php"
memAccount=input('請輸入會員帳號 : ')
memPassword=input('請輸入會員密碼 : ')
params={"userAccount":memAccount, "userPassword":memPassword}
page=requests.post(url, data=params)
if "Error" in page.text:
print("會員帳號或密碼錯誤")
exit()
dbInfo=json.loads(page.text)
dbAccount=dbInfo["dbAccount"]
dbPassword=dbInfo["dbPassword"]
dbHost=dbInfo["dbHost"]
db=dbInfo["db"]
conn=mysql.connect(host=dbHost, user=dbAccount, password=dbPassword, database=db)
cursor=conn.cursor()
cursor.execute("select * from taiex where tx_date>='2021/11/15' order by tx_date")
rows=cursor.fetchall()
for row in rows:
print(row)
結果 :
請輸入會員帳號 : 會員帳號
請輸入會員密碼 : 密碼
(143243, datetime.date(2021, 11, 15), 17560.52, 17683.19, 17560.52, 17634.47)
(143275, datetime.date(2021, 11, 16), 17639.96, 17708.1, 17629.8, 17693.13)
(143308, datetime.date(2021, 11, 17), 17705.29, 17764.04, 17669.58, 17764.04)
(143342, datetime.date(2021, 11, 18), 17767.06, 17841.37, 17748.21, 17841.37)
(143377, datetime.date(2021, 11, 19), 17864.19, 17986.18, 17786.05, 17818.31)
PHP語法
請在php 網頁目錄下撰寫 login_post.php。下面代碼在傳送帳密時,使用json的字典方式傳送。
<?php
$memAccount=addslashes($_POST["userAccount"]);
$memPassword=addslashes($_POST["userPassword"]);
$dbAccount="資料庫帳號";
$dbPassword="資料庫密碼";
$dbHost="資料庫url";
$db="資料庫名稱";
$conn=new mysqli($dbHost, $dbAccount, $dbPassword, $db);
if ($conn->connect_error){
die('Error Connected : '.$conn->connect_error);
}
$conn->query("SET NAMES 'utf8'");
$cmd = sprintf("select * from member where userAccount='%s' and userPassword='%s'", $memAccount, $memPassword);
$result = $conn->query($cmd);
if(!$result){
die('Error Account/Password');
}
if($result->num_rows >0){
echo sprintf('{"dbAccount":"%s", "dbPassword":"%s", "db":"%s", "dbHost":"%s"}', $dbAccount, $dbPassword, $db, $dbHost);
}
else{
echo 'APError';
}
?>
請注意, 上面這段php程式碼, 需要避免 SQL Injection, 可以使用addslashes()這個函數,讓所有的單引號前加上反斜線
$memAccount = addslashes($_POST['userAccount']);
$memPassword = addslashes($_POST['userPassword']);
