dedecms功能很強大,但總有些東西無法滿足我們自己的需求,這就需要我們在設計模板時使用<dede:php>這個標記來編寫程序,也總免不了要查詢、更新、修改數據庫。但是不是欣喜的編寫完程序后運行程序系統卻提示你Safe Alert Request Error step 1 或 Safe Alert Request Error step 2。引起這個的主要原因是dedecms 5.6開啟了安全檢測的功能,避免sql注入,提高系統的穩定性、安全性!我們完全可以在不關閉安全檢測的前提下,實現這些功能!
比如下面這段代碼:
{dede:php runphp='yes'}
$tag = trim($_SERVER['QUERY_STRING']);
$tags = explode('/', $tag);
if(isset($tags[1]))
{
$tag = urldecode($tags[1]);
}
if(isset($tags[2]))
{
$PageNo = intval($tags[2]);
}
if(empty($PageNo))$PageNo=1;
$PageNo=($PageNo-1);
$sql_tag="select * from `dede_archives` where `id` in (select `aid` from `dede_taglist` where `tag` like '$tag') and `litpic`<>'' order by click desc limit $PageNo,8";
if(!isset($dsql)||!is_object($dsql)){
$dsql=new DedeSql(false);}
$dsql->SetQuery($sql_tag);
$dsql->Execute();
@me=""
while($row=$dsql->GetArray()){
$me=$me."<img src='".$row['litpic']."'>";
}
{/dede:php}
該段代碼理論上是實現查詢某個TGA標簽所對應的圖片文章,而且是能翻頁的!(這個只是個舉例!)
但在實際執行過程中卻提示“Safe Alert: Request Error step 2”;
經過研究發現,dedecms在執行自己編寫的代碼時會進行安全檢測,以防被注入。牽扯到“select union”等數據庫語句
有兩種方法可以解決這個問題:
第一個方法:
在include文件夾中找到dedesql.class.php文件,打開后找到$this->safeCheck = true;
將“true”修改為false即可屏蔽掉安全檢測。當然,這樣存在一定的安全隱患
第二種方法:不屏蔽安全檢測
dedecms不是對selecet等語句敏感嗎,那我就不用select語句進行查詢,自己創立一個select的代替者,如用chaxun代替select,這樣上面的查詢語句就可以寫成:
$sql_tag="chaxun * from `dede_archives` where `id` in (chaxun `aid` from `dede_taglist` where `tag` like '$tag') and `litpic`<>'' order by click desc limit $PageNo,8";
估計你就要問了,這樣怎么可能正常執行啊,瞎搞嘛!是的,這樣肯定是不行的。我們需要對dedesql.class.php進行一定的修改。
原理就是將之前代替的“select”別名"chaxun"在安全檢測后更正為select
在dedesql.class.php中找到函數function CheckSql($db_string,$querytype='select')
將函數的返回語句
return $db_string;
替換為
return str_replace("dede_database_chaxun","select",$db_string);
然后在查找CheckSql()這個函數,共有2處調用
一處為if($this->safeCheck) CheckSql($this->queryString,'update');
另一處為if($this->safeCheck)
{
CheckSql($this->queryString);
}
將這兩處分別修改為
if($this->safeCheck) $this->queryString=CheckSql($this->queryString,'update');
和if($this->safeCheck)
{
$this->queryString=CheckSql($this->queryString);
}
好了,大功告成!如果需要使用到union,update等語句時都可以照此進行修改!