1. ThinkPHP里怎麼直接執行一句sql語句
1、要在控制器裡面實例化一個空模型,如M() D() 2、先寫好sql語句,如:$sql = select * from users 3、調用空模型的query()方法 M()->query($sql)或者D()->query() 即可
2. thinkphp 里sql 語句如何解讀
這個不是原生寫法,這是tp固有的寫法,裡面對語句做了封裝,就是查詢fields表裡條件是model為空或其他條件符合的值。明白了吧!
3. 用thinkPHP框架怎麼實現該sql語句
親,這個不需要轉換,直接使用就行了,TP裡面提供了一個query方法的,直接吧sql傳遞進去
4. 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這樣的巨頭也是三天兩頭的被其困擾.
5. thinkphp 3.1.2 中M方法使用sql語句報錯問題;
你先毀模輸出sql語句看看。echo getlastsql();exit;//輸出上一步sql語句。然後把語句拿到資料庫中執行漏迅看看,如果是對的,纖搜緩那你要檢查一下你的資料庫配置文件中資料庫連接是否正常。
6. ThinkPHP里怎麼直接執行一句SQL語句 - PHP框架開發
$waw = M();
$res = $waw->query($sql); 或 $res = $waw->execute($sql);
由於$sql中包含了表名,實例化模型時可以為空。
註:query()與execute()是有區別的,不能亂用,詳見ThinkPHP光放手冊驅動擴展部分。
褔遞達
7. 求thinkphp 資料庫的備份、還原的腳本
一、備份資料庫並下載到本地【db_backup.php】
代碼代碼如下:
<?php
// 設置SQL文件保存文件名
$filename=date("Y-m-d_H-i-s")."-".$cfg_dbname.".sql";
// 所保存的文件名
header("Content-disposition:filename=".$filename);
header("Content-type:application/octetstream");
header("Pragma:no-cache");
header("Expires:0");
// 獲取當前頁面文件路徑,SQL文件就導出到此文件夾內
$tmpFile = (dirname(__FILE__))."\\".$filename;
// 用MySQLDump命令導出資料庫
exec("mysqlmp -u$cfg_dbuser -p$cfg_dbpwd --default-character-set=utf8 $cfg_dbname > ".$tmpFile);
$file = fopen($tmpFile, "r"); // 打開文件
echo fread($file,filesize($tmpFile));
fclose($file);
exit;
?>
二、還原資料庫【db_restore.php】
代碼代碼如下:
<form id="form1" name="form1" method="post" action="">
【資料庫SQL文件】:<input id="sqlFile" name="sqlFile" type="file" />
<input id="submit" name="submit" type="submit" value="還原" />
</form>
<?php
// 我的資料庫信息都存放到config.php文件中,所以載入此文件,如果你的不是存放到該文件中,注釋此行即可;
require_once((dirname(__FILE__).'/../../include/config.php'));
if ( isset ( $_POST['sqlFile'] ) )
{
$file_name = $_POST['sqlFile']; //要導入的SQL文件名
$dbhost = $cfg_dbhost; //資料庫主機名
$dbuser = $cfg_dbuser; //資料庫用戶名
$dbpass = $cfg_dbpwd; //資料庫密碼
$dbname = $cfg_dbname; //資料庫名
set_time_limit(0); //設置超時時間為0,表示一直執行。當php在safe mode模式下無效,此時可能會導致導入超時,此時需要分段導入
$fp = @fopen($file_name, "r") or die("不能打開SQL文件 $file_name");//打開文件
mysql_connect($dbhost, $dbuser, $dbpass) or die("不能連接資料庫 $dbhost");//連接資料庫
mysql_select_db($dbname) or die ("不能打開資料庫 $dbname");//打開資料庫
echo "<p>正在清空資料庫,請稍等....<br>";
$result = mysql_query("SHOW tables");
while ($currow=mysql_fetch_array($result))
{
mysql_query("drop TABLE IF EXISTS $currow[0]");
echo "清空數據表【".$currow[0]."】成功!<br>";
}
echo "<br>恭喜你清理MYSQL成功<br>";
echo "正在執行導入資料庫操作<br>";
// 導入資料庫的MySQL命令
exec("mysql -u$cfg_dbuser -p$cfg_dbpwd $cfg_dbname < ".$file_name);
echo "<br>導入完成!";
mysql_close();
}
?>