C# 存储过程上的Sql注入

C# 存储过程上的Sql注入,c#,asp.net,sql,sql-server,stored-procedures,C#,Asp.net,Sql,Sql Server,Stored Procedures,我正试图通过登录表单对存储过程执行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.LoginTyp

我正试图通过登录表单对存储过程执行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'或1=1--
但它不起作用。在这段代码中可以进行sql注入吗

要执行存储过程,下面是C代码


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


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

不,不可能使用正确参数化的查询执行SQL注入,只要您使用参数从C代码调用查询即可。如果您自己格式化一个
EXEC sp\u ADM\u login…
SQL字符串,则易受攻击


有了C#代码,你就完全安全了。任何奇怪的值都将被正确转义。

我认为在使用参数时是不可能的。:)旁注:存储过程不应使用
sp
前缀。微软已经这样做了,而且你确实有可能在将来的某个时候发生名称冲突。最好只是简单地避免使用
sp.
并使用其他东西作为前缀,或者根本不使用前缀!事实上,这并不完全正确。如果在动态查询中使用参数作为字符串连接的一部分,则仍然容易受到注入的影响,因为字符串不会被转义,而是文本。使用其他类型的参数(如integer)是安全的。是的,存在风险是正确的,但在此处显示的SP中不存在风险@troyhunt在上面有一个很棒的帖子:
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);