国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

如何防止PHP中的 SQL 注入?

如果用戶輸入未經(jīng)修改就插入到 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)椋?/p>

INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')

做些什么來防止這種情況發(fā)生?防止這些Sql注入?

解決方案

無論使用哪種數(shù)據(jù)庫,避免 SQL 注入攻擊的正確方法是將數(shù)據(jù)與 SQL 分離,讓數(shù)據(jù)保持?jǐn)?shù)據(jù)狀態(tài),永遠(yuǎn)不會被SQL 解析器解釋為命令??梢允褂酶袷秸_的數(shù)據(jù)部分創(chuàng)建 SQL 語句,但如果您不完全理解細(xì)節(jié),則應(yīng)始終使用準(zhǔn)備好的語句和參數(shù)化查詢。這些是與任何參數(shù)分開發(fā)送到數(shù)據(jù)庫服務(wù)器并由其解析的 SQL 語句。這樣攻擊者就不可能注入惡意 SQL。

您基本上有兩種選擇來實現(xiàn)這一目標(biāo):

1、使用PDO(對于任何支持的數(shù)據(jù)庫驅(qū)動程序):

$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');
$stmt->execute([ 'name' => $name ]);
foreach ($stmt as $row) {
// Do something with $row
}

2、使用MySQLi(對于 MySQL):

從 PHP 8.2+ 開始,我們可以使用 execute_query() which 在一個方法中準(zhǔn)備、綁定參數(shù)和執(zhí)行 SQL 語句:

$result = $dbConnection->execute_query('SELECT * FROM employees WHERE name = ?', [$name]);
while ($row = $result->fetch_assoc()) {
// Do something with $row
}

至 PHP8.1:

$stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');
$stmt->bind_param('s', $name); // 's' specifies the variable type => 'string'
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
// Do something with $row
}

如果您要連接到 MySQL 以外的數(shù)據(jù)庫,則可以參考特定于驅(qū)動程序的第二個選項(例如,pg_prepare() 對于 pg_execute() PostgreSQL)。PDO 是通用選項。

正確設(shè)置連接

PDO

請注意,當(dāng)使用PDO訪問 MySQL 數(shù)據(jù)庫時,默認(rèn)情況下不會使用真正的準(zhǔn)備好的語句。要解決此問題,您必須禁用準(zhǔn)備好的語句的模擬。使用PDO創(chuàng)建連接的示例是:

$dbConnection = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8mb4', 'user', 'password');
$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

在上面的例子中,error mode 并不是絕對必要的,但建議添加它。這樣 PDO 將通過拋出 PDOException.

然而,強制性的是第一 setAttribute() 行,它告訴 PDO 禁用模擬的準(zhǔn)備好的語句并使用真正的準(zhǔn)備好的語句。

這確保語句和值在將其發(fā)送到 MySQL 服務(wù)器之前不會被 PHP 解析(使可能的攻擊者沒有機會注入惡意 SQL)。

盡管您可以在構(gòu)造函數(shù)的選項中設(shè)置charset,但請務(wù)必注意“舊”版本的 PHP(5.3.6 之前)會自動忽略DSN 中的字符集參數(shù)。

mysqli

對于 mysqli,我們必須遵循相同的例程:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); // error reporting
$dbConnection = new mysqli('127.0.0.1', 'username', 'password', 'test');
$dbConnection->set_charset('utf8mb4'); // charset

解釋

您傳遞給的 SQL 語句prepare由數(shù)據(jù)庫服務(wù)器解析和編譯。通過指定參數(shù)(如上例中的一個?或命名參數(shù)),您可以告訴數(shù)據(jù)庫引擎您要過濾的位置。:name然后,當(dāng)您調(diào)用 時execute,準(zhǔn)備好的語句將與您指定的參數(shù)值組合。

這里重要的是參數(shù)值與編譯語句組合在一起,而不是 SQL 字符串。SQL 注入的工作原理是在創(chuàng)建要發(fā)送到數(shù)據(jù)庫的 SQL 時誘使腳本包含惡意字符串。因此,通過將實際 SQL 與參數(shù)分開發(fā)送,您可以限制以非預(yù)期結(jié)果結(jié)束的風(fēng)險。

