【问题标题】:Sql injection on stored procedure存储过程的 Sql 注入
【发布时间】:2014-06-04 05:30:04
【问题描述】:

我正在尝试通过登录表单对我的存储过程进行 sql 注入。 这是我的存储过程

CREATE proc [dbo].[sp_ADM_Login] 
    @loginName varchar(25),
    @password varchar(100)
)

AS

select
    l.LoginId,
    l.LoginName,
    l.LoginType,
    l.RG_cCode,
    dbo.GetUserName(l.UserDetailsCode, l.LoginType) as [Name],
    isnull(l.DefBranchId, 0) as BranchId,
l.DefBranchCode as branchCode,
l.LoginCode as loginCode
from   
    ADM_Login l 
where  
    LoginName = @loginName and
    [Password] = @password and
    l.IsActive = 1

我尝试将用户名提供给user' or 1=1-- 但它不起作用。是否可以在此代码中进行 sql 注入?

要执行存储过程,这里是C#代码

Database db = DatabaseFactory.CreateDatabase("ConnectionString");
    DbCommand cmd = db.GetStoredProcCommand("sp_ADM_Login");
    db.AddInParameter(cmd, "@loginName", DbType.String, loginName);
    db.AddInParameter(cmd, "@password", DbType.String, password);
    DbDataReader dr = (DbDataReader)db.ExecuteReader(cmd);

【问题讨论】:

标签: c# asp.net sql sql-server stored-procedures


【解决方案1】:

不,只要您从带有参数的 C# 代码中调用它们,就不可能使用正确参数化的查询进行 SQL 注入。如果您自己格式化EXEC sp_ADM_login... SQL 字符串,您很容易受到攻击。

使用正确的参数使用 C# 代码,您是完全安全的。任何奇怪的值都会被正确转义。

【讨论】:

  • 其实,不完全正确。如果您在动态查询中使用参数作为字符串连接的一部分,您仍然容易受到注入的影响,因为您的字符串不会被转义,而是文字。使用其他类型的参数(例如整数)是安全的。
  • 是的,您是对的,存在风险,但此处显示的 SP 中没有。 @troyhunt 有一篇很棒的帖子:troyhunt.com/2012/12/stored-procedures-and-orms-wont-save.html
【解决方案2】:

当您使用参数将信息从代码传递到存储过程时,不可能进行 SQL 注入。

如果您连接来自字符串部分的查询而不使用参数,则可能发生 SQL 注入。

【讨论】:

    猜你喜欢
    • 2018-10-06
    • 2013-05-03
    • 1970-01-01
    • 2014-06-20
    • 2017-08-24
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多