PHP防止注入攻擊實(shí)例分析
本文以實(shí)例形式詳細(xì)分析了PHP防止注入攻擊的方法。分享給大家供大家參考。具體分析如下:
PHP addslashes() 函數(shù)--單撇號(hào)加斜線轉(zhuǎn)義
PHP String 函數(shù)
定義和用法
addslashes() 函數(shù)在指定的預(yù)定義字符前添加反斜杠。
這些預(yù)定義字符是:
單引號(hào) (')
雙引號(hào) (")
反斜杠 (\)
NULL
語(yǔ)法:
addslashes(string)
參數(shù) | 描述 |
string | 必需。規(guī)定要檢查的字符串。 |
提示和注釋
提示:該函數(shù)可用于為存儲(chǔ)在數(shù)據(jù)庫(kù)中的字符串以及數(shù)據(jù)庫(kù)查詢語(yǔ)句準(zhǔn)備合適的字符串。
注釋:默認(rèn)情況下,PHP 指令 magic_quotes_gpc 為 on,對(duì)所有的 GET、POST 和 COOKIE 數(shù)據(jù)自動(dòng)運(yùn)行 addslashes()。不要對(duì)已經(jīng)被 magic_quotes_gpc 轉(zhuǎn)義過(guò)的字符串使用 addslashes(),因?yàn)檫@樣會(huì)導(dǎo)致雙層轉(zhuǎn)義。遇到這種情況時(shí)可以使用函數(shù) get_magic_quotes_gpc() 進(jìn)行檢測(cè)。
例子
在本例中,我們要向字符串中的預(yù)定義字符添加反斜杠:
$str = "Who's John Adams?";
echo $str . " This is not safe in a database query.<br />";
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函數(shù)
{
$str = get_magic_quotes_gpc()?$str:addslashes($str);
return $str;
}
get_magic_quotes_gpc:
取得 PHP 環(huán)境變數(shù) magic_quotes_gpc 的值。
語(yǔ)法: long get_magic_quotes_gpc(void);
傳回值: 長(zhǎng)整數(shù)
函式種類: PHP 系統(tǒng)功能
內(nèi)容說(shuō)明:
本函式取得 PHP 環(huán)境設(shè)定的變數(shù) magic_quotes_gpc (GPC, Get/Post/Cookie) 值。傳回 0 表示關(guān)閉本功能;傳回 1 表示本功能開(kāi)啟。當(dāng) magic_quotes_gpc 開(kāi)啟時(shí),所有的 ' (單引號(hào)), " (雙引號(hào)), \ (反斜線) and 空字符會(huì)自動(dòng)轉(zhuǎn)為含有反斜線的溢出字符。
addslashes -- 使用反斜線引用字符串
描述:
string addslashes ( string str)
返回字符串,該字符串為了數(shù)據(jù)庫(kù)查詢語(yǔ)句等的需要在某些字符前加上了反斜線。這些字符是單引號(hào)(')、雙引號(hào)(")、反斜線(\)與 NUL(NULL 字符)。
一個(gè)使用 addslashes() 的例子是當(dāng)你要往數(shù)據(jù)庫(kù)中輸入數(shù)據(jù)時(shí)。例如,將名字 O'reilly 插入到數(shù)據(jù)庫(kù)中,這就需要對(duì)其進(jìn)行轉(zhuǎn)義。大多數(shù)據(jù)庫(kù)使用 \ 作為轉(zhuǎn)義符:O\'reilly。這樣可以將數(shù)據(jù)放入數(shù)據(jù)庫(kù)中,而不會(huì)插入額外的 \。當(dāng) PHP 指令 magic_quotes_sybase 被設(shè)置成 on 時(shí),意味著插入 ' 時(shí)將使用 ' 進(jìn)行轉(zhuǎn)義。
默認(rèn)情況下,PHP 指令 magic_quotes_gpc 為 on,它主要是對(duì)所有的 GET、POST 和 COOKIE 數(shù)據(jù)自動(dòng)運(yùn)行 addslashes()。不要對(duì)已經(jīng)被 magic_quotes_gpc 轉(zhuǎn)義過(guò)的字符串使用 addslashes(),因?yàn)檫@樣會(huì)導(dǎo)致雙層轉(zhuǎn)義。遇到這種情況時(shí)可以使用函數(shù) get_magic_quotes_gpc() 進(jìn)行檢測(cè)。
例子 1. addslashes() 示例
// 輸出:Is your name O\'reilly?
echo addslashes($str);
?>
get_magic_quotes_gpc()
本函數(shù)取得 PHP 環(huán)境配置的變量 magic_quotes_gpc (GPC, Get/Post/Cookie) 值。返回 0 表示關(guān)閉本功能;返回 1 表示本功能打開(kāi)。當(dāng) magic_quotes_gpc 打開(kāi)時(shí),所有的 ' (單引號(hào)), " (雙引號(hào)), \ (反斜線) and 空字符會(huì)自動(dòng)轉(zhuǎn)為含有反斜線的溢出字符。
magic_quotes_gpc
對(duì)于 php.ini 中的 magic_quotes_gpc,是設(shè)置為 off 還是為 on 呢?
個(gè)人觀點(diǎn),應(yīng)該設(shè)置為 on
總結(jié)如下:
1. 對(duì)于magic_quotes_gpc=on的情況,
我們可以不對(duì)輸入和輸出數(shù)據(jù)庫(kù)的字符串?dāng)?shù)據(jù)作
addslashes()和stripslashes()的操作,數(shù)據(jù)也會(huì)正常顯示。
如果此時(shí)你對(duì)輸入的數(shù)據(jù)作了addslashes()處理,
那么在輸出的時(shí)候就必須使用stripslashes()去掉多余的反斜杠。
2. 對(duì)于magic_quotes_gpc=off 的情況
必須使用addslashes()對(duì)輸入數(shù)據(jù)進(jìn)行處理,但并不需要使用stripslashes()格式化輸出
因?yàn)閍ddslashes()并未將反斜杠一起寫入數(shù)據(jù)庫(kù),只是幫助mysql完成了sql語(yǔ)句的執(zhí)行。
補(bǔ)充:
magic_quotes_gpc 作用范圍是:WEB客戶服務(wù)端;作用時(shí)間:請(qǐng)求開(kāi)始時(shí),例如當(dāng)腳本運(yùn)行時(shí).
magic_quotes_runtime 作用范圍:從文件中讀取的數(shù)據(jù)或執(zhí)行exec()的結(jié)果或是從SQL查詢中得到的;作用時(shí)間:每次當(dāng)腳本訪問(wèn)運(yùn)行狀態(tài)中產(chǎn)生的數(shù)據(jù)
代碼:
/*
有時(shí)表單提交的變量不止一個(gè),可能有十幾個(gè),幾十個(gè)。那么一次一次地復(fù)制/粘帖addslashes(),是否麻煩了一點(diǎn)?由于從表單或URL獲取的數(shù)據(jù)都是以數(shù)組形式出現(xiàn)的,如$_POST、$_GET)那就自定義一個(gè)可以“橫掃千軍”的函數(shù)
*/
function quotes($content)
{
//如果magic_quotes_gpc=Off,那么就開(kāi)始處理
if (!get_magic_quotes_gpc()) {
//判斷$content是否為數(shù)組
if (is_array($content)) {
//如果$content是數(shù)組,那么就處理它的每一個(gè)單無(wú)
foreach ($content as $key=>$value) {
$content[$key] = addslashes($value);
}
} else {
//如果$content不是數(shù)組,那么就僅處理一次
addslashes($content);
}
} else {
//如果magic_quotes_gpc=On,那么就不處理
}
//返回$content
return $content;
}
?>
希望本文所述對(duì)大家的PHP程序設(shè)計(jì)有所幫助。
- JWT + ASP.NET MVC時(shí)間戳防止重放攻擊詳解
- .NET添加時(shí)間戳防止重放攻擊
- PHP中防止SQL注入攻擊和XSS攻擊的兩個(gè)簡(jiǎn)單方法
- php防止CC攻擊代碼 php防止網(wǎng)頁(yè)頻繁刷新
- php防止sql注入示例分析和幾種常見(jiàn)攻擊正則表達(dá)式
- php實(shí)現(xiàn)cc攻擊防御和防止快速刷新頁(yè)面示例
- php防止網(wǎng)站被攻擊的應(yīng)急代碼
- PHP中通過(guò)語(yǔ)義URL防止網(wǎng)站被攻擊的方法分享
- PHP實(shí)現(xiàn)的防止跨站和xss攻擊代碼【來(lái)自阿里云】
- 淺析PHP程序防止ddos,dns,集群服務(wù)器攻擊的解決辦法
- PHP如何防止XSS攻擊與XSS攻擊原理的講解
- PHP基于timestamp和nonce實(shí)現(xiàn)的防止重放攻擊方案分析
相關(guān)文章
解析php中var_dump,var_export,print_r三個(gè)函數(shù)的區(qū)別
本篇文章是對(duì)php中var_dump,var_export,print_r三個(gè)函數(shù)的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06php中0,null,empty,空,false,字符串關(guān)系的詳細(xì)介紹
本篇文章是對(duì)php中0,null,empty,空,false,字符串關(guān)系進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06PHP自定義函數(shù)判斷是否為Get、Post及Ajax提交的方法
這篇文章主要介紹了PHP自定義函數(shù)判斷是否為Get、Post及Ajax提交的方法,涉及php服務(wù)器預(yù)定義變量$_SERVER及字符串相關(guān)操作技巧,需要的朋友可以參考下2017-07-07提高PHP性能的編碼技巧以及性能優(yōu)化詳細(xì)解析
include文件時(shí)盡量使用絕對(duì)路徑,因?yàn)樗苊饬薖HP去include_path里查找文件的速度,解析操作系統(tǒng)路徑所需的時(shí)間會(huì)更少2013-08-08php實(shí)現(xiàn)四舍五入的方法小結(jié)
這篇文章主要介紹了php實(shí)現(xiàn)四舍五入的方法,實(shí)例總結(jié)了php實(shí)現(xiàn)四舍五入的三種常用方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03PHP消息隊(duì)列實(shí)現(xiàn)及應(yīng)用詳解【隊(duì)列處理訂單系統(tǒng)和配送系統(tǒng)】
這篇文章主要介紹了PHP消息隊(duì)列實(shí)現(xiàn)及應(yīng)用,結(jié)合實(shí)例形式詳細(xì)分析了php消息隊(duì)列的概念、原理及隊(duì)列處理訂單系統(tǒng)和配送系統(tǒng)案例,需要的朋友可以參考下2019-05-05