我在某些ASP代碼中看到了這一點,並且不理解最後一行,特別是Name =和AND之間的所有引號和引號。什麼被追加?爲什麼我們需要兩個?有人可以澄清此SQL命令
uName = getRequestString("UserName");
uPass = getRequestString("UserPass");
sql = "SELECT * FROM Users WHERE Name ='" + uName + "' AND Pass ='" + uPass + "'"
我在某些ASP代碼中看到了這一點,並且不理解最後一行,特別是Name =和AND之間的所有引號和引號。什麼被追加?爲什麼我們需要兩個?有人可以澄清此SQL命令
uName = getRequestString("UserName");
uPass = getRequestString("UserPass");
sql = "SELECT * FROM Users WHERE Name ='" + uName + "' AND Pass ='" + uPass + "'"
這很簡單,你有一個雙引號的字符串句子的開始。雙引號表示字符串的開始和結束或部分。
例如,如果你有
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,但參數是變量,取決於請求
第一報價('
)標記是在SQL lateron。第二個引號("
)標記ASP的字符串文字。
解析後,查詢將是這樣的:
SELECT * FROM Users WHERE Name ='name' AND Pass ='password'
這就是爲什麼你需要的'
,因爲你的意圖是給DBMS的字符串。
的代碼是建立一個查詢,看起來像這樣:
SELECT * FROM Users WHERE Name = 'foo' AND Pass = 'bar'
它通過從uName
和uPass
變量的文本查詢字符串。
雖然這是非常危險的 - 它是一個開放的門,爲SQL Injection。
此代碼正在爲SQL請求構建完整的字符串。據推測,這是連接到一個網頁,要求用戶名和密碼在一個塊中提交。
的uname和uPass字符串將被設置爲這樣的事:
uName = "John";
uPass = "qwerty";
當SQL字符串被創建時,SQL查詢需要將字符串值引號包圍,所以最終的查詢將看起來像這樣的:
sql = "SELECT * FROM Users WHERE Name ='John' AND Pass ='qwerty'"
如果你寫道:
SELECT x from y where y.name = martin
,你會得到一個錯誤。您需要撇號來表示一個字符串,像這樣:
SELECT x from y where y.name = 'martin'
行情是因爲有人追加到一個字符串變量,然後追加另一個字符串而該字符串,撇號的第一個字符,是我martin
後關閉撇號例。
不要那樣做,我的意思是不要將變量附加到字符串,除非你知道你在做什麼。使用參數化查詢。
**不要以純文本**存儲密碼! – SLaks
該代碼有SQL注入漏洞 – SLaks
你知道[string concatenation](http://en.wikipedia.org/wiki/Concatenation)嗎?嘗試使用預準備語句來避免[SQL注入](http://en.wikipedia.org/wiki/SQL_injection) – A4L