thinkphp 頁面提交引數的過濾(轉義)

2021-07-15 05:01:03 字數 3829 閱讀 4325

當使用thinkphp框架接受表達內容。

如果使用i函式獲取表單資料,如i("data");這個資料是預設被過濾的。

預設的過濾方法

'default_filter'        =>  'htmlspecialchars', // 預設引數過濾方法 用於i函式...

如果對輸入的引數進行正則匹配,當遇到特殊字元時會出問題。

htmlspecialchars的反函式為htmlspecialchars_decode()。使用該函式可以把轉義的引數再轉回來。

但這並沒有解決全部問題,因為不同版本的thinkphp的i函式是不一樣的,而且default_filter還可以設定別的值。

所以當我們確實需要獲取原始資料而非轉義資料時,還是使用最原始的 $_post("param");最靠譜。

但是這事還是沒完。因為php裡還有addslashes()函式他會過濾提交給php的引數。也就是用原始的$_post依然要面對過濾的問題。

我可以通過

get_magic_quotes_gpc()來判斷是否開啟了該過濾,並用stripslashes()反過濾。

不幸的是,不同版本裡的php對該函式的支援依然不同,php6裡該函式被取消了。

綜上,你不得不再每個專案裡去測試框架和php引數的過濾,以使專案按照您的意願執行。

另外如果您的php框架使用的是gbk的編碼的話,那麼還會出現字符集轉換的問題,但這並不代表使用utf-8字符集時不會有問題。

總之對於輸入引數的過濾轉義,和字符集的轉化都是非常麻煩而且特例特測的事情。

測試技巧。

不要僅直接用輸入和輸出的方式來測試,因為這個過程可能經歷了多個過濾。

使用在php檔案中定義變數然後輸出,測試輸出沒有問題,再測試$_post,再測試i函式。

如果要確保輸入的資料安全還是自己用正則表達是來過濾一般,這是最靠譜的啦。

其次i(函式)的安全性還是有的,一般情況盡量使用i(函式)

特別情況,盡量使用$_post來處理,一方面是效率更高而且**中區別對待可讀性好,還有就是不必關心default_filter引數的設定。

在php5中去反addslashes()的函式

//去掉在引號前面自動加的:單引號('),雙引號("),反斜槓(\),和null

function deal_quote($str)

}

i(函式)過濾器  htmlspecialchars() & (和號)" (雙引號) ' (單引號) < (小於) > (大於)

php中過濾器  addslashes()  單引號('),雙引號("),反斜槓(\),和null

參考內容

htmlspecialchars_decode()

htmlspecialchars_decode() 函式把一些預定義的 html 實體轉換為字元。

會被解碼的 html 實體是:

htmlspecialchars_decode() 函式是 htmlspecialchars() 函式的反函式。

htmlspecialchars_decode(

string,flags)

引數描述

string

必需。規定要解碼的字串。

flags

可選。規定如何處理引號以及使用哪種文件型別。 可用的引號型別:

規定使用的文件型別的附加 flags:

返回值:

返回已轉換的字串。

php 版本:

5.1.0+

更新日誌:

在 php 5.4 中,新增了用於規定使用的文件型別的附加 flags:ent_html401、ent_html5、ent_xml1 和 ent_xhtml。

addslashes()

addslashes() 函式返回在預定義的字元前新增反斜槓的字串。

預定義字元是:

注釋:預設情況下,php 指令 magic_quotes_gpc 為 on,對所有的 get、post 和 cookie 資料自動執行 addslashes()。不要對已經被 magic_quotes_gpc 轉義過的字串使用 addslashes(),因為這樣會導致雙層轉義。遇到這種情況時可以使用函式 get_magic_quotes_gpc() 進行檢測。

addslashes(

string)

引數描述

string

必需。規定要轉義的字串。

返回值:

返回已轉義的字串。

php 版本:4+

addslashes()版本變化

magic_quotes_gpc函式在php中的作用是判斷解析使用者提示的資料,如包括有:post、get、cookie過來的資料增加轉義字元「\」,以確保這些資料不會引起程式,特別是資料庫語句因為特殊字元引起的汙染而出現致命的錯誤

在magic_quotes_gpc=on的情況下,如果輸入的資料有

單引號(』)、雙引號(」)、反斜線()與 nul(null 字元)等字元都會被加上反斜線。這些轉義是必須的,如果這個選項為off,那麼我們就必須呼叫addslashes這個函式來為字串增加轉義。

正是因為這個選項必須為on,但是又讓使用者進行配置的矛盾,在php6中刪除了這個選項,一切的程式設計都需要在magic_quotes_gpc=off下進行了。在這樣的環境下如果不對使用者的資料進行轉義,後果不僅僅是程式錯誤而已了。同樣的會引起資料庫被注入攻擊的危險。所以從現在開始大家都不要再依賴這個設定為on了,以免有一天你的伺服器需要更新到php6而導致你的程式不能正常工作。

**如下

複製**

當magic_quotes_gpc=on的時候,函式get_magic_quotes_gpc()就會返回1

當magic_quotes_gpc=off的時候,函式get_magic_quotes_gpc()就會返回0

因此可以看出這個get_magic_quotes_gpc()函式的作用就是得到環境變數magic_quotes_gpc的值。既然在php6中刪除了magic_quotes_gpc這個選項,那麼在php6中這個函式我想也已經不復存在了。

php 判斷是否開啟get_magic_quotes_gpc功能了,以方便我們是否決定使用addslashes這個函式了。

**如下

複製**

function sqlstring($c, $t)

return $c;

}預防資料庫攻擊的正確做法

**如下

複製**

function check_input($value)

// 去除斜槓

if (get_magic_quotes_gpc())

$value = stripslashes($value);

// 如果不是數字則加引號

if (!is_numeric($value))

$value = 「『」 . mysql_real_escape_string($value) . 「『」;

return $value;

$con = mysql_connect(「localhost」, 「hello」, 「321″);

if (!$con)

die(『could not connect: 『 . mysql_error());

// 進行安全的 sql

$user = check_input($_post['user']);

$pwd = check_input($_post['pwd']);

$sql = 「select * from users where

user=$user and password=$pwd」;

mysql_query($sql);

mysql_close($con);

thinkphp 解決頁面重新整理表單重複提交的問題

控制器中 session start code mt rand 0,1000000 session code code this assign code code 注 該段 應在表單提交判斷的後面 往html中傳乙個session隨機數,並把該隨機數用隱藏input框的形式傳值 html頁面中 ty...

ASP 2 0 中跨頁面提交引數

a 設源頁面 source.aspx 目標頁面 target.aspx 如何提取源頁面的內容 方法一 源頁面設定公共屬性,屬性值為某個控制項的值 1.源頁面source.aspx的設定 在source.asp.cs 中 設定公共屬性 public string username 設定提交按鈕的pos...

Thinkphp事物提交的幾個測試

情況一 在兩個不同的方法中例項化model,在model1中開始事物,然後在乙個model中提交。情況二 在兩個不同的方法中例項化model,在model1中開始事物,然後在乙個model中回滾。情況三 在兩個不同的方法中例項化model,都開啟事物,然後在乙個model中提交。情況四 在兩個不同的...