这不是一个新问题了,只是我有感于记忆火花的闪现,怕有一天老了,记不得了,遂索性用文字写下来。另一方面,由于最近忙于写稿,做课题,写论文,很久没有写点技术性相关的东东,觉得心里都不塌实了。
对于高手来说,肯定是都知道的小技巧了。但是,不管是高手低手,在写sql的时候,都避免不了会出现失误,需要各种工具的辅助和大量的手动调整。很多情况下,我们会碰到如何拼一个sql,使之具有高实用性和适用性。比如,你可能需要进行模糊查询,那么此时你需要对Where后的查询条件进行拼接。这时,很可能你会需要这个“1=1”。这样,就可以实现即使查询条件不完整或者用户没有输入查询条件仍然可以取得查询结果。
例子如下:
String strSql = "select * FROM AUDIT_Internet_LOG WHERE 1=1 ";
if(!ip.toLowerCase().equals("")) {
strSql += " AND ip like '%";
strSql += ip;
strSql += "%'";
}
if(!sessionID.toLowerCase().equals("")) {
strSql += " AND sessionID like '%";
strSql += sessionID;
strSql += "%'";
}
例子如下:
String strSql = "select * FROM AUDIT_Internet_LOG WHERE 1=1 ";
if(!ip.toLowerCase().equals("")) {
strSql += " AND ip like '%";
strSql += ip;
strSql += "%'";
}
if(!sessionID.toLowerCase().equals("")) {
strSql += " AND sessionID like '%";
strSql += sessionID;
strSql += "%'";
}
当然,1=1还可以用来进行SQL注入***,这是一种古老的方式,对于目前的应用来讲,似乎早已经失效了。简单说一个例子就是(当然,如果你研究一下,发现还是很多内容的):用户在登录系统的时候,如果使用下面简单的方式来判断用户(假设用户名和密码是admin)是否合法,而不对特殊字符过滤,那很可能就会中招啦——
select * from admin where username='admin' and password='admin'
如果***者在登录名一栏输入:
xxx' or 1=1--
那么,SQL语句就成了
xxx' or 1=1--
那么,SQL语句就成了
select * from admin where username='xxx' or 1=1--' and password='admin'
后面验证密码的部分被注释掉了,实际上对用户的验证也就无效了。
又是一个周末,昨天(周六)被公司叫到客户那边装WAS,回来时已经快凌晨了;今天来了一个朋友,然后下午继续写课题,进展还是不小,于是,晚上偷懒,更新一下blog,呵呵,要不多对不住大家的支持啊。。。