Safe Alert Request Error step 的解決辦法
時(shí)間: 2018-12-09 20:40
閱讀: 次
作者:素材無(wú)憂網(wǎng)
dedecms功能很強(qiáng)大,但總有些東西無(wú)法滿足我們自己的需求,這就需要我們?cè)谠O(shè)計(jì)模板時(shí)使用<dede:php>這個(gè)標(biāo)記來(lái)編寫程序,也總免不了要查詢、更新、修改數(shù)據(jù)庫(kù)。但是不是欣喜的編寫完程序后運(yùn)行程序系統(tǒng)卻提示你Safe Alert Request Error step 1 或 Safe Alert Request Error step 2。引起這個(gè)的主要原因是dedecms 5.6開(kāi)啟了安全檢測(cè)的功能,避免sql注入,提高系統(tǒng)的穩(wěn)定性、安全性!我們完全可以在不關(guān)閉安全檢測(cè)的前提下,實(shí)現(xiàn)這些功能!
比如下面這段代碼:
{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}
該段代碼理論上是實(shí)現(xiàn)查詢某個(gè)TGA標(biāo)簽所對(duì)應(yīng)的圖片文章,而且是能翻頁(yè)的!(這個(gè)只是個(gè)舉例!)
但在實(shí)際執(zhí)行過(guò)程中卻提示“Safe Alert: Request Error step 2”;
經(jīng)過(guò)研究發(fā)現(xiàn),dedecms在執(zhí)行自己編寫的代碼時(shí)會(huì)進(jìn)行安全檢測(cè),以防被注入。牽扯到“select union”等數(shù)據(jù)庫(kù)語(yǔ)句
有兩種方法可以解決這個(gè)問(wèn)題:
第一個(gè)方法:
在include文件夾中找到dedesql.class.php文件,打開(kāi)后找到$this->safeCheck = true;
將“true”修改為false即可屏蔽掉安全檢測(cè)。當(dāng)然,這樣存在一定的安全隱患
第二種方法:不屏蔽安全檢測(cè)
dedecms不是對(duì)selecet等語(yǔ)句敏感嗎,那我就不用select語(yǔ)句進(jìn)行查詢,自己創(chuàng)立一個(gè)select的代替者,如用chaxun代替select,這樣上面的查詢語(yǔ)句就可以寫成:
$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";
估計(jì)你就要問(wèn)了,這樣怎么可能正常執(zhí)行啊,瞎搞嘛!是的,這樣肯定是不行的。我們需要對(duì)dedesql.class.php進(jìn)行一定的修改。
原理就是將之前代替的“select”別名"chaxun"在安全檢測(cè)后更正為select
在dedesql.class.php中找到函數(shù)function CheckSql($db_string,$querytype='select')
將函數(shù)的返回語(yǔ)句
return $db_string;
替換為
return str_replace("dede_database_chaxun","select",$db_string);
然后在查找CheckSql()這個(gè)函數(shù),共有2處調(diào)用
一處為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等語(yǔ)句時(shí)都可以照此進(jìn)行修改!
標(biāo)簽: