aboutsummaryrefslogtreecommitdiff
path: root/files/zh-tw/glossary/sql_injection/index.html
blob: 2e44516cc26204258a67ae8db69f426d6db97f01 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
---
title: SQL 注入
slug: Glossary/SQL_Injection
translation_of: Glossary/SQL_Injection
---
<p><strong>SQL 注入(SQL injection)</strong>利用了網路程式(Web apps)的錯誤輸入。駭客可以透過執行後端資料庫的網路程式,惡意繞過 SQL 指令。</p>

<p>SQL 注入能在未授權的情況下,直接從資料庫訪問資料庫與檢索信息。許多數據洩露肇因於 SQL 注入。</p>

<p><a href="http://www.acunetix.com/wp-content/uploads/2010/09/sql_inj_xss.gif"><img alt="" src="http://www.acunetix.com/wp-content/uploads/2010/09/sql_inj_xss.gif"></a></p>

<h2 id="如何做動">如何做動</h2>

<p><img alt="" src="http://www.infosemantics.com.au/sites/default/files/image/widget_tutorials/Updates_LoginScreen.png" style="height: 309px; width: 293px;"></p>

<p>在輸入 username (用戶名)與 password (密碼)後,GUI 背後的 SQL 查詢會這樣工作:</p>

<pre style="margin-left: 0px;"><strong><span style="color: #0000cd;">"SELECT Count(*) FROM Users WHERE Username=' " + txt.User.Text+" ' AND Password=' "+ txt.Password.Text+" ' ";</span></strong></pre>

<p>假設用戶在 username 欄位輸入了 admin 還在 password 欄位輸入了 passwd123,接著按了下面的 Log in(登入), SQL 查詢會這樣運作:</p>

<pre><strong><span style="color: #0000cd;">"SELECT Count(*) FROM Users WHERE Username=' admin ' AND Password=' passwd123 ' ";</span>
</strong></pre>

<p>如果驗證正確,用戶就可以登入,是個很簡單(所以很不安全)的機制。駭客利用者這種不安全,獲取未經授權的訪問。</p>

<p>駭客使用一種稱為 Magical String 的簡單字串,例如:</p>

<p><strong>Username: <em>admin</em></strong></p>

<p><strong>Password: <em>anything 'or'1'='1</em></strong></p>

<p>在按下 login 按鈕以後,SQL 查詢會這樣運作:</p>

<pre><strong><span style="color: #0000cd;">"SELECT Count(*) FROM Users WHERE Username=' admin ' AND Password=' anything 'or'1'='1 ' ";</span>
</strong></pre>

<p>仔細檢查一下查詢密碼的部分。</p>

<pre><strong>Password=' anything 'or'1'='1 '</strong></pre>

<p>密碼不是 anything,因此 password=anything 會回傳 FALSE(錯誤)。但 '1'='1' 是正確的宣告,所以會回傳 TRUE(正確)。最後,透過 OR (或)運算符,FALSE OR TRUE 的比較結果是 TRUE,認證因而成功通過。只要一點簡單的字串(Magical String)整個資料庫就會被洩漏。</p>

<h2 id="如何避免">如何避免</h2>

<p style="margin-left: 40px;">在執行用戶的憑證查詢前,先做如下的改變:</p>

<pre><span style="color: #0000ff;">$id = $_GET['id'] </span>

<span style="color: #0000ff;">(1) $id = Stripslashes($id)</span>

<span style="color: #0000ff;">(2) $id = mysql_real_escape_String($id)</span></pre>

<p>藉由 (1) 所有輸入字串的單引號 ' 取代成雙引號 ",還有 (2) 在每個 ' 之前加上 /。 修正後的 Magical String 不能繞過驗證,並使你的資料庫保持安全。</p>

<h2 id="了解詳情">了解詳情</h2>

<h3 id="基本知識">基本知識</h3>

<ul>
 <li>維基百科的 {{Interwiki("wikipedia", "SQL資料隱碼攻擊")}}</li>
 <li>OWASP (Open Web Application Security Project) <a href="https://www.owasp.org/index.php/SQL_Injection">解釋 SQL 注入</a></li>
</ul>