當前位置:首頁 » 編程語言 » tp5防sql注入
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

tp5防sql注入

發布時間: 2022-09-10 14:46:51

① thinkphp怎麼做才是安全的sql防注入

  1. 注入的產生一般都是對用戶輸入的參數未做任何處理直接對條件和語句進行拼裝.


    代碼舉例:

    //不安全的寫法舉例1

$_GET['id']=8;//希望得到的是正整數

$data=M('Member')->where('id='.$_GET['id'])->find();

$_GET['id']='8 or status=1';//隱患:構造畸形查詢條件進行注入;

//安全的替換寫法

$data=M('Member')->where(array('id'=>$_GET['id']))->find();//使用數組方式將自動使用框架自帶的欄位類型檢測防止注入

$data=M('Member')->where(array('id'=>(int)$_GET['id']))->find();//類型約束

$data=M('Member')->where('id='.intval($_GET['id']))->find();//類型轉換

$data=M('Member')->where(array('id'=>I('get.id','','intval')))->find();//本人習慣寫法

$data=M('Member')->where(array('id'=>':id'))->bind(':id',I('get.id'))->select();//PDO驅動可以使用參數綁定

$data=M('Member')->where("id=%d",array($_GET['id']))->find();//預處理機制

//不安全的寫法舉例2

$_GET['id']=8;//希望得到的是正整數

$data=M()->query('SELECT * FROM `member` WHERE id='.$_GET['id']);//執行的SQL語句

$_GET['id']='8 UNION SELECT * FROM `member`';;//隱患:構造畸形語句進行注入;

2.防止注入的總的原則是<<根據具體業務邏輯,對來源於用戶的值的范圍,類型和正負等進行限制和判斷>>,同時<<盡量使用THINKPHP自帶的SQL函數和寫法>>.

3.在THINKPHP3.2版本中的操作步驟是:
一:在項目配置文件中添加配置: 'DEFAULT_FILTER' => 'htmlspecialchars', //默認過濾函數
二: 使用框架帶的I方法獲取來自用戶提交的數據;
例子:M('Member')->save(array('content'=>I('post.content')));這樣添加的content內容是經過htmlspecialchars處理過的.

4.為COOKIE添加httponly配置


5.最新版本的thinkphp已經支持此參數。

9.富文本過濾

富文本過濾是,XSS攻擊最令人頭疼的話題,不僅是小網站,就連BAT這樣的巨頭也是三天兩頭的被其困擾.

② tp5 搜索框防sql注入要注意什麼

最有效的方法是使用參數化查詢就能避免sql注入了,防止跨站的話可以使用微軟白名單。或者關鍵字黑名單。

③ thinkphp在執行添加時怎樣防止SQL注入

使用tp自帶的方法添加,應該可以過濾大部分的sql注入。只要不直接拼接sql執行。 一般是不需要你考慮這個問題的。對不對我不知道,因為我不用tp框架。 但是其他框架都是可以自己過濾的。 不需要你去處理什麼。

④ ThinkPHP如何防止SQL注入

(1)查詢條件盡量使用數組方式,這是更為安全的方式;
(2)如果不得已必須使用字元串查詢條件,使用預處理機制;
(3)使用綁定參數;
(4)強制進行欄位類型驗證,可以對數值數據類型做強制轉換;
(5)使用自動驗證和自動完成機制進行針對應用的自定義過濾;
(6)使用欄位類型檢查、自動驗證和自動完成機制等避免惡意數據的輸入;
(7)做一些過濾。

⑤ thinkphp怎麼添加adminer

編譯
當的大小 adminer.php然後我開始增長已經意識到是明智的分割文件管理的發展。盡管如此,我仍然想要的文件我已經創建了一個編譯腳本,連接起來的文件。

因為一切都是一個文件,管理員不能使用通常的URL alter.php?table=X和操作必須通過在查詢字元串中。而不是常見的 ?action=alter&table=X,我有更緊湊的替代使用 ?alter=X。然後一系列中央腳本 if (isset($_GET["..."]))而不是一個大 switch ($_GET["action"])。有一個包括內部的特定功能 if這些包括編譯構建過程中的一個文件:

