Ⅰ thinkphp在執行添加時怎樣防止sql注入
使用tp自帶的方法添加,應該可以過濾大部分的sql注入。只要不直接拼接sql執行。 一般是不需要你考慮這個問題的。對不對我不知道,因為我不用tp框架。 但是其他框架都是可以自己過濾的。 不需要你去處理什麼。
Ⅱ thinkphp 從資料庫驗證用戶名和密碼的代碼,能防止sql注入,,,一般咋么寫的啊高分,
能,不要直接寫sql.程序寫的復雜一點
這是LoginAction.class.php文件
<?php
Class LoginAction extends Action{
Public function index(){
$this->display();
}
Public function login(){
if (!IS_POST) halt('頁面不存在');
if(I('code','','md5') != session('verify')){
$this->error('驗證碼錯誤');
}
$username = I('username');
$pwd = I('password','','md5');
$user = M('user')->where(array('username' => $username))->find();
if(!$user || $user['password'] != $pwd){
$this->error('賬號或密碼錯誤');
}
if($user['lock'] ) $this->error('用戶被鎖定');
$data = array(
'id' => $user['id'],
'logintime' => time(),
'loginip' => get_client_ip(),
);
M('user')->save($data);
session(C('USER_AUTH_KEY'),$user['id']);
session('username',$user['username']);
session('logintime',date('Y-m-d H:i:s',$user['logintime']));
session('loginip',$user['loginip']);
if($user['username'] == C('RBAC_SUPERADMIN')){
session(C('ADMIN_AUTH_KEY'), true);
}
import('ORG.Util.RBAC');
RBAC::saveAccessList();
$this->redirect('Admin/Index/index');
}
Public function verify(){
ob_clean();
import('ORG.Util.Image');
Image::buildImageVerify();
}
}
?>
Ⅲ 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 1.5.0 漏洞求助
ThinkPHP 3.1.3及之前的版本存在一個SQL注入漏洞,漏洞存在於ThinkPHP/Lib/Core/Model.class.php 文件
根據官方文檔對」防止SQL注入」的方法解釋(見http://doc.thinkphp.cn/manual/sql_injection.html)
使用查詢條件預處理可以防止SQL注入,沒錯,當使用如下代碼時可以起到效果:
$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();
但是,當你使用如下代碼時,卻沒有」防止SQL注入」效果(而官方文檔卻說可以防止SQL注入):
$model->query(『select * from user where id=%d and status=%s』,$id,$status);
或者
$model->query(『select * from user where id=%d and status=%s』,array($id,$status));
原因:
ThinkPHP/Lib/Core/Model.class.php 文件里的parseSql函數沒有實現SQL過濾.
原函數:
protected function parseSql($sql,$parse) {
// 分析表達式
if(true === $parse) {
$options = $this->_parseOptions();
$sql = $this->db->parseSql($sql,$options);
}elseif(is_array($parse)){ // SQL預處理
$sql = vsprintf($sql,$parse);
}else{
$sql = strtr($sql,array(『__TABLE__』=>$this->getTableName(),』__PREFIX__』=>C(『DB_PREFIX』)));
}
$this->db->setModel($this->name);
return $sql;
}
驗證漏洞(舉例):
請求地址:
http://localhost/Main?id=boo」 or 1=」1
或
http://localhost/Main?id=boo%22%20or%201=%221
action代碼:
$model=M(『Peipeii』);
$m=$model->query(『select * from peipeii where name=」%s」『,$_GET[『id』]);
mp($m);exit;
或者
$model=M(『Peipeii』);
$m=$model->query(『select * from peipeii where name=」%s」『,array($_GET[『id』]));
mp($m);exit;
結果:
表peipeii所有數據被列出,SQL注入語句起效.
解決辦法:
將parseSql函數修改為:
protected function parseSql($sql,$parse) {
// 分析表達式
if(true === $parse) {
$options = $this->_parseOptions();
$sql = $this->db->parseSql($sql,$options);
}elseif(is_array($parse)){ // SQL預處理
$parse = array_map(array($this->db,』escapeString』),$parse);//此行為新增代碼
$sql = vsprintf($sql,$parse);
}else{
$sql = strtr($sql,array(『__TABLE__』=>$this->getTableName(),』__PREFIX__』=>C(『DB_PREFIX』)));
}
$this->db->setModel($this->name);
return $sql;
}
總結:
不要過分依賴TP的底層SQL過濾,程序員要做好安全檢查
不建議直接用$_GET,$_POST
Ⅳ php如何防止sql注入
PHP防止sql注入是一個比較低級的問題了,這個問題其實在我大一上學期做第一個個人博客的時候就已經關注過了,不過簡單的說一下關於PHP防注入的方式吧。
對於現在的防注入技術其實已經成熟了,對於一個站點該關心的不是防注入了,而是大規模高並發如何處理的問題,或者關於各種其他漏洞,比如現在世界上仍然有百分之80使用redis的站點存在redis漏洞,通過redis漏洞可以直接拿到機器的訪問許可權,一般來說都是直接給你種一個挖礦機器人來。
Ⅵ ThinkPHP如何防止SQL注入
(1)查詢條件盡量使用數組方式,這是更為安全的方式;
(2)如果不得已必須使用字元串查詢條件,使用預處理機制;
(3)使用綁定參數;
(4)強制進行欄位類型驗證,可以對數值數據類型做強制轉換;
(5)使用自動驗證和自動完成機制進行針對應用的自定義過濾;
(6)使用欄位類型檢查、自動驗證和自動完成機制等避免惡意數據的輸入;
(7)做一些過濾。
Ⅶ 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這樣的巨頭也是三天兩頭的被其困擾.