您在使用準(zhǔn)備好的語句時發(fā)送的任何參數(shù)都將被視為字符串(當(dāng)然,盡管數(shù)據(jù)庫引擎可能會進(jìn)行一些優(yōu)化,因此參數(shù)也可能最終以數(shù)字形式結(jié)束)。在上面的示例中,如果$name變量包含'Sarah'; DELETE FROM employees結(jié)果將只是對字符串的搜索"'Sarah'; DELETE FROM employees",而不會以空表結(jié)束。

使用準(zhǔn)備好的語句的另一個好處是,如果您在同一個會話中多次執(zhí)行同一個語句,它只會被解析和編譯一次,從而提高速度。

哦,既然你問過如何插入,這里有一個例子(使用 PDO):

$preparedStatement = $db->prepare('INSERT INTO table (column) VALUES (:column)');
$preparedStatement->execute([ 'column' => $unsafeValue ]);

準(zhǔn)備好的語句可以用于動態(tài)查詢嗎?

雖然您仍然可以為查詢參數(shù)使用準(zhǔn)備好的語句,但動態(tài)查詢本身的結(jié)構(gòu)無法參數(shù)化,某些查詢功能也無法參數(shù)化。

對于這些特定場景,最好的辦法是使用限制可能值的白名單過濾器。

// Value whitelist
// $dir can only be 'DESC', otherwise it will be 'ASC'
if (empty($dir) || $dir !== 'DESC') {
   $dir = 'ASC';
}


文章來源地址http://www.zghlxwxcb.cn/article/260.html




到此這篇關(guān)于如何防止PHP中的 SQL 注入?的文章就介紹到這了,更多相關(guān)內(nèi)容可以在右上角搜索或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

原文地址:http://www.zghlxwxcb.cn/article/260.html

