别人说用存储过程 可以彻底解决sql注入的问题,但我用了,怎么还是有这样的问题??sqlserver存储过程如下:CREATE PROCEDURE select_account
(
@Account  [char](16),
@Pwd        [char](32)
) ASSELECT * FROM [Account]   WHERE  Account=@Account And Pwd=@Pwd
GO调用过程就不写了,就是那个para什么的现在用 'or''='还是能直接进入,不用存在的用户名和密码,不知如何解决??????

解决方案 »

  1.   

    我都是拿程序把sql语句再分析一遍,感觉就是得不偿失。
      

  2.   

    同意 JzeroBiao(先知)
    用 SqlParameter是可以解决得
      

  3.   

    char
    你专时的数据中
    Account 是16个字长吗?
    pwd是32个字长吗?
      

  4.   

    帮助你顶一下 SqlParameter 不是也是通过传字符串操作吗?怎么解决?麻烦高手说一下吧
      

  5.   

    是的 .用Parameters传给sp参数.
    然后在输入的时候对输入字符串进行验证(客户端和服务器端的)
    这样.注入就不会轻易的产生了吧??
      

  6.   

    除非你不用拼出来的SQL语句,不然怎么样都会有危险.......我不明白是如何解决了。
      

  7.   

    看看这个吧,也许有帮助。字符过滤(petshop 中的)using System;
    using System.Text;namespace PetShop.Web.WebComponents
    {
        /**//// <summary>
        /// A sample class to clean the input into web pages 
        /// </summary>
        public sealed class CleanString {        public static string InputText(string inputString, int maxLength) {            
                StringBuilder retVal = new StringBuilder();            // check incoming parameters for null or blank string
                if ((inputString != null) && (inputString != String.Empty)) {
                    inputString = inputString.Trim();                //chop the string incase the client-side max length
                    //fields are bypassed to prevent buffer over-runs
                    if (inputString.Length > maxLength)
                        inputString = inputString.Substring(0, maxLength);                //convert some harmful symbols incase the regular
                    //expression validators are changed
                    for (int i = 0; i < inputString.Length; i++) {
                        switch (inputString[i]) {
                            case '"':
                                retVal.Append("&quot;");
                                break;
                            case '<':
                                retVal.Append("&lt;");
                                break;
                            case '>':
                                retVal.Append("&gt;");
                                break;
                            default:
                                retVal.Append(inputString[i]);
                                break;
                        }
                    }                // Replace single quotes with white space
                    retVal.Replace("'", " ");
                }            return retVal.ToString();
                
            }
        }
    }
      

  8.   

    存储过程执行的还是sql 代码,防止注入式攻击是预先做的,使用存储过程的目的不止是为了防止注入式攻击,如果你的程序直接使用sql 语句进行远程交互并且没有加密,那么你的程序很容易被人攻击。而存储过程屏蔽了这些操作,并没有将你的逻辑处理过程显示给攻击者这样安全性就会好很多。
    而注入式攻击是利用了你知识不扎实或者疏忽,使用了合法的字符对你的攻击,除非你在过程里首先进行用户名与密码的判断,即参数作为一个整体,被与数据库中的记录进行匹配,否则也是不能完成的
      

  9.   

    CREATE PROCEDURE select_account
    (
    @Account  [char](16),
    @Pwd        [char](32)
    ) AS
    if exists (SELECT * FROM [Account]   WHERE  Account=@Account)
      begin
       if (select password from [Account] WHERE  Account=@Account) = @Pwd 
          begin
             select 1  --成功登录
          end
        else
          select 0  --密码错误
      end
    else
      select 2    ---无此用户
    GO
      

  10.   

    顶,楼上的这条SQL可以彻底防之了。其这,老子想了个毒招,就是 把用户名和密码用md5加个密就行了。