首頁 > 後端開發 > php教程 > 準備好的語句如何防止 PHP 應用程式中的 SQL 注入攻擊?

準備好的語句如何防止 PHP 應用程式中的 SQL 注入攻擊?

DDD
發布: 2024-12-21 16:46:10
原創
631 人瀏覽過

How Can Prepared Statements Prevent SQL Injection Attacks in PHP Applications?

防止PHP 中的SQL 注入攻擊

在Web 應用程式中,使用者輸入如果不處理,往往會導致SQL 注入等漏洞適當地。當使用者提供的資料未經適當的驗證或清理而直接包含在 SQL 語句中時,就會發生 SQL 注入。

問題

考慮以下PHP 程式碼片段:

$unsafe_variable = $_POST['user_input'];

mysql_query("INSERT INTO `table` (`column`) VALUES ('$unsafe_variable')");
登入後複製

如果使用者輸入惡意資料,例如值'); DROP TABLE table;- -,SQL查詢變成:

INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')
登入後複製

這將導致惡意使用者從資料庫中刪除整個表。

解決方案:準備好的語句和參數化

防止SQL注入的建議解決方案是使用準備好的語句和參數化來將資料與SQL分離查詢。這確保使用者輸入被視為資料而不是可執行命令。

使用 PDO

PDO 為各種資料庫驅動程式提供一致且通用的介面。將預先準備語句與PDO 結合使用:

$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');
$stmt->execute(['name' => $name]);

foreach ($stmt as $row) {
    // Do something with $row
}
登入後複製

使用MySQLi

對於MySQL,MySQLi 在PHP 8.2 中提供了execute_query() 方法:

$result = $db->execute_query('SELECT * FROM employees WHERE name = ?', [$name]);
while ($row = $result->fetch_assoc()) {
     // Do something with $row
 }
登入後複製
或者,在PHP之前的版本中8.2:

$stmt = $db->prepare('SELECT * FROM employees WHERE name = ?');
$stmt->bind_param('s', $name); // 's' specifies the variable type as string
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
     // Do something with $row
 }
登入後複製
對於其他資料庫驅動程序,請參閱其具體文件。

正確的連接設定

為了確保真正的保護,至關重要配置資料庫連接正確:

PDO

停用模擬準備語句:

$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
登入後複製

MySQLi

啟用錯誤回報並設定角色set:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$dbConnection = new mysqli('127.0.0.1', 'username', 'password', 'test');
$dbConnection->set_charset('utf8mb4');
登入後複製

說明

準備好的語句由資料庫伺服器解析和編譯,而參數被視為單獨的值。這可以防止惡意輸入被解釋為命令。

結論

透過使用準備好的語句和參數化,您可以有效地保護您的PHP Web 應用程式免受SQL 注入攻擊並維護資料完整性。

以上是準備好的語句如何防止 PHP 應用程式中的 SQL 注入攻擊?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板