mssql-存储过程不让拼接SQL语句

问题描述

存储过程不让拼接SQL语句

公司DBA不允许创建的存储过程中有拼接SQL语句的行为,请问,该怎么解决?说是这样做有风险,说我非要用的话,可以签一份风险协议,出了问题我负责之类的。请问:各位在多条件查询这种情况下,存储过程都是怎么写的?有不拼接又省事的办法吗?另外,这个风险难道微软没有提供解决方案吗?

解决方案

真正的风险, 不在于拼SQL, 而是输入值没有参数化。
比如:
delare @sql nvarchar(max), @name nvarchar(20)
set @name='小明'
set @sql = 'select * from user where username like ''%'+@name+'%'''
--下面有风险
exec (@sql)
--下面这种无风险
set @sql = 'select * from user where username like ''%@name%'''
exec sp_executesql
@stmt=@sql,
@params =N'@name as nvarchar(20)',
@name=@name

其实道理很简单, 如果都是sqlserver内部、数据库内部、你自己写的东西 比如 select , from , where 之类的肯定没有问题, 不用怕。
怕的是什么呢?怕的是外部传过来的东西——比如上面的@name, 这个是从网站的页面传过来的, 如果不用参数化, 绝对有sql注入风险!

sql注入

如果你还有疑问, 可以列出具体的例子来, 我可以为你尽力解答!

解决方案二:

拼接sql是可能被注入的,所以尽量少用加号来拼接,可以用参数的形式进行参数化查询

解决方案三:

存储过程参数化啊 我们公司都是这么做的 比拼接sql即方便又效率还易懂。

解决方案四:

看你用的什么开发环境,拼接的解决方案 现在只有 oracle + java 可以实现 ,真正的实现 语句和参数的分离 。 现在市场所有的 orm 的最终 运行都是 拼接出来的 sql。
普通的 关系型数据库 例如 mysql mssql 等 只能是在 数据类型方面 和 符号转换方面做文章了。

解决方案五:

解决方案六:

可以拼接,使用参数或者直接拼接就而已了。

解决方案七:

多搞几个参数吧,为了安全规范,总要牺牲点什么。忍了吧。

解决方案八:

使用SQLiteDatabase,传参的形式查询
SQLiteDatabase db = helper.getReadableDatabase();
Cursor c = db.query("TableName", null, null, null, null, null, null);
具体参见http://www.cnblogs.com/maxinliang/archive/2013/01/22/2871474.html

时间: 2025-01-19 15:04:19

mssql-存储过程不让拼接SQL语句的相关文章

存储过程中拼接SQL语句

很多时候我们需要利用参数在存储过程中重新组织SQL语句,在存储过程中拼接的SQL语句只是一个字符串,不会被直接执行,所以加一个execute执行它就可以了.具体看如下演示代码: 代码: set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go -- ============================================= -- Author:  yy -- Create date: 2012-1-17 -- Description: 存储过程S

SqlServer存储过程实现及拼接sql的注意点_MsSql

这里我昨天碰到的问题就是执行一段根据变量tableName对不同的表进行字段状态的更改.由于服务器原因,我不能直接在数据访问层写SQL,所以只好抽离出来放到存储过程里面. 这里就出现了一个问题,我花费了好久才弄通! 其实就是很简单的一个SQL语句: update table1 set field1=value1,field2 = value2 where id = id 我写成什么样子了呢?大家且看: declare @tableName nvarchar(50), @field1 int, @

SqlServer存储过程实现及拼接sql的注意点

这里我昨天碰到的问题就是执行一段根据变量tableName对不同的表进行字段状态的更改.由于服务器原因,我不能直接在数据访问层写SQL,所以只好抽离出来放到存储过程里面. 这里就出现了一个问题,我花费了好久才弄通! 其实就是很简单的一个SQL语句: update table1 set field1=value1,field2 = value2 where id = id 我写成什么样子了呢?大家且看: declare @tableName nvarchar(50), @field1 int, @

row num-关于设置参数值和直接拼接SQL语句问题

问题描述 关于设置参数值和直接拼接SQL语句问题 DECLARE @SysBranchSysNo int,@C1SysNo int,@RepeatNum INT SET @SysBranchSysNo=1; SET @C1SysNo=1073; SET @RepeatNum=1 SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY Quantity desc ) AS DATA_ROW_NUM, * FROM ( SELECT * FROM (SELE

多条件查询拼接sql语句如何防止sql注入

问题描述 假如有四个条件可以任意输入1到4个条件取交集求解 解决方案 解决方案二:引用楼主abc12346579的回复: 假如有四个条件可以任意输入1到4个条件取交集求解 你的"任意输入条件"是什么意思?如果说随便输入sql,那么这其实根本不需要注入,你都随便让人家写代码了,还要想什么"注入"方式干什么?直接干就行了.解决方案三:你要是让人家输入sql,那就相当于超市敞开大门让顾客把东西搬回家,再来讨论"如何防止盗窃"就没有意义了.解决方案四:在

SQL Server中存储过程比直接运行SQL语句慢的原因

原文:SQL Server中存储过程比直接运行SQL语句慢的原因     在很多的资料中都描述说SQLSERVER的存储过程较普通的SQL语句有以下优点: 1.       存储过程只在创造时进行编译即可,以后每次执行存储过程都不需再重新编译,而我们通常使用的SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度. 2.       经常会遇到复杂的业务逻辑和对数据库的操作,这个时候就会用SP来封装数据库操作.当对数据库进行复杂操作时(如对多个表进行 Upd

Oracle中存储过程执行大的Sql语句时如何查看sql是否正确

  在Oracle中编写一个存储过程中,有时会用到较大的sql语句,但是通过PL/sql工具Test查看时又不能看到sql的样子,通过查看发现可以通过Oracle的物理临时表来处理, 在存储过程中添加DBMS_OUTPUT.put_line('要输出的Sql语句'); 然后在PL/sql工具中选中存储过程,右键选择Test执行,执行完成后可以通过DBMS_OUTPUT窗口查看sql结果了,很实用的

MySQL 存储过程中执行动态SQL语句的方法_Mysql

drop PROCEDURE if exists my_procedure; create PROCEDURE my_procedure() BEGIN declare my_sqll varchar(500); set my_sqll='select * from aa_list'; set @ms=my_sqll; PREPARE s1 from @ms; EXECUTE s1; deallocate prepare s1; end; 以上是小编为您精心准备的的内容,在的博客.问答.公众号.

在存储过程中执行动态sql语句,能否提高性能

问题描述 原本在后台写的sql语句很复杂,属于多表连接操作,现在把它放在了存储过程里用动态sqlexec执行,能否提高性能呢 解决方案 解决方案二:1.可以减轻程序负担,把这些工作都交给DBMS2.程序维护起来更加简单3.仅是个人观点解决方案三:存储过程执行动态sql语句时结尾exec(@sql)和execsp_executesql@sql有何区别解决方案四:差不多的,要提高用存储过程好了解决方案五:但是参数是要动态的,必须用动态SQL