6 回答

TA貢獻1817條經驗 獲得超14個贊
它放下了學生桌。
學校計劃中的原始代碼可能看起來像
q = "INSERT INTO Students VALUES ('" + FNMName.Text + "', '" + LName.Text + "')";
這是將文本輸入添加到查詢中的天真方式,非常糟糕,正如您將看到的那樣。
在第一個名稱,中間名稱文本框FNMName.Text(即Robert'); DROP TABLE STUDENTS; --
)和最后一個名稱文本框LName.Text(讓我們調用它Derper
)的值與查詢的其余部分連接之后,結果現在實際上是由兩個查詢分隔的查詢語句終止符(分號)。第二個查詢已注入第一個查詢。當代碼對數據庫執行此查詢時,它將如下所示
INSERT INTO Students VALUES ('Robert'); DROP TABLE Students; --', 'Derper')
用簡單的英語粗略地翻譯成兩個查詢:
使用名稱值“Robert”向Students表添加新記錄
和
刪除學生表
超過第二個查詢的所有內容都標記為注釋: --', 'Derper')
將'
在學生的名字是不是一個評論,它的收盤字符串分隔符。由于學生的名字是一個字符串,因此在語法上需要完成假設的查詢。注入攻擊僅在它們注入的SQL查詢產生有效SQL時才有效。

TA貢獻1777條經驗 獲得超10個贊
正如其他人已經指出的那樣,');
關閉原始陳述,然后是第二個陳述。大多數框架(包括PHP等語言)到目前為止都有默認的安全設置,不允許在一個SQL字符串中使用多個語句。例如,在PHP中,您只能使用該mysqli_multi_query
函數在一個SQL字符串中運行多個語句。
但是,您可以通過SQL注入操作現有的SQL語句,而無需添加第二個語句。假設你有一個登錄系統,用這個簡單的選擇來檢查用戶名和密碼:
$query="SELECT * FROM users WHERE username='" . $_REQUEST['user'] . "' and (password='".$_REQUEST['pass']."')";$result=mysql_query($query);
如果您提供peter
用戶名和secret
密碼,則生成的SQL字符串將如下所示:
SELECT * FROM users WHERE username='peter' and (password='secret')
一切安好?,F在假設您提供此字符串作為密碼:
' OR '1'='1
然后生成的SQL字符串將是這樣的:
SELECT * FROM users WHERE username='peter' and (password='' OR '1'='1')
這樣您就可以在不知道密碼的情況下登錄任何帳戶。因此,您不需要能夠使用兩個語句來使用SQL注入,但如果您能夠提供多個語句,則可以執行更具破壞性的操作。

TA貢獻1820條經驗 獲得超9個贊
單引號是字符串的開頭和結尾。分號是聲明的結尾。所以,如果他們做這樣的選擇:
Select *From StudentsWhere (Name = '<NameGetsInsertedHere>')
SQL將成為:
Select *From StudentsWhere (Name = 'Robert'); DROP TABLE STUDENTS; --')-- ^-------------------------------^
在某些系統上,select
會首先運行,然后是drop
語句!消息是:不要將值嵌入到您的SQL中。而是使用參數!
添加回答
舉報