4 回答

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

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

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超6個贊
SQL注入是惡意用戶將SQL放入輸入字段以嘗試在您的服務(wù)器上運(yùn)行SQL的地方。
我堅(jiān)持的#1建議是使用參數(shù)化存儲過程而不是在代碼中構(gòu)建原始SQL。
存儲過程參數(shù)不會被執(zhí)行,在大多數(shù)情況下使它們安全。
添加回答
舉報(bào)