阿摩線上測驗 登入

申論題資訊

試卷:111年 - 111 高等考試_三級_資訊處理:程式設計#109802
科目:程式設計
年份:111年
排序:0

題組內容

二、資料庫是企業組織或政府部門中用以保存大量資料的機制。下圖為資料表的結構,請回答以下各小題。62ddee0d6e4e8.jpg

申論題內容

(二)現在的資料查詢服務常見於網頁系統,而 SQL Injection 是最常見的資 料庫攻擊方式。請問下列查詢語句是否會有被攻擊的疑慮?若有的話 該如何改善?程式碼可以使用 
PHP 或 ASP.NET。 SELECT first_name, last_name FROM employee WHERE id=’A001’

詳解 (共 1 筆)

詳解 提供者:hchungw

提供的 SQL 查詢語句存在被 SQL 注入攻擊的風險,因為它直接將使用者輸入(在這個例子中是硬編碼的值 'A001')拼接到 SQL 語句中。如果使用者輸入未經過適當處理,攻擊者可以通過注入惡意 SQL 代碼來操縱查詢,進行未授權的數據庫操作。
為了防範 SQL 注入攻擊,最佳做法是使用參數化查詢(Parameterized Queries)。這種方法讓數據庫引擎將用戶輸入作為參數處理,而不是 SQL 語句的一部分,這樣就可以避免惡意輸入影響 SQL 語句的結構。
以下是如何在 PHP 和 ASP.NET 中使用參數化查詢的示例:
PHP (使用 PDO)
php
Copy code
<?php
// 使用 PDO 進行數據庫連接
$dbh = new PDO('mysql:host=localhost;dbname=database_name', 'user', 'password');
// 使用參數化查詢來防止 SQL 注入
$stmt = $dbh->prepare('SELECT first_name, last_name FROM employee WHERE id=:id');
$stmt->execute([':id' => 'A001']);
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    echo $row['first_name'] . ' ' . $row['last_name'];
}
?>
ASP.NET (使用 ADO.NET)
csharp
Copy code
using System;
using System.Data.SqlClient;
class Program
{
    static void Main()
    {
        string connectionString = "Data Source=localhost;Initial Catalog=database_name;Integrated Security=True";
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();
            using (SqlCommand command = new SqlCommand("SELECT first_name, last_name FROM employee WHERE id=@id", connection))
            {
                command.Parameters.AddWithValue("@id", "A001");
                using (SqlDataReader reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        Console.WriteLine(reader["first_name"].ToString() + " " + reader["last_name"].ToString());
                    }
                }
            }
        }
    }
}
在這兩個示例中,都使用了參數化的方法,這樣即使用戶輸入包含 SQL 語句的內容,也不會對資料庫造成安全威脅。這些示例使用了受控制的方式來嵌入外部輸入,這保證了 SQL 語句的結構不會被改變。