sql-server - 如何编写安全的存储过程
问题描述
我想编写一个安全的简单存储过程,它将根据给存储过程的一些参数从数据库表中选择一些列。
我尝试了两种编写存储过程的方法。
第一种方式:
CREATE PROCEDURE SPBasic
@id int,
@value int
AS
BEGIN
SELECT Id, name, design
FROM SimpleTable
WHERE ID = @id AND value = @value;
END
GO
第二种方式:
CREATE PROCEDURE SPBasic
@id int,
@value int
AS
BEGIN
DECLARE @sql NVARCHAR(MAX);
SET @sql = N'SELECT Id, name, design FROM SimpleTable
WHERE ID = @id AND value = @value';
EXEC sp_executesql @sql, N'@id int, @value int', @id,@value;
END
GO
对于这两种情况,我将脚本运行为:
DECLARE @return_value int
EXEC @return_value = SPBasic
@id = N'11',
@value = 1;drop table test
SELECT 'Return Value' = @return_value
在这两种情况下,我为测试目的创建的临时表测试都被删除了。
所以,我想知道为此目的的安全代码是什么?
解决方案
由于您的两个存储过程都采用整数参数,因此不可能发生 SQL 注入攻击。如果第二个过程采用字符串 (varchar) 参数,则可能会发生 SQL 注入攻击。
推荐阅读
- r - 与手动计算相比,R 中的 glht 函数给出不同的结果
- python - Python:如何根据与其他元组的相似性从大列表中删除元组
- vue.js - 有没有办法在离开和返回页面后保留搜索结果?
- javascript - 我被困在一个关于javascript中的雪动画的项目中
- android - 无法在 react native 上生成 APK: :app:lintVitalRelease
- java-11 - 使用库 jzy3d 时如何解决“ld.so:dl-lookup.c:112:check_match”检测到的问题?
- javascript - 图表js如何根据选择选项的值调用数据集?
- django - 在 Django 管理列表视图中避免 1+n 查询
- php - 为以下 LARAVEL 雄辩查询创建索引
- python - ModuleNotFoundError:没有名为“tensorflow”的模块