亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在PHP中阻止SQL注入?

如何在PHP中阻止SQL注入?

暮色呼如 2019-05-20 13:40:34
如果插入用戶輸入而不修改SQL查詢,則應用程序容易受到SQL注入的攻擊,如下例所示:$unsafe_variable = $_POST['user_input']; mysql_query("INSERT INTO `table` (`column`) VALUES ('$unsafe_variable')");這是因為用戶可以輸入類似的內容value'); DROP TABLE table;--,查詢變為:INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')可以采取哪些措施來防止這種情況發生?
查看完整描述

7 回答

?
慕桂英3389331

TA貢獻2036條經驗 獲得超8個贊

如果您使用的是最新版本的PHP,則mysql_real_escape_string下面列出的選項將不再可用(盡管mysqli::escape_string它是現代版本)。這些天,該mysql_real_escape_string選項只適用于舊版PHP上的遺留代碼。


您有兩個選項 - 轉義您的特殊字符unsafe_variable,或使用參數化查詢。兩者都可以保護您免受SQL注入。參數化查詢被認為是更好的做法,但在使用它之前需要在PHP中更改為更新的MySQL擴展。

我們將首先覆蓋較低影響的字符串。

//Connect$unsafe_variable = $_POST["user-input"];$safe_variable = mysql_real_escape_string($unsafe_variable);mysql_query("INSERT INTO table
 (column) VALUES ('" . $safe_variable . "')");//Disconnect

另請參見mysql_real_escape_string功能的詳細信息。

要使用參數化查詢,您需要使用MySQLi而不是MySQL函數。要重寫您的示例,我們需要類似以下內容。

<?php
    $mysqli = new mysqli("server", "username", "password", "database_name");

    // TODO - Check that connection was successful.

    $unsafe_variable = $_POST["user-input"];

    $stmt = $mysqli->prepare("INSERT INTO table (column) VALUES (?)");

    // TODO check that $stmt creation succeeded

    // "s" means the database expects a string
    $stmt->bind_param("s", $unsafe_variable);

    $stmt->execute();

    $stmt->close();

    $mysqli->close();?>

你想要閱讀的關鍵功能就是mysqli::prepare。

此外,正如其他人所建議的那樣,您可能會發現使用PDO之類的步驟來增加抽象層是有用的/更容易的。

請注意,您詢問的案例非常簡單,更復雜的案例可能需要更復雜的方法。特別是:

  • 如果要根據用戶輸入更改SQL的結構,參數化查詢將無濟于事,并且不需要轉義所需的轉義mysql_real_escape_string。在這種情況下,您最好通過白名單傳遞用戶的輸入,以確保只允許“安全”值。

  • 如果您在條件中使用來自用戶輸入的整數并采用該mysql_real_escape_string方法,您將在下面的注釋中遇到Polynomial描述的問題。這種情況比較棘手,因為整數不會被引號括起來,所以你可以通過驗證用戶輸入只包含數字來處理。

  • 可能還有其他我不知道的情況。您可能會發現是一個有用的資源,可以解決您可能遇到的一些更微妙的問題。


查看完整回答
反對 回復 2019-05-20
?
尚方寶劍之說

TA貢獻1788條經驗 獲得超4個贊

我建議使用PDO(PHP數據對象)來運行參數化SQL查詢。

這不僅可以防止SQL注入,還可以加快查詢速度。

通過使用PDO,而不是mysql_mysqli_pgsql_功能,你讓你的應用程序從數據庫中多了幾分抽象的,因為你必須選擇數據庫提供者很少發生。


查看完整回答
反對 回復 2019-05-20
?
臨摹微笑

TA貢獻1982條經驗 獲得超2個贊


使用PDO和準備的查詢。


($conn是一個PDO對象)


$stmt = $conn->prepare("INSERT INTO tbl VALUES(:id, :name)");

$stmt->bindValue(':id', $id);

$stmt->bindValue(':name', $name);

$stmt->execute();


查看完整回答
反對 回復 2019-05-20
  • 7 回答
  • 0 關注
  • 651 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號