① 如何使用PDO查詢Mysql來避免SQL注入風險
過濾一些常見的資料庫操作關鍵字,
select ,insert,update,delete,and,*等或通過系統函數addslashes對內容進行過濾
php配置文件中register_globals=off;設置為關閉狀態.(作用將注冊全局變數關閉);如接收POST表單的值使用$_POST['user'],假設設置為ON的話$user才接收值
sql語句書寫的時候盡量不要省略小引號(tab上面那個)和單引號
提高資料庫命名技巧,對於一些重要的欄位根據程序的特點命名,使之不易被猜中
對於常的方法加以封裝,避免直接暴漏SQL語句
開啟PHP安全模式safe_mode=on
打開magic_quotes_gpc來防止SQL注入,默認為關閉,開啟後自動把用戶提交sql查詢語句進行轉換把"'"轉換成"\'"
控制錯誤信息輸出,關閉錯誤信息提示,將錯誤信息寫到系統日誌
使用MYSQLI或PDO預處理
② 防sql注入為什麼要用pdo
防止sql注入的方式有很多,比如禁止輸入特殊字元」||「,」'「等,或者將密碼等驗證欄位進行MD5加密後再進行數據校驗都可以防止sql注入
③ PHP中該怎樣防止SQL注入
這里聊這么大的話題沒時間了?建議你用mysqli
防SQL注入(? 佔位) ,後期傳的值不會當成SQL語句
<?php
$mysqli=new mysqli("localhost", "root", "123456", "xsphpdb");
$stmt=$mysqli->prepare("select id, name, price, num, desn from shops where id>?");
$stmt->bind_param("i", $id);
$stmt->bind_result($id, $name, $price, $num, $desn);
$id=99;
$stmt->execute();
$stmt->store_result(); //一次性將結果都取過來 重要
//欄位信息
$result=$stmt->result_metadata();
while($field=$result->fetch_field()){
echo $field->name."--";
}
echo '<br>';
//記錄信息
//$stmt->data_seek(2);
while($stmt->fetch()){
echo "$id--$name---$price---$num---$desn <br>";
}
echo "記錄總數:".$stmt->num_rows;
$stmt->free_result();
$stmt->close();
?>
④ pdo 能完全防止sql注入嗎
pdo query方法有沒有防止sql注入的功能
傳統的mysql_connect 、mysql_query方法存在很多注入風險,而使用PDO預處理機制可以有效的防止SQL注入風險。
⑤ php中防止SQL注入,該如何解決
php注入,原則上是因為sql拼接引起的。
通常避免sql注入的原則是:
類型校驗,比如int類型的欄位進行強制轉換intval。
避免字元型的sql拼接,使用unhex繞過sql解析截斷的字元處理。
舉個例子:
select * from pass where username = '$a';
這種情況,當$a="1' or 1 = 1 or '2' = '2"情況時,真個sql變成了
select * from pass where username = '1' or 1 = 1 or '2' = '2' ;
那麼這個sql就會改變sql原有語義。
類型校驗大家都會,這里就不進行說明了,下面說明下使用unhex來進行字元型欄位轉碼,繞過sql語義解析截斷避免sql注入。
使用unhex(bin2hex)後,原有邏輯變成
$a = bin2hex($a);
select * from pass where username = unhex('$a') ;
由於bin2hex,$a轉化成16進制數避免了sql注入的風險。
sql執行階段,優先執行sql語義解析,而後進行unhex('$a') 的運算,所以會把"1' or 1 = 1 or '2' = '2"整個字元串當做一個欄位執行,而不會進行解析,避免了sql注入問題~
⑥ php防sql注入
最簡單的方法是使用addslashes()函數處理SQL語句,但不推薦這么做。因為這樣做也會有一定的風險。
推薦的方法是使用參數式查詢。下面是使用PDO擴展查詢mysql的示例代碼:
<?php
$pdo=newPDO('...');//連接字元串略
$stmt=$pdo->prepare('select*frommytablewherename=:name');
$stmt->execute(array(':name':''namehasquote'));
PDO庫可以自動完成引號轉義,避免SQL注入。
望採納,謝謝支持!
⑦ PHP要怎麼防止SQL注入
防止注入最簡單的辦法就是本地生成html文件,然後上傳到網站空間內,全站的html是無法被注入攻擊的,除非伺服器被幹掉。如果一定要將php代碼放到網站上,那麼需要防止的內容就要做的很多了,其中最重要的一條就是書寫代碼的規范程度,以及對用戶提交的驗證規范。如果用到專門的cms去做網站的話,一定要定時下載升級,並到相關的官方論壇及一些白客站點查看最新漏洞源碼信息,加以改正,可以有效的防止注入攻擊。
在注冊時防止注入,其實最主要的一條就是在寫入、查詢資料庫之前完成對用戶錄入數據的驗證。具體如何驗證可以網路搜索一下
⑧ 如何使用PDO查詢mysql避免SQL注入的方法
使用PDO或者MySQLi,有很多封裝好的方便的Class。 例如使用PHP-PDO-MySQL-Class · GitHub(這個Class使用上比較類似Python的MySQLdb)的話,這樣就是安全的: 直接拼接字元串則是危險的:
⑨ php中防止SQL注入的最好方法是什麼
使用預備義語句和參數化查詢。對於帶有任何參數的sql語句都會被發送到資料庫伺服器,並被解析!對於攻擊者想要惡意注入sql是不可能的! 實現這一目標基本上有兩種選擇: 1.使用PDO(PHP Data Objects ):$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name'); $stmt->execute(array(':name' => $name)); foreach ($stmt as $row) { // do something with $row }2.使用mysqli:$stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?'); $stmt->bind_param('s', $name); $stmt->execute(); $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { // do something with $row }PDO(PHP數據對象) 注意當使用PDO訪問MySQL資料庫真正的預備義語句並不是默認使用的!為了解決這個問題,你必須禁用模擬准備好的語句。使用PDO創建連接的例子如下: $dbConnection = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass'); $dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);在上面例子中錯誤模式ERRMODE不是嚴格必須的,但是建議添加它。當運行出錯產生致命錯誤時,這種方法腳本不會停止。並給開發人員捕捉任何錯誤的機會(當拋出PDOException異常時)。 setAttribute()那一行是強制性的,它告訴PDO禁用模擬預備義語句,使用真正的預備義語句。這可以確保語句和值在發送給MySQL資料庫伺服器前不被PHP解析(攻擊者沒有機會注入惡意的SQL). 當然你可以在構造函數選項中設置字元集參數,特別注意'老'的PHP版本(5.3.6)會在DSN中忽略掉字元集參數。 這里最重要的是,該參數值是和預編譯的語句結合的,而不是和一個SQL字元串.SQL注入的工作原理是通過欺騙手段創建的SQL腳本包括惡意字元串發送到資料庫.因此,通過發送實際的分開的sql參數,你會降低風險.使用准備好的語句時,你發送的任何參數,將只被視為字元串(雖然資料庫引擎可能會做一些參數的優化,當然最終可能會為數字).在上面的例子中,如果變數$name包含'sarah';DELETE * FROM employees,結果只會是一個搜索的字元串"'sarah';DELETE * FROM employees",你不會得到一個空表。 使用准備好的語句的另一個好處是,如果你在同一會話中多次執行相同的語句,這將只被解析和編譯一次,給你一些的速度增長。