簡體   English   中英

這段代碼對 SQL 注入安全嗎

[英]Is this code safe from SQL injection

我想讓我的代碼盡可能安全地免受任何類型的攻擊,我希望對我在下面使用的簡單代碼有所了解。 關於如何使其更安全(如果它易受攻擊)以及為什么會很棒的任何指示。 我讀過使用准備好的語句是防止攻擊的最佳實踐。

<?php 

    try {
    $conn = new PDO('mysql:host=localhost;dbname=test', 'user', 'XXXXX');
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $stmt = $conn->prepare('INSERT INTO people (name, email) VALUES (:name, :email)');

    $stmt->execute(array(':name' => $_POST['name'], ':email' => $_POST['email']));

    #If one or more rows were returned...

    } catch(PDOException $e){
        echo'ERROR: ' . $e->getMessage();
    }
    echo "Added $_POST[name] with email $_POST[email] succsessfully";
    $conn = null;
    ?>

看起來您可以避免 SQL 注入,但現在您的回聲中存在 XSS 問題。 確保在回顯之前始終清理/轉義用戶輸入。

echo "Added $_POST[name] with email $_POST[email] succsessfully";

應該成為

echo "Added" . htmlspecialchars($_POST['name']) . "with email" . htmlspecialchars($_POST['email']) . "succsessfully";

由於准備好的語句,它是 SQL 注入安全的。 但請記住,在瀏覽器中回顯這些變量可能會導致 XSS 問題。 最好始終確保您的用戶輸入是干凈的,通常 htmlspecialchars 足以輸出,更好的是在將用戶輸入提交到數據庫之前清理它。

是的,在 SQL 查詢中使用參數降低了 SQL 注入攻擊的可能性。 但我會清理從 POST 收到的數據,還要檢查是否存在。

$name = isset($_POST['name']) ? htmlspecialchars($_POST['name']) : NULL;
$email = isset($_POST['email']) ? htmlspecialchars($_POST['email']) : NULL;
$stmt->execute(array(':name' => $name, ':email' => $email));

請記住,如果您傳遞 null,則這些數據庫字段應接受 null 值

我也會考慮出於習慣使用bindParam ..我的理解是 PDO 會進行類型檢查(這對 PARAM_STR 並不重要),這可能會使您免於其他一些攻擊媒介。

(並添加 XSS 消毒 Skatox、Ryan 和 John 提到的內容。)

$name = isset($_POST['name']) ? htmlspecialchars($_POST['name']) : NULL;
$email = isset($_POST['email']) ? htmlspecialchars($_POST['email']) : NULL;
stmt = bindParam(':name',$name, PDO::PARAM_STR);
stmt = bindParam(':email',$email, PDO::PARAM_STR);
$stmt->execute();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM