--传进来会变成这样子.当然安全啦CREATE PROCEDURE chekUser @ username varchar(20), @password varchar(20) AS IF EXISTS(SELECT username,password FROM users WHERE username='' or''='' and password='' or''='') RETURN -1 ELSE RETURN 1 GO
IF EXISTS(SELECT username,password FROM users WHERE username='' or''='' and password='' or''='') 这样不是if条件为真了,跟写sql语句一样也可以直接进入,安全?
传进来 是这样 IF EXISTS(SELECT username,password FROM users WHERE username=' or''=' and password=' or''=') 还是这样 IF EXISTS(SELECT username,password FROM users WHERE username='' or''='' and password='' or''='') 有点晕了.
是前一个吧 前一个if永远是假的,后一个if永远是真的,就可能被注入了 谁证实一下就结贴
你不过滤的话,就是表示存在SQL注入的漏洞,攻击方法并不完全是这样的!!!你那只是小耳科!!
呵呵,谢谢 还以为存储过程可以避免SQL注入呢 我书上或者资料上看到过的,为什么说的不一样呢
改成這樣 CREATE PROCEDURE chekUser @ username varchar(20), @password varchar(20) AS DECLARE @pwd SELECT @pwd=isnull(password,'') FROM users WHERE username=@username IF (@pwd<>'' and @pwd==@password) RETURN 1 ELSE RETURN -1這樣就隨便傳什麼非法字符都不要緊, 不要將用戶和密碼一起驗證. GO
那我这个存储过程是安全的.是吧
@ username varchar(20),
@password varchar(20)
AS
IF EXISTS(SELECT username,password FROM users
WHERE username='' or''='' and password='' or''='')
RETURN -1
ELSE
RETURN 1
GO
就是在你的变量没传进来之前,sql语句还没生成.要用exec(@sql)
那样的话会把你的or 关系动态生成到你的sql语句中,
那样的话就危险了.
WHERE username='' or''='' and password='' or''='')
这样不是if条件为真了,跟写sql语句一样也可以直接进入,安全?
是这样
IF EXISTS(SELECT username,password FROM users
WHERE username=' or''=' and password=' or''=')
还是这样
IF EXISTS(SELECT username,password FROM users
WHERE username='' or''='' and password='' or''='')
有点晕了.
前一个if永远是假的,后一个if永远是真的,就可能被注入了
谁证实一下就结贴
还以为存储过程可以避免SQL注入呢
我书上或者资料上看到过的,为什么说的不一样呢
CREATE PROCEDURE chekUser
@ username varchar(20),
@password varchar(20)
AS
DECLARE @pwd
SELECT @pwd=isnull(password,'') FROM users WHERE username=@username
IF (@pwd<>'' and @pwd==@password)
RETURN 1
ELSE
RETURN -1這樣就隨便傳什麼非法字符都不要緊,
不要將用戶和密碼一起驗證.
GO
DECLARE @pwd varchar(20)
你这句SELECT @pwd=isnull(password,'') 是认为用户不输入password ,则把password 的null值
改成''吧。
可是楼住的意思是输入这样一个东西
' or''='
不是不输东西。
@ username varchar(20),
@password varchar(20)
AS
DECLARE @pwd varchar(20)
SELECT @pwd=password FROM users WHERE username=@username
IF (@pwd is null or @pwd <> @password)
RETURN FALSE
ELSE
RETURN TRUE
可以进入,我知道直接放在应用程序中不安全,' or''='可以进入。
另再加20分,晚上22直接:00前一定结贴。