存储过程并不能神奇地阻止SQL注入,但是它们确实使防止注入变得容易得多。您所要做的只是类似以下内容(Postgres示例):

CREATEORREPLACEFUNCTIONmy_func(INin_user_id INT)[snip]SELECTuser_id,name,addressFROMmy_tableWHEREuser_id=in_user_id;--BAM! SQL INJECTION IMMUNE!![snip]

而已!仅在通过字符串串联(即动态SQL)形成查询时才会出现问题,即使在这种情况下,您也可以绑定!(取决于数据库。)

如何避免在动态查询中进行SQL注入:

步骤1)问问自己是否真的需要动态查询。如果只是为了设置输入而将字符串粘在一起,那么您可能做错了。(此规则有例外-一个例外是报告某些数据库上的查询,如果不强制每次执行都编译一个新查询,则可能会出现性能问题。但是请在跳入此问题之前对其进行研究。 )

步骤2)研究为特定RDBMS设置变量的正确方法。例如,Oracle使您可以执行以下操作(引用其文档):

sql_stmt:='UPDATE employees SET salary = salary + :1 WHERE '||v_column||' = :2';EXECUTEIMMEDIATE sql_stmtUSINGamount,column_value;--INJECTION IMMUNE!!

在这里,您仍然没有连接输入。您安全地绑定了!万岁!

如果您的数据库不支持上述功能(希望它们仍然没有问题,但我不会感到惊讶)-或者您仍然必须将输入连接起来(例如在“有时”将查询报告为我在上面暗示),那么您必须使用适当的转义功能。不要自己写。例如postgres提供quote_literal()函数。因此,您将运行:

sql_stmt:='SELECT salary FROM employees WHERE name = '||quote_literal(in_name);

这样,如果in_name像'[snip]或1 = 1'这样的变量((或“ 1 = 1”部分意味着选择所有行,允许用户查看他不应该的薪水!),那么quote_literal可以节省您的屁股生成结果字符串:

SELECTsalaryFROMemployeesWHEREname='[snip] or 1=1'

找不到结果(除非您有一些名字很奇怪的员工。)

这就是要旨!现在,让我留下Oracle专家Tom Kyte关于SQL Injection主题的经典文章的链接,以阐明这一点:Linky

mysql 存储过程 sql注入_存储过程是否可以防止SQL注入?相关推荐

  1. java存储过程与sql语句_存储过程与SQL语句怎么选择

    应用存储过程的优点: 1.具有更好的性能 存储过程是预编译的,只在创建时进行编译,以后每次执行存储过程都不需再重新编译, 而一般 SQL 语句每执行一次就编译一次,因此使用存储过程可以提高数据库执行速 ...

  2. mysql数据库的分离_数据库分离和附加 (SQL Server)

    数据库分离和附加 (SQL Server)Database Detach and Attach (SQL Server) 06/30/2020 本文内容 适用于:Applies to: SQL Ser ...

  3. mysql 构造 linq语句_[转]查看LINQ生成SQL语句的几种方法

    记录LINQ生成的SQL语句是常用的调试方式,而且能根据需要来优化LINQ生成的SQL语句,更能了深入的了解LINQ. DataContext的Log属性来将LINQ to SQL生成的SQL语句格式 ...

  4. java执行sql文件_面试官:MyBatis SQL是如何执行的?把这篇文章甩给他

    初识 MyBatis MyBatis 是第一个支持自定义 SQL.存储过程和高级映射的类持久框架.MyBatis 消除了大部分 JDBC 的样板代码.手动设置参数以及检索结果.MyBatis 能够支持 ...

  5. mybatisplus执行sql语句_一条更新的SQL语句是如何执行的?

    提出问题 UPDATE student SET score = score + 1 WHERE uid = 666; 以上就是一条最简单的SQL更新语句,想要知道上面这句SQL语句是怎么执行的先要了解 ...

  6. bak文件转换成sql文件_数据库bak文件转sql

    Asp.Net 备份和恢复SQL SERVER 数据库 我们通常备份数据库时,需要登录数据库服务器去备份和恢复,这样很不方便,其实SQL SERVER自带的命令可能让我们很简单地实现远程通过Asp.N ...

  7. mysql存储过程变量定义_存储过程中MySQL变量定义和赋值

    MySQL变量定义和赋值是我们经常会遇到的问题,下面就为您接受如何在存储过程中MySQL变量定义和赋值,希望对您学习MySQL变量定义方面能有所启迪. 一.MySQL变量的定义 mysql变量定义用d ...

  8. mysql 存储过程 主键_存储过程生成主键

    存储过程生成主键 MySQL delimiter $$CREATE PROCEDURE generateKeys(in pm_name varchar(20))begindeclare curr_Ke ...

  9. mysql大批量数据写入_存储过程写入大批量数据,用于测试mysql查询优化

    ---恢复内容开始--- 最近仔细研究了一下mysql优化索引的知识,当然开始玩之前还是要插入大量数据的 下面是表结构 Ps:这个插入是我看韩老师的mysq优化章节 1 #创建表EMP雇员2 CREA ...

最新文章

  1. BroadcastReceiver自学笔记
  2. jenkins如何实现重新发布历史构建记录里的版本
  3. Go 语言编程 — 并发 — Goroutine 协程
  4. 【字符串】最长回文子串 ( 动态规划算法 ) ★
  5. JavaScript Dom编程艺术
  6. ASP.NET Core快速入门(第5章:认证与授权)--学习笔记
  7. redis缓存原理与实现_基于Redis实现范围查询的IP库缓存设计方案
  8. linux获取进程io,linux查看哪个进程占用磁盘IO
  9. 在Linux中使用matplotlib进行科学画图
  10. SQL Server2008安装教程
  11. 路由器连接校园网(多个账号,单个账号)
  12. PowerBuilder 2018
  13. HTTP:实时消息推送
  14. 恶意软件Emotet卷土重来滥用.LNK文件进行攻击,你只需要一项技术就能有效保护组织
  15. 这次,在人工智能面前,人类输得一败涂地
  16. jxl导出excel(合并单元格)
  17. Duplicate class okhttp3...
  18. 拉卡拉的十四年和第三次成人礼
  19. 搭搭云 新世代超级应用平台 JNPF快速开发平台框架 3.4.7最新版源码
  20. 营造激发自驱力注重培养学习力的想法一

热门文章

  1. OpenSCA用开源的方式做开源风险治理:Why? What? How?
  2. 三体人有救了!深度学习解决三体难题
  3. 一文读懂大数据计算框架与平台
  4. 企业经营12法的领悟
  5. rbac php yii,YII RBAC
  6. 「计算几何精度问题」
  7. 已解决selenium.common.exceptions.TimeoutException: Message:
  8. 瑜伽教学法 | 这些常说的口令,你认为会员真的听懂了吗?
  9. CSS position: fixed 相对于父元素定位
  10. 四十、Fluent 颗粒\气泡PBM模型