<?php
function include_file($match) {
$file = file_get_contents($match[1]);
$token = end(token_get_all($file));
$php = (is_array($token) && in_array($token[0], array(T_CLOSE_TAG, T_INLINE_HTML)));
return "?>\n$file" . ($php ? "<?php" : "");
}
$file = preg_replace_callback('~include "([^"]+)";~', 'include_file', $file);
?>
這個代碼不是普遍可用,因為它只發現 include ""變體。它將需要處理的文件token_get_all功能和找到所有包括變體。的 _once變異將會更加困難。也可以有一個全球水平返回.

管理也使用一些外部文件——樣式表,快捷方式圖標和圖像。有幾種可能的訪問這些文件的方法:

他們可以集成在主HTML代碼——樣式表 <style>標簽,利用圖像 data:協議。這種方法的問題是,Internet Explorer 8 <不支持這個協議。第二個問題是,瀏覽器需要反復與每��頁面傳輸這些數據。
可以從外部伺服器下載的文件。會有問題,如果伺服器不可用或如果計算機的運行管理是沒有互聯網連接。然而這種方法是使用SQL查詢語法高亮顯示,這是一個可選的特性——管理使用JavaScript語法高亮顯示JUSH對於這個任務。
文件可以被集成的源代碼和一個特殊的參數將為他們服務。你有沒有注意到PHP輸出的標志嗎phpinfo嗎?PHP從本地伺服器下載它特殊的查詢字元串 ?=PHP…。管理使用類似的方法,節省了Base64編碼的文件的源代碼(編碼不是必需的,但它簡化了腳本編輯共同的文本編輯器)。這種方法允許HTTP緩存管理利用的外部文件。
注意:PHP 5.3附帶了一個支持PHP檔案通過phar擴展。這個擴展,可以裝幾個文件歸檔和從PHP訪問內部的文件歸檔。使用webPhar包裝方法允許大多數PHP應用程序創建phar歸檔和有指令phpMyAdmin的版本PHP手冊。管理不使用這個擴展和使用PHP > = 4.3和PHP > = 5.0。

縮小
編譯腳本也貶低代碼——它刪除評論和修剪空白。大衛的縮小代碼是基於工作Grudl誰使用它為他的才華橫溢的庫Texy,dibi和Nette。這個函數是比內部功能更有效php_strip_whitespace.

<?php
function php_shrink($input) {
$set = array_flip(preg_split('//', '!"#$&\'()*+,-./:;<=>?@[\]^`{|}'));
$space = '';
$output = '';
foreach (token_get_all($input) as $token) {
if (!is_array($token)) {
$token = array(0, $token);
}
if ($token[0] == T_COMMENT || $token[0] == T_WHITESPACE) {
$space = "\n";
} else {
if (isset($set[substr($output, -1)]) || isset($set[$token[1][0]])) {
$space = '';
}
$output .= $space . $token[1];
$space = '';
}
}
return $output;
}
?>
當前版本也縮短用戶變數和函數的名字。它發現的變數和函數的源代碼token_get_all功能和通過短標識符替換它們。縮短過程跳過內部PHP變數和函數。也有可能縮短他們但它會更復雜,它將有一個的性能損失。一些PHP變數有其超全局特性是必要的別名功能內的全球化。

內部函數可以包含在包絡函數較短的名字。然而這種方法是有問題的,因為PHP函數可以有可選參數沒有默認值(這個函數的例子寫入文件這檢測傳遞的參數的數量而不是它們的值)。通用函數func_get_args不使用引用相反。

替代的方法是定義一個變數為一個內部函數(例如 $fw = 'fwrite'通過這個變數)和調用的函數: $fw($fp, $string)。管理但不使用沒有方法,因為它將使應用程序慢下來。

的縮小從CSS和去掉空格也PHP版本的個貶低的JavaScript代碼。

文件會小得多的如果它被壓縮。PHP支持幾個壓縮演算法,但只有通過一個擴展。我在想用PHP編寫的一個簡單的減壓函數將解壓縮文件的其他部分,但需要eval解壓縮代碼和每個人都知道eval是惡(原因之一是不兼容PHP加速器)。因此,代碼不是壓縮但只有縮小。

翻譯
我在英語發展管理。還有一個捷克版本(這是我的母語)從一開始就和管理目前有11種語言。所有消息是由一個簡單的函數,它檢查當前的語言並返回相應的翻譯。

一個簡單的函數檢測的語言 Accept-Language標題:

