PHP防止注入攻擊執行個體分析,php注入執行個體分析
本文以執行個體形式詳細分析了PHP防止注入攻擊的方法。分享給大家供大家參考。具體分析如下:
PHP addslashes() 函數--單撇號加斜線轉義
PHP String 函數
定義和用法
addslashes() 函數在指定的預定義字元前添加反斜線。
這些預定義字元是:
單引號 (')
雙引號 (")
反斜線 (\)
NULL
文法:
addslashes(string)
| 參數 |
描述 |
| string |
必需。規定要檢查的字串。 |
提示和注釋
提示:該函數可用於為儲存在資料庫中的字串以及資料庫查詢語句準備合適的字串。
注釋:預設情況下,PHP 指令 magic_quotes_gpc 為 on,對所有的 GET、POST 和 COOKIE 資料自動運行 addslashes()。不要對已經被 magic_quotes_gpc 轉義過的字串使用 addslashes(),因為這樣會導致雙層轉義。遇到這種情況時可以使用函數 get_magic_quotes_gpc() 進行檢測。
例子
在本例中,我們要向字串中的預定義字元添加反斜線:
複製代碼 代碼如下:<?php
$str = "Who's John Adams?";
echo $str . " This is not safe in a database query.
";
echo addslashes($str) . " This is safe in a database query.";
?>
輸出:
Who's John Adams? This is not safe in a database query.
Who\'s John Adams? This is safe in a database query.
get_magic_quotes_gpc函數
複製代碼 代碼如下:function html($str)
{
$str = get_magic_quotes_gpc()?$str:addslashes($str);
return $str;
}
get_magic_quotes_gpc:
取得 PHP 環境變數 magic_quotes_gpc 的值。
文法: long get_magic_quotes_gpc(void);
傳回值: 長整數
函式種類: PHP 系統功能
內容說明:
本函式取得 PHP 環境設定的變數 magic_quotes_gpc (GPC, Get/Post/Cookie) 值。傳回 0 表示關閉本功能;傳回 1 表示本功能開啟。當 magic_quotes_gpc 開啟時,所有的 ' (單引號), " (雙引號), \ (反斜線) and Null 字元會自動轉為含有反斜線的溢出字元。
addslashes -- 使用反斜線引用字串
描述:
string addslashes ( string str)
返回字串,該字串為了資料庫查詢語句等的需要在某些字元前加上了反斜線。這些字元是單引號(')、雙引號(")、反斜線(\)與 NUL(NULL 字元)。
一個使用 addslashes() 的例子是當你要往資料庫中輸入資料時。例如,將名字 O'reilly 插入到資料庫中,這就需要對其進行轉義。大多資料庫使用 \ 作為轉義符:O\'reilly。這樣可以將資料放入資料庫中,而不會插入額外的 \。當 PHP 指令 magic_quotes_sybase 被設定成 on 時,意味著插入 ' 時將使用 ' 進行轉義。
預設情況下,PHP 指令 magic_quotes_gpc 為 on,它主要是對所有的 GET、POST 和 COOKIE 資料自動運行 addslashes()。不要對已經被 magic_quotes_gpc 轉義過的字串使用 addslashes(),因為這樣會導致雙層轉義。遇到這種情況時可以使用函數 get_magic_quotes_gpc() 進行檢測。
例子 1. addslashes() 樣本
複製代碼 代碼如下:$str = "Is your name O'reilly?";
// 輸出:Is your name O\'reilly?
echo addslashes($str);
?>
get_magic_quotes_gpc()
本函數取得 PHP 環境配置的變數 magic_quotes_gpc (GPC, Get/Post/Cookie) 值。返回 0 表示關閉本功能;返回 1 表示本功能開啟。當 magic_quotes_gpc 開啟時,所有的 ' (單引號), " (雙引號), \ (反斜線) and Null 字元會自動轉為含有反斜線的溢出字元。
magic_quotes_gpc
對於 php.ini 中的 magic_quotes_gpc,是設定為 off 還是為 on 呢?
個人觀點,應該設定為 on
總結如下:
1. 對於magic_quotes_gpc=on的情況,
我們可以不對輸入和輸出資料庫的字串資料作
addslashes()和stripslashes()的操作,資料也會正常顯示。
如果此時你對輸入的資料作了addslashes()處理,
那麼在輸出的時候就必須使用stripslashes()去掉多餘的反斜線。
2. 對於magic_quotes_gpc=off 的情況
必須使用addslashes()對輸入資料進行處理,但並不需要使用stripslashes()格式化輸出
因為addslashes()並未將反斜線一起寫入資料庫,只是協助mysql完成了sql語句的執行。
補充:
magic_quotes_gpc 作用範圍是:WEB客戶服務端;作用時間:請求開始時,例如當指令碼運行時.
magic_quotes_runtime 作用範圍:從檔案中讀取的資料或執行exec()的結果或是從SQL查詢中得到的;作用時間:每次當指令碼訪問運行狀態中產生的資料
代碼:
複製代碼 代碼如下:<?php
/*
有時表單提交的變數不止一個,可能有十幾個,幾十個。那麼一次一次地複製/粘帖addslashes(),是否麻煩了一點?由於從表單或URL擷取的資料都是以數組形式出現的,如$_POST、$_GET)那就自訂一個可以“橫掃千軍”的函數
*/
function quotes($content)
{
//如果magic_quotes_gpc=Off,那麼就開始處理
if (!get_magic_quotes_gpc()) {
//判斷$content是否為數組
if (is_array($content)) {
//如果$content是數組,那麼就處理它的每一個單無
foreach ($content as $key=>$value) {
$content[$key] = addslashes($value);
}
} else {
//如果$content不是數組,那麼就僅處理一次
addslashes($content);
}
} else {
//如果magic_quotes_gpc=On,那麼就不處理
}
//返回$content
return $content;
}
?>
希望本文所述對大家的PHP程式設計有所協助。
php中防止SQL注入的最好方法是什?
如果使用者輸入的是直接插入到一個SQL語句中的查詢,應用程式會很容易受到SQL注入,例如下面的例子:$unsafe_variable = $_POST['user_input']; mysql_query("INSERT INTO table (column) VALUES ('" . $unsafe_variable . "')"); 這是因為使用者可以輸入類似VALUE“); DROP TABLE表; - ,使查詢變成:使用預備義語句和參數化查詢。對於帶有任何參數的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指令碼包括惡意字串發......餘下全文>>
[轉載] 怎防止 PHP SQL 插入式攻擊
我認為最重要的一點,就是要對資料類型進行檢查和轉義。總結的幾點規則如下: php.ini 中的 display_errors 選項,應該設為 display_errors = off。這樣 php 指令碼出錯之後,不會在 web 頁面輸出錯誤,以免讓攻擊者分析出有作的資訊。 調用mysql_query 等 mysql 函數時,前面應該加上 @,即 @mysql_query(...),這樣 mysql 錯誤不會被輸出。同理以免讓攻擊者分析出有用的資訊。另外,有些程式員在做開發時,當 mysql_query出錯時,習慣輸出錯誤以及 sql 語句,例如: $t_strSQL = "SELECT a from b....";
if ( mysql_query($t_strSQL) ){// 正確的處理}else{echo "錯誤! SQL 陳述式:$t_strSQL \r\n錯誤資訊".mysql_query();exit;}這種做法是相當危險和愚蠢的。如果一定要這麼做,最好在網站的設定檔中,設一個全域變數或定義一個宏,設一下 debug 標誌: 全域設定檔中:
define("DEBUG_MODE",0); // 1: DEBUG MODE; 0: RELEASE MODE
//呼叫指令碼中:
php /************************* 說明: 判斷傳遞的變數中是否含有非法字元 如$_POST、$_GET 功能: 防注入 **************************/ //要過濾的非法字元$ArrFiltrate=array("'",";","union"); //出錯後要跳轉的url,不填則預設前一頁$StrGoUrl=""; //是否存在數組中的值function FunStringExist($StrFiltrate,$ArrFiltrate){ foreach ($ArrFiltrate as $key=>$value){ if (eregi($value,$StrFiltrate)){ returntrue; } } returnfalse; } //合并$_POST 和 $_GETif(function_exists(array_merge)){ $ArrPostAndGet=array_merge($HTTP_POST_VARS,$HTTP_GET_VARS); }else{ foreach($HTTP_POST_VARS as $key=>$value){ $ArrPostAndGet[]=$value; } foreach($HTTP_GET_VARS as $key=>$value){ $ArrPostAndGet[]=$value; } } //驗證開始foreach($ArrPostAndGet as $key=>$value){ if (FunStringExist($value,$ArrFiltrate)){ echo "alert(\"非法字元\");"; if (empty($StrGoUrl)){ echo &q......餘下全文>>
http://www.bkjia.com/PHPjc/904916.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/904916.htmlTechArticlePHP防止注入攻擊執行個體分析,php注入執行個體分析 本文以執行個體形式詳細分析了PHP防止注入攻擊的方法。分享給大家供大家參考。具體分析如下:...