2014-02-10 80 views
0

我在某些ASP代碼中看到了這一點,並且不理解最後一行,特別是Name =和AND之間的所有引號和引號。什麼被追加?爲什麼我們需要兩個?有人可以澄清此SQL命令

uName = getRequestString("UserName"); 
uPass = getRequestString("UserPass"); 

sql = "SELECT * FROM Users WHERE Name ='" + uName + "' AND Pass ='" + uPass + "'" 
+2

**不要以純文本**存儲密碼! – SLaks

+2

該代碼有SQL注入漏洞 – SLaks

+1

你知道[string concatenation](http://en.wikipedia.org/wiki/Concatenation)嗎?嘗試使用預準備語句來避免[SQL注入](http://en.wikipedia.org/wiki/SQL_injection) – A4L

回答

1

這很簡單,你有一個雙引號的字符串句子的開始。雙引號表示字符串的開始和結束或部分。

例如,如果你有

sql ="SELECT * FROM USERS" 

你的句子通吃的價值;如果你有:

sql = "SELCT * FROM USERS" 
whereSentence = " WHERE id = 1" 
wholeSql = sql + whereSentence 

用+(加號)你連接所有的字符串。 通過簡單的引號,您可以在字符串中添加簡單的引號並連接句子的其他部分。

例如,如果

UNAME = '約翰' 和uPass = 'McDonals'

sql = "SELECT * FROM Users WHERE Name ='" + uName + "' AND Pass ='" + uPass + "'" 

你的最後一句話應該是

SELECT * FROM Users WHERE Name = 'John' And Pass = 'McDonals'. 

是一個簡單的方法來說名字是John McDonals作爲String,但參數是變量,取決於請求

0

第一報價(')標記是在SQL lateron。第二個引號(")標記ASP的字符串文字。

解析後,查詢將是這樣的:

SELECT * FROM Users WHERE Name ='name' AND Pass ='password' 

這就是爲什麼你需要的',因爲你的意圖是給DBMS的字符串。

2

的代碼是建立一個查詢,看起來像這樣:

SELECT * FROM Users WHERE Name = 'foo' AND Pass = 'bar' 

它通過從uNameuPass變量的文本查詢字符串。

雖然這是非常危險的 - 它是一個開放的門,爲SQL Injection

0

此代碼正在爲SQL請求構建完整的字符串。據推測,這是連接到一個網頁,要求用戶名和密碼在一個塊中提交。

的uname和uPass字符串將被設置爲這樣的事:

uName = "John"; 
uPass = "qwerty"; 

當SQL字符串被創建時,SQL查詢需要將字符串值引號包圍,所以最終的查詢將看起來像這樣的:

sql = "SELECT * FROM Users WHERE Name ='John' AND Pass ='qwerty'" 
0

如果你寫道:

SELECT x from y where y.name = martin 

,你會得到一個錯誤。您需要撇號來表示一個字符串,像這樣:

SELECT x from y where y.name = 'martin' 

行情是因爲有人追加到一個字符串變量,然後追加另一個字符串而該字符串,撇號的第一個字符,是我martin後關閉撇號例。

不要那樣做,我的意思是不要將變量附加到字符串,除非你知道你在做什麼。使用參數化查詢。