gpt4 book ai didi

sql-server - 可以将 SqlServer 配置为不执行以字符串形式提交的存储过程吗?

转载 作者:行者123 更新时间:2023-12-03 12:21:27 25 4
gpt4 key购买 nike

场景 A:

SqlConnection con = new SqlConnection(myConnString);
SqlDataAdapter adp = new SqlDataAdapter("EXEC spGetUserInfo 42", con);
DataSet ds;
adp.Fill(ds);

场景 B:

SqlConnection con = new SqlConnection(myConnString);
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = "spGetUserInfo";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@UserID", 42));
SqlDataAdapter adp = new SqlDataAdapter(cmd);
DataSet ds;
adp.Fill(ds);

问题

在讨论如何通过修改调用数据库的底层应用程序代码来加强 SqlServer 以防止 sql 注入(inject)攻击时,提出了一个问题,即是否可以将 SqlServer 配置为简单地不执行以方案 A 的方式编写的存储过程,仅执行允许以场景 B 的方式编写的执行请求。理论上,如果底层应用程序不执行输入验证,场景 A 将容易受到注入(inject)攻击,允许类似“EXEC spGetUserInfo 42; drop database foo; --”的东西可能被执行,而当 SqlServer 无法将“42; drop database foo; --”转换为整数时,方案 B 将无法执行。

是否可以配置SqlServer不执行场景A方式调用的存储过程?

最佳答案

据我所知,我一直在努力寻找一种方法。

我能想到的最接近的事情是以某种方式对网络做一些事情,以便 到 SQL Server 的 RPC 连接被允许,因为“.StoredProcedure”调用通常通过 RPC 进行,但动态 SQL 请求不能。但是,我对网络管理和服务器管理了解不够,不知道这是否可行。

另一种(也是更标准的)方法是简单地为用户/应用程序 CONNECT 访问您的数据库,而不是访问任何数据库对象。然后在他们自己的 SCHEMA 中创建存储过程,并授予他们的所有者/模式对数据库对象(表、 View 、任何其他存储过程等)的正常访问权限。最后,授予用户对该架构中的存储过程的 EXECUTE 访问权限。这仍然不能阻止所有可能的动态 SQL 场景,但它确实消除了它们的危险(以及其中大多数的重点)。

关于sql-server - 可以将 SqlServer 配置为不执行以字符串形式提交的存储过程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1446629/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com