<?php
function acceptable_language($translations) {
$accept_language = array();
preg_match_all('~([-a-z]+)(;q=([0-9.]+))?~', strtolower($_SERVER["HTTP_ACCEPT_LANGUAGE"]), $matches, PREG_SET_ORDER);
foreach ($matches as $match) {
$accept_language[$match[1]] = (isset($match[3]) ? $match[3] : 1);
}
arsort($accept_language);
foreach ($accept_language as $lang => $q) {
if (isset($translations[$lang])) {
return $lang;
}
$lang = preg_replace('~-.*~', '', $lang);
if (!isset($accept_language[$lang]) && isset($translations[$lang])) {
return $lang;
}
}
return false;
}
?>
這個函數的調用者保存語言一個cookie在第一次檢測。用戶可以隨時改變語言在同一頁面。保存頁面語言餅干是一個非常糟糕的實踐在一個公共網站,因為搜索引擎才能指數只有一個版本的頁面。然而在管理可接受的,因為搜索引擎不索引頁面和頁面的主要內容(例如表結構)在所有的語言都是一樣的。語言存儲在cookie的獎勵是一個簡單的URL而仍有可能執行語言通過語言標識符在查詢字元串中。

翻譯存儲在一個簡單的數組,其中的關鍵是一個消息標識符(這是一個英語版本的消息,並使用它如果翻譯不存在),該值是一個字元串翻譯。值是包含一些更有趣的信息(如「一行」或「兩行」)。大多數語言有不同的單數和復數形式,但有些語言(例如捷克語或俄語)使用更多的復數形式取決於數量(如捷克「皮沃- 1」,「2 piva」或「5 piv」啤酒)。消息和數據都存儲在一個數組,而不是字元串和管理包含一個簡單的邏輯語言選擇正確的形式取決於數量。

默認情況下,管理員有所有語言。編譯轉換翻譯數組值只和改變了標識符數字保存一些位元組每個翻譯大約需要4 KB。編譯腳本也能夠創建一個單一的語言版本,它完全消除了語言翻譯功能和檢測。這個文件只需要111 KB的英文版本管理1.10.1。

資料庫擴展抽象
PHP允許通過三個擴展:連接到一個MySQL資料庫MySQL,mysqli pdo_mysql。管理支持他們和包含這些擴展的一個簡單的抽象層。這個抽象層模擬的子集mysqli和mysqli_result類為所有三個擴展。

PDO的支持是有些微妙,因為PDO使用異常來報告連接錯誤。管理員不能用通常的 try塊來捕捉這些異常,因為它運行在PHP 4。一切都在一個文件所以PDO支持不能有條件地只包括在PHP 5。解決方案是使用set_exception_handler函數來處理連接錯誤。PHP 4還不支持類常量在語法層面上的源代碼使用數值常量代替。

安全
最重要的部分的安全管理是驚人的防禦跨���點請求偽造。CSRF攻擊者可以執行操作在一個登錄的用戶的名字。管理員登錄信息存儲在一個標準的PHP會話所以可以發送cookie會話標識符和抵禦CSRF是必要的。管理員發送一個令牌與每個形式和在執行操作前檢查這個令牌的形式。令牌保護甚至經常被遺忘的注銷動作在其他web應用程序。

非常重要的也是防止跨站點腳本。輸出的HTML代碼存儲在資料庫中可以透露敏感信息攻擊者htmlspecialchars函數每輸出函數逃。

管理也防止SQL注入,但它不是安全的名義——如果攻擊者已經登錄到管理員然後她可以執行任何SQL命令的SQL代碼頁。因此,防止SQL注入只是一個適當的操作與用戶輸入的副作用——用戶可以通過任何數據到資料庫中。如果管理檢測magic_quotes_gpc然後它中和這個指令,並使用適當的轉義函數只有當傳遞到MySQL的數據。

<?php
if (get_magic_quotes_gpc()) {
$process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
while (list($key, $val) = each($process)) {
foreach ($val as $k => $v) {
unset($process[$key][$k]);
if (is_array($v)) {
$process[$key][stripslashes($k)] = $v;
$process[] = &$process[$key][stripslashes($k)];
} else {
$process[$key][stripslashes($k)] = stripslashes($v);
}
}
}
unset($process);
}
?>
調用的session_regenerate_id登錄後防止會話固定。

