Ⅰ php 關於thinkphp的防sql注入跟過濾問題
防止SQL注入
opensns
對於WEB應用來說,SQL注入攻擊無疑是首要防範的安全問題,系統底層對於數據安全方面本身進行了很多的處理和相應的防範機制,例如:
$User = M("User"); // 實例化User對象
$User->find($_GET["id"]);
即便用戶輸入了一些惡意的id參數,系統也會強制轉換成整型,避免惡意注入。這是因為,系統會對數據進行強制的數據類型檢測,並且對數據來源進行數據格式轉換。而且,對於字元串類型的數據,ThinkPHP都會進行escape_string處理(real_escape_string,mysql_escape_string)。
通常的安全隱患在於你的查詢條件使用了字元串參數,然後其中一些變數又依賴由客戶端的用戶輸入,要有效的防止SQL注入問題,我們建議:
查詢條件盡量使用數組方式,這是更為安全的方式;
如果不得已必須使用字元串查詢條件,使用預處理機制(3.1版本新增特性);
開啟數據欄位類型驗證,可以對數值數據類型做強制轉換;(3.1版本開始已經強制進行欄位類型驗證了)
使用自動驗證和自動完成機制進行針對應用的自定義過濾;
欄位類型檢查、自動驗證和自動完成機制我們在相關部分已經有詳細的描述。
查詢條件預處理
where方法使用字元串條件的時候,支持預處理(安全過濾),並支持兩種方式傳入預處理參數,例如:
$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();
模型的query和execute方法 同樣支持預處理機制,例如:
$model->query('select * from user where id=%d and status=%d',$id,$status);
或者
$model->query('select * from user where id=%d and status=%d',array($id,$status));
execute方法用法同query方法。
Ⅱ ThinkPHP里怎麼直接執行一句SQL語句 - PHP框架開發
$waw = M();
$res = $waw->query($sql); 或 $res = $waw->execute($sql);
由於$sql中包含了表名,實例化模型時可以為空。
註:query()與execute()是有區別的,不能亂用,詳見ThinkPHP光放手冊驅動擴展部分。
褔遞達
Ⅲ thinkphp怎麼列印sql語句
thinkphp的sql語句的應用:
[SQL]SHOWCOLUMNSFROM`think_action`[RunTime:0.001339s]
[EXPLAIN:array('id'=>'1','select_type'=>'SIMPLE','table'=>'think_action','partitions'
=>NULL,'type'=>'ALL','possible_keys'=>NULL,'key'=>NULL,'key_len'=>NULL,'ref'
=>NULL,'rows'=>'82','filtered'=>'100.00','extra'=>NULL,)]
[SQL]SELECT*FROM`think_action`LIMIT1[RunTime:0.000539s]
(3)thinkphpsql參數擴展閱讀:
sql的應用原則:
在關系資料庫實現過程中,第一步是建立關系模式,定義基本表的結構,即該關系模式是哪些屬性組成的,每一屬性的數據類型及數據可能的長度、是否允許為空值以及其它完整性約束條件。
定義基本表:
CREATE TABLE<表名>(<列名1><數據類型>[列級完整性約束條件]
[,<列名2><數據類型>[列級完整性約束條件]]…
[,<-列名n><數據類型>[列級完整性約束條件]]
[,表列級完整性約束條件]);
說明:
1、<>中是SQL語句必須定義的部分,[]中是SQL語句可選擇的部分,可以省略的。
2、CREATE TABLE表示是SQL的關鍵字,指示本SQL語句的功能。
3、<表名>是所要定義的基本表的名稱,一個表可以由一個或若干個屬性(列)組成,但至少有一個屬性,不允許一個屬性都沒有的表,這樣不是空表的含義。多個屬性定義由圓括弧指示其邊界,通過逗號把各個屬性定義分隔開,各個屬性名稱互不相同,可以採用任意順序排列,一般按照實體或聯系定義屬性的順序排列,關鍵字屬性組在最前面,這樣容易區分,也防止遺漏定義的屬性。
Ⅳ thinkphp怎麼做才是安全的sql防注入
1:抵禦99%的攻擊方式,適用於90%的場景.
當網站不涉及復雜的用戶交互時,可以對用戶所有提交的文本進行htmlspecialchars函數處理。
在THINKPHP3.2版本中的操作步驟是:
一:在項目配置文件中添加配置: 'DEFAULT_FILTER' => 'htmlspecialchars', //默認過濾函數
二: 使用框架帶的I方法獲取來自用戶提交的數據;
例子:M('Member')->save(array('content'=>I('post.content')));這樣添加的content內容是經過htmlspecialchars處理過的.
提問:為什麼經過htmlspecialchars處理過的文本可以保證是安全的?
回答:縱觀XSS各種攻擊方式絕大多數依賴<>'"& 這幾個字元中的一個或幾個對內容進行注入攻擊。而htmlspecialchars函數的作用就是將這些字元轉換成無害的HTML 實體;
提問:為什麼有這么好的方法,而還有好多網站還是被攻擊.
回答:因為好多程序員總會粗心忘記使用這個方法,而遺漏某條數據的過濾。
2:對COOKIE進行IP綁定
cookie裡面一般有自動登錄信息和session_id,就算對cookie裡面的內容全部加了密,cookie的信息一但被別人通過XSS攻擊獲取後也一樣等同於把自己的帳號密碼給了別人。
對cookie進行IP綁定,(當然也可以獲取用戶客戶端更多的其它信息進行同時綁定)可以根據用戶的IP來判斷這個cookie是不是來原始授權用戶。
典型的應用示例:
用戶設置了自動登錄時保存自動登錄信息:
$auto=I('post.auto');//用戶設置了自動登錄
if(!empty($auto)){
cookie('auto',encrypt(serialize($data)));//將登錄信息保存到cookie,其中$data里含有加密後的帳號,密碼,和用戶的IP,這里的cookie已在全局中設置過期日期為一周
}
用戶關閉瀏覽器再次訪問網站時,進行自動登錄
if (!is_login()) {//是否未登錄狀態?
$auth=cookie('auto');
if(!empty($auth)){//是否未有自動登錄cookie?
$data=unserialize(decrypt($auth));
if(!empty($data) && !empty($data['username']) && !empty($data['password']) && !empty($data['last_login_ip'])){
$user=M('Member')->where(array('username'=>$data['username'],'password'=>$data['password']))->find();
if(!empty($user['id'])&&($user['last_login_ip']==get_client_ip())){//cookie帳號密碼是否有效?//IP來源是否相同?
login_session($user['id'], $user['username'], $data['last_login_ip']);//用戶自動登錄成功
}
}
}
}
復制代碼
優點:大多數場景下可使被XSS攻擊盜取的cookie失效。缺點:由於IP存在多台電腦共用的可能,對綁定做不到十分精細。
3:為COOKIE添加httponly配置
最新版本的thinkphp已經支持此參數。
此參數可以保證cookie只在http請求中被傳輸,而不被頁面中的腳本獲取,現市面上絕大多數瀏覽器已經支持。
復制代碼
4:HTML5值得觀注的新特性:
<iframe src="http://alibaba.com" sandbox>
為iframe的增加的sandbox屬性,可以防止不信任的Web頁面執行某些操作.相信這個方法以後會被廣泛使用。
復制代碼
5:富文本過濾
富文本過濾是,XSS攻擊最令人頭疼的話題,不僅是小網站,就連BAT這樣的巨頭也是三天兩頭的被其困擾.
Ⅳ thinkphp怎麼連接pgsql
連接資料庫 ThinkPHP內置了抽象資料庫訪問層,把不同的資料庫操作封裝起來,我們只需要使用公共的Db類進行操作,而無需針對不同的資料庫寫不同的代碼和底層實現,Db類會自動調用相應的資料庫適配器來處理。目前的資料庫包括Mysql、MsSQL、PgSQL、Sqlite、Oracle、Ibase以及PDO的支持,如果應用需要使用資料庫,必須配置資料庫連接信息,資料庫的配置文件有多種定義方式:
第一種 在項目配置文件裡面定義
return array(
'DB_TYPE'=> 'mysql',
'DB_HOST'=> 'localhost',
'DB_NAME'=>'thinkphp',
'DB_USER'=>'root',
'DB_PWD'=>'',
'DB_PORT'=>'3306',
'DB_PREFIX'=>'think_',
// 其他項目配置參數………
);
系統推薦使用該種方式,因為一般一個項目的資料庫訪問配置是相同的。該方法系統在連接資料庫的時候會自動獲取,無需手動連接。
可以對每個項目定義不同的資料庫連接信息,還可以在調試配置文件(Conf/debug.php)裡面定義調試資料庫的配置信息,如果在項目配置文件和調試模式配置文件裡面同時定義了資料庫連接信息,那麼在調試模式下面後者生效,部署模式下面前者生效。
第二種 使用DSN方式在初始化Db類的時候傳參數
$db_dsn = 「mysql://username:passwd@localhost:3306/DbName」;
$db = new Db($db_dsn);
該方式主要用於在控制器裡面自己手動連接資料庫的情況,或者用於創建多個資料庫連接。
第三種 使用數組傳參數
$DSN = array(
'dbms' => 'mysql',
'username' => 'username',
'password' => 'password',
'hostname' => ; 'localhost',
'hostport' => '3306',
'database' => 'dbname'
);
$db = new Db($DSN);
該方式也是用於手動連接資料庫的情況,或者用於創建多個資料庫連接。
第四種 在模型類裡面定義
protected $connection = array(
'dbms' => 'mysql',
'username' => 'username',
'password' => 'password',
'hostname' => 'localhost',
'hostport' => '3306',
'database' => 'dbname'
);
// 或者使用下面的定義
protected $connection = 」mysql://username:passwd@localhost:3306/DbName」;
如果在某個模型類裡面定義了connection屬性,則在實例化模型對象的時候,會使用該資料庫連接信息進行資料庫連接。通常用於某些數據表位於當前資料庫連接之外的其它資料庫。
ThinkPHP並不是在一開始就會連接資料庫,而是在有數據查詢操作的時候才會去連接資料庫。額外的情況是,在系統第一次操作模型的時候,框架會自動連接資料庫獲取相關模型類的數據欄位信息,並緩存下來。
(欄位緩存目錄:Runtime/Data/_fields)
ThinkPHP支持PDO方式,如果要使用PDO方式連接資料庫,可以參考下面的設置。
我們以項目配置文件定義為例來說明:
return array(
'DB_TYPE'=> 'pdo',
// 注意DSN的配置針對不同的資料庫有所區別 請參考PHP手冊PDO類庫部分
'DB_DSN'=> 'mysql:host=localhost;dbname=think',
'DB_USER'=>'root',
'DB_PWD'=>'',
'DB_PREFIX'=>'think_',
// 其他項目配置參數………
);
使用PDO方式的時候,要注意檢查是否開啟相關的PDO模塊。DB_DSN參數僅對PDO方式連接才有效。
Ⅵ ThinkPHP如何防止SQL注入
(1)查詢條件盡量使用數組方式,這是更為安全的方式;
(2)如果不得已必須使用字元串查詢條件,使用預處理機制;
(3)使用綁定參數;
(4)強制進行欄位類型驗證,可以對數值數據類型做強制轉換;
(5)使用自動驗證和自動完成機制進行針對應用的自定義過濾;
(6)使用欄位類型檢查、自動驗證和自動完成機制等避免惡意數據的輸入;
(7)做一些過濾。
Ⅶ thinkphp 里sql 語句如何解讀
這個不是原生寫法,這是tp固有的寫法,裡面對語句做了封裝,就是查詢fields表裡條件是model為空或其他條件符合的值。明白了吧!
Ⅷ thinkphp怎麼做才是安全的sql防注入
注入的產生一般都是對用戶輸入的參數未做任何處理直接對條件和語句進行拼裝.
代碼舉例:
//不安全的寫法舉例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這樣的巨頭也是三天兩頭的被其困擾.
Ⅸ 怎樣在thinkphp裡面執行原生的sql語句
原生SQL查詢有 query() 和 execute() 兩個方法:
query():用於 SQL 查詢操作,並返回符合查詢條件的數據集
execute():更新和寫入數據的 SQL 操作,返回影響的記錄數
publicfunctionread(){
//實例化一個空模型,沒有對應任何數據表
$Dao=M();
//或者使用$Dao=newModel();
$list=$Dao->query("select*fromuserwhereuid<5");
if($list){
$this->assign('list',$list);
$this->display();
}else{
$this->error($Dao->getError());
}
}
publicfunctionread(){
header("Content-Type:text/html;charset=utf-8");
//實例化一個空模型,沒有對應任何數據表
$Dao=M();
//或者使用$Dao=newModel();
$num=$Dao->execute("updateusersetemail='[email protected]'whereuid=3");
if($num){
echo'更新',$num,'條記錄。';
}else{
echo'無記錄更新';
}
}