别人说用存储过程 可以彻底解决sql注入的问题,但我用了,怎么还是有这样的问题??sqlserver存储过程如下:CREATE PROCEDURE select_account
(
@Account [char](16),
@Pwd [char](32)
) ASSELECT * FROM [Account] WHERE Account=@Account And Pwd=@Pwd
GO调用过程就不写了,就是那个para什么的现在用 'or''='还是能直接进入,不用存在的用户名和密码,不知如何解决??????
(
@Account [char](16),
@Pwd [char](32)
) ASSELECT * FROM [Account] WHERE Account=@Account And Pwd=@Pwd
GO调用过程就不写了,就是那个para什么的现在用 'or''='还是能直接进入,不用存在的用户名和密码,不知如何解决??????
用 SqlParameter是可以解决得
你专时的数据中
Account 是16个字长吗?
pwd是32个字长吗?
然后在输入的时候对输入字符串进行验证(客户端和服务器端的)
这样.注入就不会轻易的产生了吧??
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(""");
break;
case '<':
retVal.Append("<");
break;
case '>':
retVal.Append(">");
break;
default:
retVal.Append(inputString[i]);
break;
}
} // Replace single quotes with white space
retVal.Replace("'", " ");
} return retVal.ToString();
}
}
}
而注入式攻击是利用了你知识不扎实或者疏忽,使用了合法的字符对你的攻击,除非你在过程里首先进行用户名与密码的判断,即参数作为一个整体,被与数据库中的记录进行匹配,否则也是不能完成的
(
@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