Kyl*_*ard 2 c# sql-server stored-procedures sql-injection
我正在使用以下代码创建一个SqlCommand由用户指定的存储过程的名称UserStoredProcedureName:
new SqlCommand(UserStoredProcedureName, connection)
{ CommandType = CommandType.StoredProcedure }
Run Code Online (Sandbox Code Playgroud)
没有对用户提供的字符串进行验证UserStoredProcedureName。用户是否只能指定数据库中存储过程的名称?用户是否能够通过制作恶意存储过程名称来执行 SQL 注入攻击?
例如:
UserStoredProcedureName = "SELECT * FROM USERS";
Run Code Online (Sandbox Code Playgroud)
您不应该让外部代码提供存储过程名称。原因:存储过程可能是sp_executesql,它可以运行您作为第一个参数提供的任何内容。它也可以是xp_cmdshell或类似的。
所以:您仍然应该通过白名单控制输入存储过程名称。如果名称来自您自己的代码,则应该没有问题,并且在这种情况下将其列入白名单是不正常的。
注意:如果存储过程在内部使用EXEC (@sql)or EXEC sp_executesql @sql,那么它仍然可以呈现 SQL 注入攻击,这取决于是否@sql可能包含恶意的非参数化 SQL。请注意,sp_executesql它旨在允许您完全参数化动态 SQL,即使在 SQL 内部生成的 SQL 中也能避免 SQL 注入攻击。
| 归档时间: |
|
| 查看次数: |
635 次 |
| 最近记录: |