當前位置: 妍妍網 > 碼農

PHP如何實作一個簡單SQL查詢器

2024-02-04碼農

本篇文章主要介紹如何實作一個SQL查詢器來套用的業務當中,同時結合具體的案例來介紹SQL詢器的實踐過程。

實際套用場景

SQL查詢器在實際套用場景中具有重要的作用,尤其是在系統私有化部署的情況下。在這種場景下,資料庫安裝在本地,使用 127.0.0.1 方式進行連線,不對外開放(為了安全)。然而,當系統出現問題或者BUG時,外網開發人員需要透過編寫SQL來定位系統bug問題。如果沒有SQL查詢器,這個工作就會變得非常困難。

首先,由於資料庫位於本地,外網開發人員無法直接存取。他們需要透過遠端桌面或者其他方式連線到私有化平台機房,這通常需要經過繁瑣的審批流程。這個過程可能會耗費大量的時間和精力,影響問題的解決速度。

其次,即使外網開發人員成功連線到私有化平台機房,他們也需要具備一定的資料庫操作技能和經驗,才能編寫有效的SQL查詢來定位問題。這對於一些沒有資料庫操作經驗的開發人員來說,可能是一個很大的挑戰。

此外,由於資料庫是私有化部署的,可能涉及到敏感數據和業務邏輯。因此,在編寫SQL查詢時,開發人員需要特別註意保護數據安全和遵守公司的相關規定。這也增加了定位問題的難度。

綜上所述,SQL查詢器在系統私有化部署的場景中具有重要的實際意義。它可以幫助外網開發人員快速、高效地定位系統bug問題,節省時間和精力,提高工作效率。同時,它還可以幫助開發人員更好地保護數據安全和遵守公司規定。因此,擁有一個功能完善的SQL查詢器對於這類場景來說是非常必要的。對於私有化部署的系統環境,一個功能強大的SQL查詢器不僅可以幫助開發人員快速、準確地定位問題,還能提高工作效率、降低安全風險和溝通成本。

什麽是SQL查詢器?

SQL查詢器是一種用於執行SQL(結構化查詢語言)語句的工具,主要用於查詢和操作關系型資料庫。它允許使用者透過界面或命令列介面輸入SQL語句,並將這些語句發送到資料庫管理系統(DBMS)進行執行。

SQL查詢器通常提供了一個視覺化的界面,使使用者能夠以圖形化方式建立和執行SQL語句。這個界面通常包括一個查詢編輯器、一個結果視窗和一個物件瀏覽器。使用者可以在查詢編輯器中輸入SQL語句,然後在結果視窗中檢視查詢結果。

實作

前端

SQL查詢器視覺化的界面透過前端網頁來實作。使使用者能夠以圖形化方式建立和執行SQL語句。這個界面通常包括一個查詢編輯器、一個結果視窗和一個物件瀏覽器。

前端采用 Crypto-js.js 是一個基於JavaScript的加密/解密庫,它提供了一系列常用的加密演算法,包括了對稱加密演算法(如AES、DES、Triple DES等)、哈希演算法(如SHA-256、SHA-1、MD5等)和加密模式(如CBC、CTR、ECB等)。下面我們來看具體的實作過程。

下載地址:https://www.cdnpkg.com/crypto-js

<!DOCTYPE html>
<html>
<head>
<metacharset="UTF-8">
<title>開源技術小棧,CryptoJS加密SQL查詢</title>
</head>
<body>
<scripttype="text/javascript"src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.js"></script>
<scripttype="text/javascript">
/** 十六位十六進制數作為金鑰 */
const ENCRYPT_KEY = 'yJFPEzGftZqNkwx'
/** 十六位十六進制數作為金鑰偏移量 */
const ENCRYPT_IV = '20243zyJFPEzhE0B'
const key = CryptoJS.enc.Utf8.parse(ENCRYPT_KEY)
const iv = CryptoJS.enc.Utf8.parse(ENCRYPT_IV)
/** 需要加密的SQL語句 */
const str = "SELECT * FROM user LIMIT 10 ;";
/** 加密方法 */
const encryptedValue = CryptoJS.AES.encrypt(str, key, {
mode: CryptoJS.mode.CBC,
iv: iv,
padding: CryptoJS.pad.Pkcs7
})
$encryptedValue = encryptedValue.toString()
console.log($encryptedValue);
/** 打印結果 HFhT5EmNYeQMYm+5QSCa14OpxK1kdAPyhESGhS7L2WI= */


</script>
</body>
</html>

後端

白名單檢查

白名單存取機制是一種安全機制,用於限制對特定資源的存取。白名單機制的核心思想是只允許列入白名單的實體進行存取或操作,而其他未列入白名單的實體則被禁止存取。

/**
 * @desc: IP檢查
 * @return Response
 * @author Tinywan(ShaoBo Wan)
 */
public function checkIp(): Response
{
if (!in_array($this->request->ip(), config('app.website_ip'))) {
return response_json(0,'success', ['is_success' => false]);
}
return response_json(0,'success', ['is_success' => true]);
}

查詢器管理

  • 這裏方便期間直接使用 topthink/think-orm 作為基礎查詢器

  • 後端解密使用 openssl_decrypt 進行解密處理

  • /**
     * @desc: SQL查詢器管理
     * @return Response
     * @throws BadRequestHttpException
     * @author Tinywan(ShaoBo Wan)
     */
    public function sqlQuery(): Response
    {
    try {
    $whiteList = config('app.website_ip');
    if (!in_array($this->request->ip(), $whiteList)) {
    throw new NotFoundHttpException('404');
    }
    /** 十六位十六進制數作為金鑰 */
    $cryptKey = 'yJFPEzGftZqNkwx';
    /** 十六位十六進制數作為金鑰偏移量 */
    $iv = '20243zyJFPEzhE0B';
    $param = $this->request->post();
    $result = $this->validate($param,QueryValidate:: class);
    if(true !== $result){
    throw new BadRequestHttpException('請輸入SQL查詢器編碼');
    }
    $param['query'] = openssl_decrypt($param['query'], 'AES-128-CBC'$cryptKey, 0, $iv);
    $result2 = $this->validate($param,QueryValidate:: class);
    if(true !== $result2){
    throw new BadRequestHttpException('請輸入SQL查詢器編碼');
    }
    if (strstr(strtolower($param['query']), "describe") == false) {
    preg_match('/limit (?:0|[1-9][0-9]?|100)$/i'$param['query'], $matchArr2);
    if (empty($matchArr2)) {
    throw new BadRequestHttpException('SQL查詢器編碼格式錯誤');
    }
    }
    $queryResult = Db::connect(MYSQL_DRIVER)->query(trim($param['query']));
    } catch (BaseException |\Exception $exception) {
    throw new BadRequestHttpException('字典編碼異常');
    }
    return response_json(0, '字典編碼'$queryResult);
    }

    視覺化頁面展示

    因此,對於私有化部署的系統環境,一個功能強大的SQL查詢器不僅可以幫助開發人員快速、準確地定位問題,還能提高工作效率、降低安全風險和溝通成本。