首先申明,不是为了恶意破坏别人的站点。只是为了自己的站点安全性更高有这么一个存储过程用来检测用户登录的--用户登录验证CREATE Procedure UsersLogin
(
    @UserID      VARCHAR(50),
    @Password   NVARCHAR(50),
    @LoginID INT OUTPUT  --用于接受所选记录数,判断是否有该用户
)
ASSELECT @LoginID=COUNT(*) FROM Users WHERE UserID = @UserID AND [Password] = @PasswordIF @@Rowcount < 1 
SELECT 
    @LoginID = 0
GOUserID字段不是主键,要怎么样传值给这个存储过程才能把UserID的值更新为这是一个测试

解决方案 »

  1.   

    set @Password=''' or ''1=1'
      

  2.   

    我是问
    调用这个存储过程的时候,传什么值进去
    可以把UserID的值更新为'这是一个测试'
      

  3.   

    这是sql注入是没有更改存储过程的权限的只能是通过传递的参数来达以目的
      

  4.   

    一般来说只要不是拼装sql语句,已经很大程度上避免了sql注入了
      

  5.   

    各位兄弟,我只是问
    调用这个存储过程的时候,传什么值进去
    可以把UserID的值更新为'这是一个测试'
    就是 UPDATE Users SET UserID='这是一个测试'
    就是在用户登录的时候让存储过程去执行上面那条语句呀我的目的也是为了避免注入,但我必须知道通过什么样的方式来避免
    现在这个数据库就是出了这个问题了,UserID的值经常被人恶意的更新,而站点程序不是我写的,那个开发的人源程序又不肯给,只说是帮我们修改。所以,我必须找出问题所在,然后把问题反馈给他,他再去有针对性的更改他自己的程序呀
      

  6.   

    告诉那个土人改用parameter,不要用command string
      

  7.   

    谢谢上面大哥的意见我现在是想知道,别人是怎么更改的UserID的值用另一句话来说就是我想还原犯罪现场然后得出最有可能的破坏方式,再反馈给那个人加以改正
      

  8.   

    SELECT @LoginID=COUNT(*) FROM Users WHERE UserID = @UserID AND [Password] = @Password如果这条语句变成
    SELECT @LoginID=COUNT(*) FROM Users WHERE UserID = 'value' AND [Password] = 'value' Update Users SET UserID='这是一个测试'
    的话,那么就可以更新UserID的值了所以,有没有什么办法在登录界面输入密码的那里,让传进去参数以后密码验证部份变为
    [Password] = 'value' Update Users SET UserID='这是一个测试'
    请各位大侠看看
      

  9.   

    哦,对了,登录页面是asp.net&C#的
      

  10.   

    没有办法. 
    SQL注入主要针对的是拼装SQL语句,asp.net&C#调用存储过程我想肯定用SqlParameter或OleDbParameter传递参数,而SqlParameter或OleDbParameter会检查输入的类型和长度,确保输入值在数据库中当作文本值而不是可执行代码进行处理。