看到别人写 SQL 会在 where 后面写 1=1,是什么意思?

2016-09-02 11:46:49 +08:00
 KagamineLenKai2

SELECT * FROM operation_log o
where 1=1
and o.operation_time>='2016/6/1'
and o.operation_time<'2016/7/28'
这个 1=1 好像写不写都没关系哦?

22073 次点击
所在节点    MySQL
77 条回复
wbing
2016-09-03 09:22:19 +08:00
原来还有这种方式, get 到了
badcode
2016-09-03 09:22:38 +08:00
有一种场景
删表中全数据的时候
DELETE FROM `table` WHERE 1=1
ykrl089
2016-09-03 10:14:41 +08:00
@caixiexin 问题是很多人拼着拼着就忘了,或者换个人开发不定按套路来。所以还是 orm 安全点
516654246
2016-09-03 10:21:09 +08:00
查询时偶尔也会这样写。为了调试...
select xx from table where
a=x?
and b=y?
我如果调试不要过滤条件是不是把 2 、 3 行干掉还得去把 where 删掉?
我如果加了 1=1...
至于性能...?和强迫症
blacklee
2016-09-03 11:30:55 +08:00
一起写 Java 的时候经常这么干,并没有什么不好的。
现在自己写 Rails 就不需要这么干了

``
<code>
@topics = Topic.all
if params[:name] && !params[:name].empty?
@topics = @topics.where("title like ?", "%#{params[:name]}%")
end
if params[:id] && !params[:id].empty?
@topics = @topics.where("id = ?", "#{params[:id]}")
end
if params[:status] && !params[:status].empty?
@topics = @topics.where("status = ?", params[:status])
end
</code>
``

顺便看看 V2 的编辑器能不能搞代码
tabris17
2016-09-03 13:48:09 +08:00
复杂的 sql 虽然用的少,但是绝对是必要的,一般会写个自动拼接 sql 的助手类,可以避免注入
mind3x
2016-09-03 20:47:48 +08:00
楼上写 Java 的各位,即使不用 ORM ,还有个东西叫 jOOQ
conglovely
2016-09-04 00:12:08 +08:00
经常用 plsql ,写 1=1 美化后, and 在下一行,方便注释。。。
dungeonsnd
2016-09-04 09:45:33 +08:00
大家都在用 ORM 吗?
如果有些平台或者库没有特别好的怎么办? 比如 iOS 平台,我不想用 CoreData ,想用 fmdb 。那怎么用 ORM? 自己开发一套 ORM?
fortunezhang
2016-09-04 11:29:51 +08:00
为以后用填坑呢.如果哪天想要添加条件直接在 1=1 后面写,或者替换 1=1 就可以了
ETO
2016-09-05 09:03:15 +08:00
@yueyoum 不能赞同。:)
wilddog
2016-09-05 09:23:26 +08:00
是为了拼接 sql !
lbp0200
2016-09-05 11:06:14 +08:00
SQL 注入欢迎您
initdrv
2016-09-05 11:28:02 +08:00
看似简单的问题,其实不简单啊,在下输了,只知道方便拼接条件,却没想到能涉及那么多方面的知识……
Lucups
2016-09-05 16:27:56 +08:00
这种 where 1 = 1 的写法我几年前年第一次见到同事写时觉得有点 low ,但发现确实很实用。

ORM 在 SQL 比较复杂的情况下确实比较乏力,所以有时候用这种方式快捷方便,也容易理解, ORM 写出来的代码可能更难理解。

另外,这个用法跟 SQL Injection 有半毛钱关系?
wmhx
2016-09-05 16:30:33 +08:00
1=1 和注入没关系, 只是为了拼接方便, 拼接当然是拼接有占位符的 sql, 以下是我用 jfinal 的示例:
String sqlExceptSelect = " from t1 where 1=1 ";
List < Object > paras = new ArrayList < Object > ( );
if ( !"".equals ( pinfen1 ) ) {// /评分 start
sqlExceptSelect += " and {pinfen}>=? ";
paras.add ( pinfen1 );
}
if ( !"".equals ( pinfen2 ) ) {// /评分 end
sqlExceptSelect += " and {pinfen} <=? ";
paras.add ( pinfen2 );
}
sqlExceptSelect = sqlExceptSelect.replaceAll ( "\\{pinfen\\}" , "cast( `评分` as decimal(10,2))" )// /
Page < Record > llpg = DB ( db ).paginate ( 1,20, "select * " , sqlExceptSelect , paras.toArray ( new Object [ paras.size ( ) ] ) );

pinfen1 和 pinfen2 是界面输入的, 您看能注入么?
dhssingle
2016-09-05 18:58:44 +08:00
注入和 1=1 有毛关系

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/303424

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX