第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

如何在PHP中阻止SQL注入?

如何在PHP中阻止SQL注入?

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

7 回答

?
慕桂英3389331

TA貢獻2036條經(jīng)驗 獲得超8個贊

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


您有兩個選項 - 轉(zhuǎn)義您的特殊字符unsafe_variable,或使用參數(shù)化查詢。兩者都可以保護您免受SQL注入。參數(shù)化查詢被認為是更好的做法,但在使用它之前需要在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功能的詳細信息。

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

<?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();?>

你想要閱讀的關(guān)鍵功能就是mysqli::prepare

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

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

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

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

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


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

TA貢獻1788條經(jīng)驗 獲得超4個贊

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

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

通過使用PDO,而不是mysql_,mysqli_pgsql_功能,你讓你的應(yīng)用程序從數(shù)據(jù)庫中多了幾分抽象的,因為你必須選擇數(shù)據(jù)庫提供者很少發(fā)生。


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

TA貢獻1982條經(jīng)驗 獲得超2個贊


使用PDO和準備的查詢。


($conn是一個PDO對象)


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

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

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

$stmt->execute();


查看完整回答
反對 回復(fù) 2019-05-20
  • 7 回答
  • 0 關(guān)注
  • 645 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號