解决方案 »
- sqlserver 一个自增的字段插入后如何获取这个新增字段id?
- 求一个语句,在线结贴
- sql小问题
- 可以让数据库帐户只能让本地登录或者指定IP登录吗?
- 散粉: 趁热儿送上刚写的一句日期相关的 SQL !
- 恢复数据库,用户无法恢复
- 如何选择数据库里的特定记录然后将它们导出到excel文件里?
- SQL SERVER 7.0的服务器版可不可装在WINDOWS2000 Professional?
- 改造AspNetPager最新版的存储过程失败,大家帮我看看问题出在哪里
- 多对多关系的处理,绝对富有挑战性!(在线等)
- 如果通过表A的字段来决定表B的另一个字段值????
- sqlserver 存储过程实现无限级分类查询
而'x'='x'永远为真,你说是不是能把所有记录查询出来呢?
id='某用户id'and password='aaaaaa'or'x'='x'or的优先级比and高 所以先执行'x='x'这个恒等式
or的优先级比and高吗???不是吧!!!好的,不管优先级了,可能是我对select查询的原理不理解,那么就算是id'and password='aaaaaa'or'x'='x'恒等成立为什么查询就与password无关了??还有,为什么一个id就可以查询多有的用户名???
/*
or 是 "或"关系, 只要有一个条件满足就可以了.
and 是 "并"关系,要两个条件同时满足才可以.
动态SQL一般用 sp_executesql, 来防止SQL注入.下面的语句就不会被注入了
*/
DECLARE @id INT
DECLARE @pw VARCHAR(100)
SET @id = 1
SET @pw = '''aaaaaa'' OR 1 = 1'
EXEC sp_executesql N'select name from person where id = @id and password = @pw'
,N'@id INT, @pw VARCHAR(100)'
,@id = @id, @pw = @pw
GO/*而下面的语句, SQL优化器因为最后有 OR 'x'='x' 认为整个 where 条件恒为 True
,而直接忽略前面 id 和 password的验证 (即使验证前面2个条件也是多此一举)*/
SELECT name FROM person where id='某用户id'and password='aaaaaa' OR 'x'='x'
GO--但是下面的情况(表名为变量)用 sp_executesql 就会出错
DECLARE @tablename VARCHAR(100)
SET @tablename = 'sys.objects'
EXEC sp_executesql N'select * from @tablename', N'@tablename VARCHAR(100)', @tablename = @tablename
GO-- 用 EXEC 不会出错
DECLARE @tablename VARCHAR(100)
SET @tablename = 'sys.objects'
EXEC ('select * from ' + @tablename)
GO
就像你所说的 恒等成立
select * from table where ……
查询时 where 后面的 就可以看做是true和false ,当id和密码都满足时就是TRUE 或者说 数据库中有满足的数据是就是true 相反则false 就是麽有相应的数据。现在你这里都横成立的 就是数据库的所有记录都符合你的条件(无所谓你输入的是什么……),所以差的的所有记录,而不是你所说的一个id可以查所有用户(这里你的id不做查询条件了,已经……)