簡體   English   中英

Mysqli准備聲明(SQL注入預防)

[英]Mysqli prepared statement (SQL injection prevention)

在停止使用已棄用的mysql_ *函數后,我切換到了mysqli。 但后來,我注意到非預處理語句對SQL注入是不安全的。 然后,我再次更改了我的代碼。

我所擁有的是以下函數,它檢查數據庫中是否存在變量$ ID ,並打印該行的title值:

function showPostTitle($ID, $mysqli) {
    $result = $mysqli -> query("SELECT ID, title FROM blog where ID = $ID");
    $row = $result -> fetch_array(MYSQLI_BOTH);
    echo $row['title'];
}

我改成了這個:

function showPostTitle($ID, $mysqli) {
    $stmt = $mysqli -> prepare("SELECT ID, title FROM blog WHERE ID = ?");
    $stmt -> bind_param("i", $ID);
    $stmt -> execute();
    $stmt -> bind_result($ID, $title);
    $stmt -> fetch();
    print_r($title);
    $stmt -> free_result();
}

我的問題是:這是實施准備好的陳述的正確方法嗎? 另外,我現在從SQL注入安全嗎? 非常感謝誰回答這個問題:)

你的mysqli邏輯似乎很好, PHP手冊中有一些例子,以防你沒有看到它們。

為什么不在消費時選擇ID呢? 當你只在整個結果集中返回一行時,你真的不需要綁定結果,因為我認為在這種情況下會發生(ID是表中的唯一索引),而是使用get_result

使用mysqli prepare可以防止所有常見的注入攻擊,但不能使用0天的樣式,而這些攻擊尚未成為驅動程序。

看看這篇文章:

PDO准備好的語句是否足以阻止SQL注入?

它使用PDO而不是MySQLi,它通過創建預准備語句來解決同樣的問題。

很抱歉沒有回答您的問題,但只是想提供一個供您考慮的資源。

暫無
暫無

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

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