如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請聯(lián)系站長進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • PHP 安全:如何防止PHP中的SQL注入?

    PHP 安全:如何防止PHP中的SQL注入?

    SQL注入防護(hù)對于確保數(shù)據(jù)庫的安全性和完整性至關(guān)重要。它涉及實施有效措施來阻止將未經(jīng)授權(quán)的 SQL 代碼注入應(yīng)用程序的惡意嘗試。開發(fā)人員可以利用輸入驗證和參數(shù)化查詢等技術(shù)來清理用戶輸入,確保任何潛在的惡意代碼都無害。此外,使用預(yù)準(zhǔn)備語句和存儲過程可以通

    2024年04月29日
    瀏覽(22)
  • Python MySQL 數(shù)據(jù)庫查詢:選擇數(shù)據(jù)、使用篩選條件、防止 SQL 注入

    Python MySQL 數(shù)據(jù)庫查詢:選擇數(shù)據(jù)、使用篩選條件、防止 SQL 注入

    要從MySQL中的表格中選擇數(shù)據(jù),請使用\\\"SELECT\\\"語句: 示例選擇\\\"customers\\\"表格中的所有記錄,并顯示結(jié)果: 注意 :我們使用 fetchall() 方法,該方法從上次執(zhí)行的語句中獲取所有行。 要僅選擇表格中的某些列,請使用\\\"SELECT\\\"語句,后跟列名: 示例僅選擇name和address列: 如果您只對

    2024年02月05日
    瀏覽(115)
  • 確保你的數(shù)據(jù)庫安全:如何防止SQL注入攻擊

    最近,越來越多的組織和公司受到SQL注入攻擊的困擾。這種攻擊可以導(dǎo)致數(shù)據(jù)庫中的敏感信息泄露,破壞數(shù)據(jù)完整性,甚至可能導(dǎo)致整個系統(tǒng)崩潰。如果您是一名數(shù)據(jù)庫管理員或網(wǎng)站管理員,您需要了解如何保護(hù)您的數(shù)據(jù)庫免受SQL注入攻擊的威脅。在本文中,小德將介紹什么

    2024年02月02日
    瀏覽(23)
  • PHP中如何防止SQL注入攻擊?

    防止 SQL 注入攻擊是 Web 應(yīng)用程序安全性的一個關(guān)鍵方面。以下是一些在 PHP 中防止 SQL 注入攻擊的常見做法: 使用預(yù)處理語句: 使用預(yù)處理語句和參數(shù)化查詢可以有效防止 SQL 注入攻擊。PHP 中的 PDO(PHP Data Objects)和 MySQLi(MySQL Improved)都支持預(yù)處理語句。 使用 PDO 示例:

    2024年02月04日
    瀏覽(25)
  • 【面試題11】PHP如何防止SQL注入

    本文已收錄于PHP全棧系列專欄:PHP面試專區(qū)。 計劃將全覆蓋PHP開發(fā)領(lǐng)域所有的面試題, 對標(biāo)資深工程師/架構(gòu)師序列 ,歡迎大家提前關(guān)注鎖定。 SQL注入是一種針對應(yīng)用程序的安全漏洞攻擊,攻擊者通過在Web表單輸入惡意SQL語句來偽裝成合法用戶,進(jìn)而獲取服務(wù)器端數(shù)據(jù)庫的

    2024年02月11日
    瀏覽(23)
  • MySQL 安全及防止 SQL 注入攻擊

    如果通過網(wǎng)頁獲取用戶輸入的數(shù)據(jù)并將其插入? MySQL ?數(shù)據(jù)庫,那么就有可能發(fā)生? SQL 注入攻擊的安全問題 作為研發(fā),有一條鐵律需要記住,那就是 永遠(yuǎn)不要相信用戶的數(shù)據(jù),哪怕他一再承諾是安全的 SQL ?注入,就是通過把? SQL ?命令插入到? Web ?表單遞交或輸入域名或頁

    2024年02月02日
    瀏覽(39)
  • 【網(wǎng)絡(luò)安全---sql注入(2)】如何通過SQL注入getshell?如何通過SQL注入讀取文件或者數(shù)據(jù)庫數(shù)據(jù)?一篇文章告訴你過程和原理。

    【網(wǎng)絡(luò)安全---sql注入(2)】如何通過SQL注入getshell?如何通過SQL注入讀取文件或者數(shù)據(jù)庫數(shù)據(jù)?一篇文章告訴你過程和原理。

    分享一個非常詳細(xì)的網(wǎng)絡(luò)安全筆記,是我學(xué)習(xí)網(wǎng)安過程中用心寫的,可以點開以下鏈接獲?。?超詳細(xì)的網(wǎng)絡(luò)安全筆記 本篇博客主要是通過piakchu靶場來講解如何通過SQL注入漏洞來寫入文件,讀取文件。通過SQL輸入來注入木馬來getshell等,講解了比較詳細(xì)的過程; 如果想要學(xué)習(xí)

    2024年02月07日
    瀏覽(27)
  • SQL注入原理以及Spring Boot如何防止SQL注入(含詳細(xì)示例代碼)

    點擊下載《SQL注入原理以及Spring Boot如何防止SQL注入(含詳細(xì)示例代碼)》 SQL注入是一種針對數(shù)據(jù)庫的攻擊技術(shù),攻擊者通過在應(yīng)用程序的輸入字段中插入或“注入”惡意的SQL代碼,從而在數(shù)據(jù)庫服務(wù)器上執(zhí)行非授權(quán)的SQL查詢。這種攻擊可能導(dǎo)致數(shù)據(jù)泄露、數(shù)據(jù)篡改、甚至執(zhí)

    2024年02月20日
    瀏覽(30)
  • Node.js + Mysql 防止sql注入的寫法

    關(guān)鍵代碼 訪問數(shù)據(jù)庫相關(guān)代碼 一個分頁查詢?nèi)藛T信息的完整代碼,查詢語句實現(xiàn)了防止sql注入

    2024年01月16日
    瀏覽(21)
  • 【MySQL】MySQL PHP 語法,PHP MySQL 簡介,查詢,下載 MySQL 數(shù)據(jù)庫, SQL 教程

    【MySQL】MySQL PHP 語法,PHP MySQL 簡介,查詢,下載 MySQL 數(shù)據(jù)庫, SQL 教程

    作者簡介: 辭七七,目前大一,正在學(xué)習(xí)C/C++,Java,Python等 作者主頁: 七七的個人主頁 文章收錄專欄: 七七的閑談 歡迎大家點贊 ?? 收藏 ? 加關(guān)注哦!???? MySQL 可應(yīng)用于多種語言,包括 PERL, C, C++, JAVA 和 PHP,在這些語言中,MySQL 在 PHP 的 web 開發(fā)中是應(yīng)用最廣泛。 我們

    2024年02月11日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包