码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 探索一些常见的存储过程奥秘


    应用程序开发人员长期以来一直相信将数据库操作放在存储过程中可以得到最佳性能并防止 SQL 注入攻击。他们还认为这些优势值得他们付出与数据库逻辑维护、测试和将数据库逻辑迁移到不同供应商相关的额外成本。近年来,随着开发人员开始质疑这些长久以来的假设,潮流已经从存储过程转向对象关系映射(ORM),例如 Hibernate 或 Entity Framework。

    《存储过程是过时的工具吗?》文章重点讲述了一些避免存储过程而支持应用程序代码和 ORM 的原因。本周,我们将探讨上面的两个迷思,看看它们今天是否仍然经得起推敲。

    性能优势

    在互联网出现的初期,通常的做法是尽量减少网络流量以提高性能。而存储过程只需要将过程名称和参数而不是完整的 SQL 语句传输到服务器来帮助减少网络流量。考虑到某些生产用查询的复杂性和长度,这可能是带来巨大效益。今天,无论你从这种方法中得到什么效益,都很容易被一个事实所抵消:你很可能会在同一个请求中使用相同的参数调用相同的过程两到三次。与此同时,ORM 会查看其恆等映射并识别出它已经检索到该结果集,因此无需进行另一次。此外,应该注意的是,存储过程缓存在服务器上,而即席(ad-hoc)SQL 则不是的说法。这是 Frans Bouma 在他的博客文章《Stored Procedures are bad, m'kay?》中打破的迷思。

    存储过程和 SQL 注入

    人们常说,存储过程提供了防止 SQL 注入的保护,因为它们将数据与指令分开。这是真的,只要开发人员不在存储过程中使用动态 SQL,原始字符串通过替换占位符的输入参数传递。以下是一个写得很差的过程,它准确地显示了它何将数据库暴露于 SQL 注入的危险中:

    create procedure GetStudents(@School nvarchar(50))
    as
    begin
        declare @sql nvarchar(100)
        set @sql = 'SELECT STUDENT FROM SCHOOL WHERE SCHOOL LIKE ' + @School
        exec @sql
    end
    

    你可以使用参数化查询编写消除 SQL 注入漏洞的 SQL。使用 Python、TypeScript 或 Java 等编程语言编写的参数化查询(如下所示)可以净化用户输入,以便在查询中安全使用:

    String sql = "SELECT STUDENT FROM SCHOOL WHERE SCHOOL LIKE ? ";
    PreparedStatement prepStmt = conn.prepareStatement(sql);
    prepStmt.setString(1, "Waterloo%");
    ResultSet rs = prepStmt.executeQuery();
    

    可见防止 SQL 注入不是存储过程本身的好处,只是不将 SQL 字符串串联在一起的惯例。

    预告

    本篇文章探讨了一些关于存储过程长久以来的假设,这些假设在今天并不完全成立。虽然他们本身并不是跳出存储过程潮流框架的充分理由,但强烈建议你是时候重新评估你的应用程序架构了。

    往期回顾

    Navicat 被投毒了 | 真相来了!

    盗版引发设备瘫痪

    Navicat 16.1 为OceanBase 社区版

    Navicat 成为信通院数据库创新实验室成员

    Navicat 学术伙伴计划 - 免费教育版申请

    Navicat 技术智库 - 实战演练与各类热门问题解答

    免费试用攻略 | Navciat 16 数据库管理工具

  • 相关阅读:
    java中对象的比较
    Redis4.0源码编译和启动
    随想录一期 day4 [24. 两两交换链表中的节点|19. 删除链表的倒数第 N 个结点|面试题 02.07. 链表相交|142. 环形链表 II]
    AI 入门指南二 :AI提示词(Prompt)
    python学习笔记——基础
    当创建一个ingress后,kubernetes会发什么?
    深入理解数据结构(1)—用链表实现栈
    数据结构与算法:栈(java)
    【MATLAB源码-第54期】基于白鲸优化算法(WOA)和遗传算法(GA)的栅格地图路径规划最短路径和适应度曲线对比。
    诚迈科技旗下智达诚远亮相2023世界新汽车技术合作生态展
  • 原文地址:https://blog.csdn.net/weixin_53935287/article/details/126887031
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号