只允許 index.php 單一入口, 查詢 MySQL 欄位名稱、資訊

只允許網站從 index.php 進入 – 使用 Apache

此需求是為了避免疏忽而引起安全性問題

  • 設定 AllowOverride All
  • 重新啟動 Apache

編輯 .htaccess

優雅連結

  • 頁面 /index.php?a=xxx
    /Page/xxx
  • 功能 /index.php?Player=yyy
    /Player:yyy

MySQL 查詢欄位名稱

查詢是否有符合名稱欄位

顯示該資料表所有欄位詳細資訊

Field, Type, Collation, Null, Key, Default, Extra, Privileges, Comment

欄位名稱, 類別, 編碼, Null(Yes / No), 鍵值, 預設值, 附加(auto_increment / ), 讀取權限, 說明

137 total views, no views today

PHP 使用 PDO Statement 預處理,如何查驗 SQL 語法

PDO Statement

在執行 MySQL 的 SQL 語句時,除了語法正確外還要注意

  1. 關鍵字混用
  2. SQL injection

所以查驗使用者帳號、密碼的 SQL 語句可能會長這樣:

  • password 是關鍵字,所以必須使用 ` 包住
  • 傳遞變數皆須預防 ‘ 這類字元中斷正常的 SQL 語句執行,在此使用 MySQLi 的 real_escape_string 方法

如此就可以得到正確的執行結果,又不會因為疏忽產生資訊安全問題。

如果覺得這樣子處理「不酷」的話,那可以考慮預處理的方案,一樣的需求使用預處理的同一行 SQL 語句長這樣:

先讓資料庫得到「結構」,再將資料填入,如此資料庫只會「想辦法填入資料」而不會破壞語法結構,進而產生安全問題。

所以資料庫會比對欄位知道 password 是欄位,後續的 :username 和 :password 的資料會帶入,「不會更動 SQL 語句結構」

也就是以下的紅色部份不會減少也不能增加

SELECT * FROM user WHERE username=:username AND password=:password

因為一般的 SQL injection 就是使用「增加 SQL 語法」破壞了原本的架構來達到目的,例如

SELECT * FROM user WHERE username=’root’ or ‘1=1‘  AND password=’xxx’

紅色為使用者填入資料,如此一來 SQL 的語句結構已經改變。

如何查驗 SQL 語法

使用預處理想要得到最後執行 SQL ,並不能簡單的使用 echo print 這類的 function ,當然 PDO 本身的函數也沒什麼卵用,例如: PDOStatement::debugDumpParams

唯一可以依靠的方法是直接查看 MySQL 資料庫實際執行的 SQL query

推薦的方式是打開 general_log 後,設定輸出在 mysql 資料庫,原因是雖然說是資料庫但是預設資料表型態是 CSV ,所以可以同時文字檔案和資料庫兩者的優點

使用 tail 來追蹤最後更新的資料

 

預處理的好處 mysql prepare statement(mysql预处理)

PHP 官網文件

PHP 的優點就是官網擁有最完整的說明和資訊,今天花了一點時間在 安全 這個項目上面,對一些安全議題有了更好的認識。

357 total views, no views today