前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP如何实现一个简单SQL查询器

PHP如何实现一个简单SQL查询器

作者头像
Tinywan
发布2024-02-21 16:03:39
1370
发布2024-02-21 16:03:39
举报
文章被收录于专栏:开源技术小栈开源技术小栈

本篇文章主要介绍如何实现一个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

代码语言:javascript
复制
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>开源技术小栈,CryptoJS加密SQL查询</title>
</head>
<body>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.js"></script>
<script type="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>

后端

白名单检查

白名单访问机制是一种安全机制,用于限制对特定资源的访问。白名单机制的核心思想是只允许列入白名单的实体进行访问或操作,而其他未列入白名单的实体则被禁止访问。

代码语言:javascript
复制
/**
 * @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 进行解密处理
代码语言:javascript
复制
/**
 * @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查询器不仅可以帮助开发人员快速、准确地定位问题,还能提高工作效率、降低安全风险和沟通成本。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-02-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 开源技术小栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 实际应用场景
  • 什么是SQL查询器?
  • 实现
    • 前端
      • 后端
        • 白名单检查
        • 查询器管理
        • 可视化页面展示
    相关产品与服务
    关系型数据库
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档