4 回答

TA貢獻1744條經驗 獲得超4個贊
當應用程序的用戶能夠影響數據庫查詢的含義時,就會發生SQL注入。當用戶輸入的任意字符串連接起來創建提供給數據庫的SQL時,通常會發生這種情況。例如,假設我們有以下代碼(在PHP中,但對于任何語言都是如此),可能用于處理用戶登錄。
$sql = "SELECT FROM users WHERE username='".$_GET['username']."' AND password='".$_GET['password']."'";
當用戶輸入類似內容時會造成傷害
administrator'; --
...用于用戶名。沒有適當的編碼,查詢將變為:
SELECT * FROM users WHERE username='administrator'; -- AND password=''
這里的問題是'在用戶名中關閉用戶名字段然后 - 啟動SQL注釋,導致數據庫服務器忽略字符串的其余部分。最終結果是用戶現在可以以管理員身份登錄,而無需知道密碼。SQL Inection還可用于執行UPDATE,DELETE或DROP查詢,并真正損壞數據庫。
可以通過使用參數化查詢或應用語言/工具包的轉義函數(例如PHP中的mysql_real_escape_string())來防止SQL注入。
一旦你理解了SQL注入,你就會得到這個漫畫背后的笑話。

TA貢獻1833條經驗 獲得超4個贊
SQL注入是指那些應該是數據的東西被不情愿地視為SQL代碼。
例如,如果你這樣做的話
mysql_query("SELECT * FROM posts WHERE postid=$postid");
通常它會給你帶有給定id的帖子,但是假設它$postid
被設置為字符串10; DROP TABLE posts --
; 突然之間,您發送的實際查詢是
mysql_query("SELECT * FROM posts WHERE postid=10; DROP TABLE posts --");
這是一個很大的問題,因為你會因惡意用戶丟失整個帖子表 - 哦親愛的。
防止這種情況的最簡單方法是使用預準備語句,例如通過PDO或MySQLi。
那么PDO中的等效示例就是
$statement = $db->prepare('SELECT * FROM posts WHERE postid = :postid');$statement->bindValue(':postid', $postid);$statement->execute();
這樣做可以確保數據庫系統知道$ postid將被視為數據而不是代碼,因此將被適當地處理。

TA貢獻1848條經驗 獲得超6個贊
SQL注入是惡意用戶將SQL放入輸入字段以嘗試在您的服務器上運行SQL的地方。
我堅持的#1建議是使用參數化存儲過程而不是在代碼中構建原始SQL。
存儲過程參數不會被執行,在大多數情況下使它們安全。
添加回答
舉報