管理包含的每一個頁面 robots: noindex元信息隱藏頁面的搜索引擎。

登錄表單
管理資料庫證書保存到一個會話,檢查每一頁。如果資料庫不能授權用戶登錄表單是直接顯示在頁面上。這種方法是更好的然後將用戶重定向到一個登錄頁面有��個原因:

它節省了一個請求,直接登錄表單發送到目標頁面。
用戶可以收藏任何頁面,登錄後直接顯示。重定向到一個登錄表單的方法也可以實現這一目標,但要復雜得多(登錄表單需要返回的URL,檢查它的有效性和重定向後登錄,因為 Referer頭不可靠)。
如果會話到期之前發送任何申請表然後發布數據預填充登錄表單隱藏欄位。
<?php
function hidden_fields($process) {
while (list($key, $val) = each($process)) {
if (is_array($val)) {
foreach ($val as $k => $v) {
$process[$key . "[$k]"] = $v;
}
} else {
echo '<input type="hidden" name="' . htmlspecialchars($key) . '" value="' . htmlspecialchars($val) . '" />';
}
}
}
hidden_fields($_POST);
?>
發送文件也保存到隱藏欄位和有一個小層服務的文件帶有_file美元的變數或隱藏欄位。

可以不填表單通過登錄 ?username=參數。用戶可以使用這個特性在一個安全的環境驗證由其他意思(如沒有遠程訪問localhost或HTTP身份驗證)。然而,它是不可能通過密碼在GET參數這將是非常不安全的。管理員使用的價值 mysql.default_password在這種情況下配置指令。演示應用程序使用這種方法自動登錄用戶。

表單處理
管理POST方法發送所有動作形式。如果操作成功,那麼它將瀏覽器重定向到一個頁面顯示結果的確認消息。這消息存儲到一個會話變數後開始執行行動,每個HTML頁面處理這個會話變數。有理論的可能性,其他管理頁面打開同時在不同的瀏覽器選項卡可以捕獲消息並顯示它而不是原始頁面。然而,設置消息和顯示之間的時期很短所以這個概率很低。除此之外,這個巧合的結果小,用戶會被告知結果,只是在不同的選項卡。

另一種可選擇的方法是發送消息ID或消息本身在URL中但雜亂瀏覽器歷史。此外,頁面刷新將保持消息在頁面上,這是不可取的。

如果表單操作產生的錯誤頁面直接顯示錯誤消息與腎上腺素的形式發送數據。不重定向瀏覽器的代碼在這種情況下,它允許一個用戶刷新頁面發送數據只是暫時的錯誤(例如,如果它可以固定在其他瀏覽器選項卡)。

資料庫模式
簡單的資料庫模式管理包含一個簡單的界面的可視化資料庫模式。它顯示所有表的列。顏色區分列類型和箭頭象徵著表引用。表在屏幕上用滑鼠可以移動,通過JavaScript和CSS。資料庫模式頁面使用一個cookie表放置保存。

出口
管理支持SQL和CSV進出口。最有趣的變體出口是使用ALTER命令。通常會有不同的生產和開發伺服器上的資料庫。如果你有了一些變化的資料庫結構應該在發布到生產伺服器然後刪除舊表和創建新的不是一個選擇,因為有實時數據表所示。管理員能夠生成一組改變同步資料庫的命令。它利用一個存儲過程,探討了生產資料庫並改變它符合開發版本。創建新表像往常一樣,舊表下降,缺少欄位和索引。

性能
管理總是查詢所有數據直接從資料庫只有一個例外。獲取資料庫列表可能需要很長時間如果有許多伺服器上的資料庫,即使用戶訪問只有兩個。因為每個頁面顯示資料庫列表緩存是一個會話變數中。這個變數如果刷新用戶創建或刪除一個資料庫從用戶界面或SQL命令。

關閉一個會話session_write_close是一個性能優化影響不大。默認的PHP會話處理程序鎖文件會話數據,從而防止web伺服器為多個請求相同的用戶在同一時間。這是非常重要的網站上使用框架,這是一個常見的情況。管理不使用框架,但用戶仍然可以同時打開多個瀏覽器選項卡與管理。管理員寫所有的會話數據,盡快關閉會話允許的最大並發性。

大多數用戶感受到管理的平滑,甚至一個用戶創建測試套件,衡量phpMyAdmin的性能比較:

