提供的 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 語句的結構不會被改變。