原文來自:https://blog.csdn.net/zc474235918/article/details/50544484
看一下這兩個句子:
select * from user select * from user where 1=1
這兩個 句子執行結果是一樣一樣的。而sql注入就是利用了這個原理 來進行破壞。比如:
select * from user where id='1000'
如果允許用戶輸入的話,那么這個句子就成了:
select * from user where id='XXX' or 1=1
這樣的話,這個句子就是恆成立的了。
上述1=1 的使用,會影響預先指定的查詢結果,使得本來要查詢的數據 失效。
where 1=1 這種寫法 雖然給程序開發人員帶來不便,還要避免sql注入的問題。 但 “1=1” 這種寫法 也會給程序編寫增加了方便。
1=1 可以很方便的規范語句
對於組合查詢的來說,因為查詢比較模糊,而查詢的where條件的個數也不確定。
一般這樣的sql語句進行查詢的時候:
sql.append("select * from User"); if (whereUser.getID()!="") { sql.append(" where ID=@id"); } if (whereUser.getName()!="") { sql.append(" and Name=@name"); } if (whereUser.getAddress()!="") { sql.append(" and Phone=@phone"); }
對於上述這種寫法,邏輯上感覺沒有問題。但是如果whereUser里面的id為空。那么最后拼接出來得到的語句會成:
select * from User and Name='XXX' and Phone='XXX'.
這條語句 沒有where關鍵字,肯定會報錯的。
但是如果說,既然條件個數未知,那么把where關鍵字放到 if外面去:
sql.append("select * from User"); sql.append("where"); if (whereUser.getID()!="") { sql.append(" ID=@id"); } if (whereUser.getName()!="") { sql.append(" and Name=@name"); } if (whereUser.getAddress()!="") { sql.append(" and Phone=@phone"); }
這樣寫的話,如果三個條件都為空。則這是一條不帶查詢條件的查詢。那么最后這條語句會被解析成:
select * from User where;
這條語句,空有where關鍵字 沒有條件,照樣會報錯的。
對於解決上述這種未知的問題,只能進行各種情況的判斷進行拼接。
當然可以用“where 1=1”進行代碼的規范:
sql.append("select * from User where 1=1 "); if (whereUser.getID()!="") { sql.append(" and ID=@id"); } if (whereUser.getName()!="") { sql.append(" and Name=@name"); } if (whereUser.getAddress()!="") { sql.append(" and Phone=@phone"); }
對於上述的這種寫法,無論是否有條件 都是可以成立的。
無條件的的時候:
select * from User where 1=1;
有條件的時候:
select * from User where 1=1 and id='XX' ……;
這樣寫的代碼,會比 分情況判斷的代碼 更規范。對於以上的寫法,並不是唯一的。也可以使 where ‘a’=’a’ 、’a’<>’b’等。