性能相同操作的平均速度快了28%(2×23測試)。
登錄後開始快56%(2×4測試)。
最後,了解源代碼是快100%。
示範
演示是一個最好的方式來展示一些產品的特點。 我已經創建了一些樣例資料庫,使它從網站訪問通過管理但用戶已經開始腐蝕它很快。我在想定期恢復資料庫,但它不會工作,因為與此同時資料庫仍然會損壞。另一方面,在重置用戶使用資料庫將正在發生的事情感到驚訝。限制將削弱的操作演示,所以這不是一個選擇。其他可能是模擬資料庫訪問為每個用戶會話,但這將是一個非常復雜的任務,它不會出現管理的所有功能。

最後,我已經結束,為每個用戶創建一個單獨的資料庫進入演示。腳本初始化這個資料庫的示例數據後登錄注銷後的演示和破壞它。一個cron作業滴的用戶資料庫沒有注銷。演示用戶目前���強大的特權管理的特點所以有必要限制資料庫的列表不允許其他用戶訪問資料庫。每個MySQL用戶也可以修改自己的密碼和演示應用程序的用戶很快就發現了它。因此,演示也禁用這個特性。

我不想創建一個單獨的版本的管理只是為了演示我所有定製auto_prepend_file。前綴腳本限制資料庫列表,不允許改變密碼,初始化演示資料庫和滴。

測試和代碼覆蓋率
幾乎所有的應用程序測試。我已經創建了測試Selenium IDE,這是一個非常方便的Firefox插件創建復雜的web應用程序測試。硒的主要優勢是,它可以測試整個應用程序——從PHP伺服器端HTML在客戶端,它甚至可以測試JavaScript交互。管理工作沒有JavaScript但更舒適的啟用了JavaScript的一些特性,例如添加一個表中的欄位不需要將頁面發送到伺服器。

Selenium IDE可以創建測試很容易。可以把記錄按鈕,像通常在瀏覽器中工作。記錄測試之後可以修改如果你檢查的一些特性的應用程序,那麼為什麼不來記錄一個測試嗎?

我很好奇有多少代碼測試和我感興趣的是管理的哪些部分需要更徹底的測試。它可以找到的代碼覆蓋率。我已經使用了Xdebug擴展,能夠測量代碼覆蓋率。它非常適合運行單元測試,因為整個的代碼覆蓋率計算運行的測試。但web應用程序測試不同組合來自多個請求和代碼覆蓋率的計算分別為每個請求。解決方案很簡單——我已經注冊關閉功能保存代碼覆蓋一個會話和連接它與以前的結果。

管理的代碼覆蓋率是75%左右,這是令人滿意的。相比較而言,代碼覆蓋率的PHP源代碼是70%左右。我非常高興當我測試存在的重構應用程序的某些部分。我很確定重構沒有破壞任何東西當所有的測試已經通過了。

版本檢查
有一個與項目消息和電子郵件訂閱RSS提要的新版本。然而一些用戶只需安裝當前版本並忘記它。出於這個原因,管理包含一個版本檢查。

版本檢查必須盡可能不引人注目的,因為有時運行管理的環境沒有互聯網連接或伺服器可能是遙不可及的。所以檢查當前版本的PHP代碼不是一個選擇,因為它是阻塞。此外,管理員可以禁用PHP的遠程連接allow_url_fopen配置指令。因此,從JavaScript版本檢查程序運行。一個簡單的 <script src>阻礙(用戶可以使用頁面但仍在載入狀態)是相同的圖片。所以一個腳本載入 onload非阻塞事件。伺服器部分非常簡單:

<?php
header("Content-Type: text/javascript");
if (version_compare($_GET["version"], $VERSION) < 0) {
echo "document.getElementById('version').innerHTML = '$VERSION';\n";
}
echo "document.cookie = 'adminer_version=$VERSION';\n";
?>
如果當前版本是老那麼腳本修改文檔來顯示新的版本號。客戶端檢查發送cookie與伺服器通信只是偶爾。

設計
設計從Vlasta紐鮑爾我不是一個藝術家所以樣式表來自自由平面設計師Ondřej Valka。設計是整個管理簡單整潔,所以我喜歡它。然而其他用戶更喜歡花哨的設計,所以他們創造了自己。設計可以很容易地集成到單個文件的編譯但用戶喜歡測試幾個設計管理檢查外部文件 adminer.css的存在。如果它確實存在,那麼該腳本使用它而不是集成的CSS。

