一般開發,肯定是在前臺有兩個輸入框,一個使用者名稱,一個密碼,會在後臺裡,讀取前臺傳入的這兩個引數,拼成一段SQL,例如: select count(1) from tab where usesr=userinput and pass = passinput,把這段SQL連線資料後,看這個使用者名稱/密碼是否存在,如果存在的話,就可以登陸成功了,如果不存在,就報一個登陸失敗的錯誤。對吧。但是有這樣的情況,這段SQL是根據使用者輸入拼出來,如果使用者故意輸入可以讓後臺解析失敗的字串,這就是SQL注入,例如,使用者在輸入密碼的時候,輸入 """" " or 1=1"", 這樣,後臺的程式在解析的時候,拼成的SQL語句,可能是這樣的: select count(1) from tab where user=userinput and pass="" or 1=1; 看這條語句,可以知道,在解析之後,使用者沒有輸入密碼,加了一個恆等的條件 1=1,這樣,這段SQL執行的時候,返回的 count值肯定大於1的,如果程式的邏輯沒加過多的判斷,這樣就能夠使用使用者名稱 userinput登陸,而不需要密碼。防止SQL注入,首先要對密碼輸入中的單引號進行過濾,再在後面加其它的邏輯判斷,或者不用這樣的動態SQL拼。
一般開發,肯定是在前臺有兩個輸入框,一個使用者名稱,一個密碼,會在後臺裡,讀取前臺傳入的這兩個引數,拼成一段SQL,例如: select count(1) from tab where usesr=userinput and pass = passinput,把這段SQL連線資料後,看這個使用者名稱/密碼是否存在,如果存在的話,就可以登陸成功了,如果不存在,就報一個登陸失敗的錯誤。對吧。但是有這樣的情況,這段SQL是根據使用者輸入拼出來,如果使用者故意輸入可以讓後臺解析失敗的字串,這就是SQL注入,例如,使用者在輸入密碼的時候,輸入 """" " or 1=1"", 這樣,後臺的程式在解析的時候,拼成的SQL語句,可能是這樣的: select count(1) from tab where user=userinput and pass="" or 1=1; 看這條語句,可以知道,在解析之後,使用者沒有輸入密碼,加了一個恆等的條件 1=1,這樣,這段SQL執行的時候,返回的 count值肯定大於1的,如果程式的邏輯沒加過多的判斷,這樣就能夠使用使用者名稱 userinput登陸,而不需要密碼。防止SQL注入,首先要對密碼輸入中的單引號進行過濾,再在後面加其它的邏輯判斷,或者不用這樣的動態SQL拼。