結論
這篇文章是關於管理架構,而不是對其特性。然而,它應該明確,管理支持所有MySQL特性從一個簡單的表編輯,通過多個列外鍵、觸發器、存儲過程、出口、用戶和流程管理MySQL 5.1事件和表分區。當然是一個普遍的非標准任務的SQL命令。

phpMyAdmin的管理不僅僅是一個緊湊的版本,它試圖成為一個完全競爭選擇MySQL管理和小足跡僅僅是一個愉快的獎金。

⑥ tp5怎麼防sql注入 xss跨站腳本攻擊

最有效的方法是使用參數化查詢就能避免sql注入了,防止跨站的話可以使用微軟白名單。或者關鍵字黑名單。

⑦ tp5怎麼防sql注入 xss跨站腳本攻擊

很遺憾,你這代碼亂得很,而且看起來是後端處理代碼,並不是xss關鍵處理代碼,xss一般在入庫前進行轉義

⑧ ThinkPHP 1.5.0 漏洞求助

ThinkPHP 3.1.3及之前的版本存在一個SQL注入漏洞,漏洞存在於ThinkPHP/Lib/Core/Model.class.php 文件
根據官方文檔對」防止SQL注入」的方法解釋(見http://doc.thinkphp.cn/manual/sql_injection.html)
使用查詢條件預處理可以防止SQL注入,沒錯,當使用如下代碼時可以起到效果:
$Model->where(「id=%d and username=』%s』 and xx=』%f'」,array($id,$username,$xx))->select();

或者
$Model->where(「id=%d and username=』%s』 and xx=』%f'」,$id,$username,$xx)->select();

但是,當你使用如下代碼時,卻沒有」防止SQL注入」效果(而官方文檔卻說可以防止SQL注入):
$model->query(『select * from user where id=%d and status=%s』,$id,$status);

或者
$model->query(『select * from user where id=%d and status=%s』,array($id,$status));

原因:
ThinkPHP/Lib/Core/Model.class.php 文件里的parseSql函數沒有實現SQL過濾.
原函數:
protected function parseSql($sql,$parse) {
// 分析表達式
if(true === $parse) {
$options = $this->_parseOptions();
$sql = $this->db->parseSql($sql,$options);
}elseif(is_array($parse)){ // SQL預處理
$sql = vsprintf($sql,$parse);
}else{
$sql = strtr($sql,array(『__TABLE__』=>$this->getTableName(),』__PREFIX__』=>C(『DB_PREFIX』)));
}
$this->db->setModel($this->name);
return $sql;
}

驗證漏洞(舉例):
請求地址:
http://localhost/Main?id=boo」 or 1=」1

http://localhost/Main?id=boo%22%20or%201=%221
action代碼:
$model=M(『Peipeii』);
$m=$model->query(『select * from peipeii where name=」%s」『,$_GET[『id』]);
mp($m);exit;
或者
$model=M(『Peipeii』);
$m=$model->query(『select * from peipeii where name=」%s」『,array($_GET[『id』]));
mp($m);exit;
結果:
表peipeii所有數據被列出,SQL注入語句起效.
解決辦法:
將parseSql函數修改為:
protected function parseSql($sql,$parse) {
// 分析表達式
if(true === $parse) {
$options = $this->_parseOptions();
$sql = $this->db->parseSql($sql,$options);
}elseif(is_array($parse)){ // SQL預處理
$parse = array_map(array($this->db,』escapeString』),$parse);//此行為新增代碼
$sql = vsprintf($sql,$parse);
}else{
$sql = strtr($sql,array(『__TABLE__』=>$this->getTableName(),』__PREFIX__』=>C(『DB_PREFIX』)));
}
$this->db->setModel($this->name);
return $sql;
}

總結:
不要過分依賴TP的底層SQL過濾,程序員要做好安全檢查
不建議直接用$_GET,$_POST

⑨ tp5資料庫參數綁定的作用什麼,和直接insert插入記錄有什麼區別

SQL參數查詢可以避免很多問題,比如說因拼接過長導致容易出錯和閱讀困難(尤其拼接大量字元類型欄位),以及可以避免一些sql注入的問題(sql注入是很常見的注入方式,這方面內容可以自己查一下)