㈠ 淺析php插件 HTMLPurifier HTML解析器
本篇文章是對php插件 HTMLPurifier HTML解析器進行了詳細的分析介紹 需要的朋友參考下HTMLPurifier插件的使用 下載HTMLPurifier插件 HTMLPurifier插件有用的部分是 library
使用HTMLPurifier library類庫 第一種方式
復制代碼 代碼如下: <?php require_once HTMLPurifier auto php ; $config = HTMLPurifier_Config::createDefault(); ?>或者
復制代碼 代碼如下: <?php require_once HTMLPurifier includes php ; require_once HTMLPurifier autoload php ; $config = HTMLPurifier_Config::createDefault(); ?>官網給出的例子是
復制代碼 代碼如下: require_once HTMLPurifier auto php ;我同事常用的是
復制代碼 代碼如下: require_once HTMLPurifier includes php ; require_once HTMLPurifier autoload php ;
設置$config configdoc 例子
復制代碼 代碼如下: $config >set( HTML AllowedElements array( div =>true table =>true tr =>true td =>true br =>true)); $config >set( HTML Doctype XHTML Transitional ) //文檔類型(常設) $config >set( Core Encoding UTF ) //字元拆攔陸編碼(常設)HTML允許旅頃的元衡圓素 div元素 table元素 tr元素 td元素 br元素 new HTMLPurifier對象
復制代碼 代碼如下: $purifier = new HTMLPurifier($config);調用HTMLPurifier對象的purify方法
復制代碼 代碼如下: $puri_ = $purifier >purify($);第二種方式 自定義一個類 HtmlPurifier php
復制代碼 代碼如下: <?php require_once HTMLPurifier includes php ; require_once HTMLPurifier autoload php ; class Resume_HtmlPurifier implements Zend_Filter_Interface{ protected $_Purifier = null; public function __construct($options = null) { $config = HTMLPurifier_Config::createDefault(); $config >set( Code Encoding UTF ); $config >set( HTML Doctype XHTML Transitional ) if(!is_null($options)){ foreach($options as $option){ $config >set($option[ ] $option[ ] $option[ ]); } } $this >_Purifier = new HTMLPurifier($config); } public function filter($value) { return $this >_Purifier >purify($value); } } ?>設置config信息 例如
復制代碼 代碼如下: $conf = array( array( HTML AllowedElements array( div => true table => true tr => true td => true br => true ) false) //允許屬性 div table tr td br元素 array( HTML AllowedAttributes array( class => TRUE) false) //允許屬性 class array( Attr ForbiddenClasses array( resume_p => TRUE) false) //禁止classes如 array( AutoFormat RemoveEmpty true false) //去空格 array( AutoFormat RemoveEmpty RemoveNbsp true false) //去nbsp array( URI Disable true false) );調用
復制代碼 代碼如下: lishixin/Article/program/PHP/201311/20818
㈡ 如何防止跨站點腳本攻擊
你好~
XSS漏洞產生的原因:
跨站點腳本的主要原因是程序猿對用戶的信任。開發人員輕松地認為用戶永遠不會試圖執行什麼出格的事情,所以他們創建應用程序,卻沒有使用任何額外的代碼來過濾用戶輸入以阻止任何惡意活動。另一個原因是,這種攻擊有許多變體,用製造出一種行之有效的XSS過濾器是一件比較困難的事情。
但是這只是相對的,對用戶輸入數據的」編碼」和」過濾」在任何時候都是很重要的,我們必須採取一些針對性的手段對其進行防禦。
如何創造一個良好的XSS過濾器來阻止大多數XSS攻擊代碼
1 .需要重點」編碼」和」過濾」的對象
The URL
HTTP referrer objects
GET parameters from a form
POST parameters from a form
Window.location
Document.referrer
document.location
document.URL
document.URLUnencoded
cookie data
headers data
database data
防禦XSS有一個原則:
以當前的應用系統為中心,所有的進入應用系統的數據都看成是輸入數據(包括從FORM表單或者從資料庫獲取到的數據),所有從當前應用系統流出的數據都看作是輸出(包括輸出到用戶瀏覽器或向資料庫寫入數據)
對輸入的數據進行」過濾」,對輸出數據進行」編碼」。這里的」編碼」也要注意,必須針對數據具體的上下文語境進行針對性的編碼。例如數據是輸出到HTML中的那就要進行HtmlEncode,如果數據是輸出到javascript代碼中進行拼接的,那就要進行javascriptEncode。
如果不搞清楚數據具體輸出的語境,就有可能因為HtmlParser()和javascriptParser()兩種解析引擎的執行先後問題導致看似嚴密的」編碼」形同虛設。
2. HtmlEncode HTML編碼
它的作用是將字元轉換成HTMLEntities,對應的標準是ISO-8859-1
為了對抗XSS,在HtmlEncode中要求至少轉換以下字元:
& --> &
< --> <
> --> >
" --> "
' --> '
/ --> /
在PHP中:
htmlentities
http://www.w3school.com.cn/php/func_string_htmlentities.asp
htmlspecialchars
http://www.w3school.com.cn/php/func_string_htmlspecialchars.asp
3. javascriptEncode javascript」編碼」
javascriptEncode與HtmlEncode的編碼方法不同,HtmlEncode是去編碼,而javascriptEncode更多的像轉義,它需要使用」\」對特殊字元進行轉義。從原理上來講,這都符合編碼函數的一個大原則: 將數據和代碼區分開,因為對於HTML Tag來說,我們對其進行」可視化(轉換成可以見字元)」的編碼可以將數據和HTML的界限分開。而對於javascript來說,我們除了要進行編碼之外,還需要對特殊字元進行轉義,這樣攻擊輸入的用於」閉合」的特殊字元就無法發揮作用,從而避免XSS攻擊,除此之外,在對抗XSS時,還要求輸出的變數必須在引號內部,以避免造成安全問題。
escape()
http://www.w3school.com.cn/js/jsref_escape.asp
該方法不會對 ASCII 字母和數字進行編碼,也不會對下面這些 ASCII 標點符號進行編碼: * @ – _ + . / 。其他所有的字元都會被轉義序列(十六進制\xHH)替換。
利用這個編碼函數,不僅能防禦XSS攻擊,還可以防禦一些command注入。
一些開源的防禦XSS攻擊的代碼庫:
PHP AntiXSS
這是一個不錯的PHP庫,可以幫助開發人員增加一層保護,防止跨站腳本漏洞。
https://code.google.com/p/php-antixss/
xss_clean.php filter
https://gist.github.com/mbijon/1098477
HTML Purifier
http://htmlpurifier.org/
xssprotect
https://code.google.com/p/xssprotect/
XSS HTML Filter
http://finn-no.github.io/xss-html-filter/
原文地址:http://resources.infosecinstitute.com/how-to-prevent-cross-site-scripting-attacks/
希望可以幫助到你~望採納哦~謝謝~
㈢ PHP檢測HTML代碼裡面是否含有圖片,處理後輸出,求解!
<?php
$content='這是一段文字,裡面可能有很多圖片,比如這是第一張<imgsrc="pic/big/xxx1.jpg">當然也可能會有第二張<imgsrc="pic/big/xxx2.jpg">也許還會有第三張,說不定的,<imgsrc="other/2014/xxx3.jpg">或者有第四第五恆多張:<imgsrc="pic/big/xxx4.jpg">,反正就是可能有很多IMG應用的圖片。';
$imgs=array();
preg_replace_callback('#(<img[^>]+?pic/)big(/[^>]+>)#i',create_function(
'$v',
'
global$imgs;
$imgs[]=$v[1]."small".$v[2];
'),$content);
print_r($imgs);
㈣ php過濾危險html代碼
用PHP過濾html里可能被利用來尺散引入外部危險內容的代碼。有些時候,需要讓用戶提交html內容,以便豐富用戶發布的信息,當然,有些可能造成顯示頁面布陵困亂局混亂的代碼也在過尺檔濾范圍內。
以下是引用片段:
#用戶發布的html,過濾危險代碼
function uh($str)
{
$farr = array("/s+/", //過濾多餘的空白
"/(/?)(script|i?frame|style|html|body|title|link|meta|?|\%)([^]*?)/isU", //過濾 script 等可能引入惡意內容或惡意改變顯示布局的代碼,如果不需要插入flash等,還可以加入object的過濾
"/([^]*)on[a-zA-Z]+s*=([^]*)/isU", //過濾javascript的on事件);
$tarr = array(" ",
"<\1\2\3>", //如果要直接清除不安全的標簽,這里可以留空
"\1\2",);
$str = preg_replace( $farr,$tarr,$str);
return $str;
}
㈤ 用php過濾html部分標簽
$str=preg_replace("/\s+/", " ", $str); //過濾多餘回車
$str=preg_replace("/<[ ]+/si","<",$str); //過濾<__("<"號後面帶空格)
$str=preg_replace("/<\!--.*?-->/si","",$str); //注釋
$str=preg_replace("/<(\!.*?)>/si","",$str); //過濾DOCTYPE
$str=preg_replace("/<(\/?html.*?)>/si","",$str); //過濾html標簽
$str=preg_replace("/<(\/?head.*?)>/si","",$str); //過濾head標簽
$str=preg_replace("/<(\/?meta.*?)>/si","",$str); //過濾meta標簽
$str=preg_replace("/<(\/?body.*?)>/si","",$str); //過濾body標簽
$str=preg_replace("/<(\/?link.*?)>/si","",$str); //過濾link標簽
$str=preg_replace("/<(\/?form.*?)>/si","",$str); //過濾form標簽
$str=preg_replace("/cookie/si","COOKIE",$str); //過濾COOKIE標簽
$str=preg_replace("/<(applet.*?)>(.*?)<(\/applet.*?)>/si","",$str); //過濾applet標簽
$str=preg_replace("/<(\/?applet.*?)>/si","",$str); //過濾applet標簽
$str=preg_replace("/<(style.*?)>(.*?)<(\/style.*?)>/si","",$str); //過濾style標簽
$str=preg_replace("/<(\/?style.*?)>/si","",$str); //過濾style標簽
$str=preg_replace("/<(title.*?)>(.*?)<(\/title.*?)>/si","",$str); //過濾title標簽
$str=preg_replace("/<(\/?title.*?)>/si","",$str); //過濾title標簽
$str=preg_replace("/<(object.*?)>(.*?)<(\/object.*?)>/si","",$str); //過濾object標簽
$str=preg_replace("/<(\/?objec.*?)>/si","",$str); //過濾object標簽
$str=preg_replace("/<(noframes.*?)>(.*?)<(\/noframes.*?)>/si","",$str); //過濾noframes標簽
$str=preg_replace("/<(\/?noframes.*?)>/si","",$str); //過濾noframes標簽
$str=preg_replace("/<(i?frame.*?)>(.*?)<(\/i?frame.*?)>/si","",$str); //過濾frame標簽
$str=preg_replace("/<(\/?i?frame.*?)>/si","",$str); //過濾frame標簽
$str=preg_replace("/<(script.*?)>(.*?)<(\/script.*?)>/si","",$str); //過濾script標簽
$str=preg_replace("/<(\/?script.*?)>/si","",$str); //過濾script標簽
$str=preg_replace("/javascript/si","Javascript",$str); //過濾script標簽
$str=preg_replace("/vbscript/si","Vbscript",$str); //過濾script標簽
$str=preg_replace("/on([a-z]+)\s*=/si","On\\1=",$str); //過濾script標簽
$str=preg_replace("//si","&#",$str); //過濾script標簽,如javAsCript:alert(
清除空格,換行
function DeleteHtml($str)
{
$str = trim($str);
$str = strip_tags($str,"");
$str = ereg_replace("\t","",$str);
$str = ereg_replace("\r\n","",$str);
$str = ereg_replace("\r","",$str);
$str = ereg_replace("\n","",$str);
$str = ereg_replace(" "," ",$str);
return trim($str);
}
過濾HTML屬性
1,過濾所有html標簽的正則表達式:
復制代碼 代碼如下:
</?[^>]+>
//過濾所有html標簽的屬性的正則表達式:
$html = preg_replace("/<([a-zA-Z]+)[^>]*>/","<\\1>",$html);
3,過濾部分html標簽的正則表達式的排除式(比如排除<p>,即不過濾<p>):
復制代碼 代碼如下:
</?[^pP/>]+>
4,過濾部分html標簽的正則表達式的枚舉式(比如需要過濾<a><p><b>等):
復制代碼 代碼如下:
</?[aApPbB][^>]*>
5,過濾部分html標簽的屬性的正則表達式的排除式(比如排除alt屬性,即不過濾alt屬性):
復制代碼 代碼如下:
\s(?!alt)[a-zA-Z]+=[^\s]*
6,過濾部分html標簽的屬性的正則表達式的枚舉式(比如alt屬性):
復制代碼 代碼如下:
(\s)alt=[^\s]*
㈥ Acunetix掃描到我的站點有跨站腳本漏洞,我要怎麼復現這個漏洞
Acunetix是一款流行的網站性能分析和管理工具,可以幫助用戶監控和優化網站性能。如果Acunetix掃描到您的站點存在跨站腳本漏洞,您可以採取以下步驟來復現這個漏洞:
確認漏洞:首先,確認您的站點是否確實存在跨站腳本漏洞。可以查看Acunetix提供的漏洞報告或者與Acunetix支持團隊枯枝聯系以獲取更多信息。
收集數據:在進行任何修復前,需要收集足夠的數據以便進行分析。這可能包括網站流量、跳出率、用戶行為等。
分析數據螞如:分析收集到的數據,以確定漏洞的原因。可以使用各種工具和技術來幫助您分析數據,例如抓取工具、性能分析工具、網路分析工具等。
修復漏洞:根據分析結果,確定漏洞的修復方案。可以使用Acunetix提供的修復工具或者自己編寫修復腳本。
驗證修復效果:在修復漏洞後,需要驗證修復效果。可以使用Acunetix提供的性能分析工具來檢查網站性能是否已經得到改善。
更新軟體:最後,確保您的站點已經更新到最新版沒物敏本的Acunetix軟體,以確保漏洞已經得到修復。
總之,復現Acunetix掃描到的跨站腳本漏洞需要一定的技術知識和數據分析能力。如果您不確定如何修復漏洞,建議與Acunetix支持團隊聯系以獲取幫助。
㈦ php技術生成靜態頁面的實現
我們先回顧一些基本的概念。
一、PHP腳本與動態頁面。
PHP腳本是一種伺服器端腳吵旅扒本程序,可通過嵌入等方法與HTML文件混合,也可以類,函數封裝等形式,以模板的方式對用戶請求進行處理。無論以何種方式,它的基本原理是這樣的。由客戶端提出請求,請求某一頁面-----Web伺服器引入指定相應腳本進行處理-----腳本被載入伺服器-----由伺服器指定的PHP解析器對腳本進行解析形成HTML語言形式----將解析後的HTML語句以包的方式傳回給瀏覽器。由此不難看出,在頁面發送到瀏覽器後, PHP就不存在了,已被轉化解析為HTML語句。客戶請求為一動態文件,事實上並沒有真正的文件存在在那裡,是PHP解析而成相升昌對應的頁面,然後發送回瀏覽器。這種頁面處理方式被稱為「動態頁面」。
二、靜態頁面。
靜態頁面是指在伺服器端確實存在的僅含HTML以及JS,CSS等客戶端運行腳本的頁面。它的處理方式是。由客戶端提出請求,請求某一頁面- ---
WEB伺服器確認並載入某一頁面----WEB伺服器將該頁面以包的形式傳遞回瀏覽器。由這一過程,我們對比一下動態頁面,即可方現。動態頁面需由Web伺服器的PHP解析器進行解析,而且通常還需連接資料庫,進行資料庫存取操作,然後才能形成HTML語言信息鎮知包;而靜態頁面,無須解析,無須連接資料庫,直接發送,可大大減輕伺服器壓力,提高伺服器負載能力,大幅提供頁面打開速度和網站整體打開速度。但其缺點是,不能動態地對請求進行處理,伺服器上必須確實存在該文件。
三、模板及模板解析。
模板即尚未填充內容html文件。例如:
temp.html
Code:
以下是引用片段:
HTML
TITLE{ title }/TITLE
BODY
this is a { file } file''''s templets
/BODY
/HTML
PHP處理:
以下是引用片段:
templetest.php
Code:
$title = "HP愛好者測試模板";
$file = "TwoMax Inter test templet,
author:Sheyi";
$fp = fopen ("temp.html","r");
$content = fread ($fp,filesize ("temp.html"));
$content .= str_replace ("{ file }",$file,$content);
$content .= str_replace ("{ title }",$title,$content);
echo $content;
?
模板解析處理,即將經PHP腳本解析處理後得出的結果填充(content)進模板的處理過程。通常藉助於模板類。目前較流行的模板解析類有 phplib,smarty,fastsmarty等等。模板解析處理的原理通常為替換。也有些程序員習慣將判斷,循環等處理放進模板文件中,用解析類處理,典型應用為block概念,簡單來說即為一個循環處理。由PHP腳本指定循環次數,如何循環代入等,再由模板解析類具體實施這些操作。
好了,對比過靜態頁面與動態頁面各自的優劣,現在我們就來說說,如何用PHP生成靜態文件。
PHP生成靜態頁面並不是指PHP的動態解析,輸出HTML頁面,而是指用PHP創建HTML頁面。同時因為HTML的不可寫性,我們創建的 HTML 若有修改,則需刪掉重新生成即可。(當然你也可以選擇用正則進行修改,但個人認為那樣做倒不如刪掉重新生成來得快捷,有些得不償失。)
言歸正傳。用過PHP文件操作函數的PHP FANS知道,PHP中有一個文件操作函數fopen,即打開文件。若文件不存在,則嘗試創建。這即是PHP可以用來創建HTML文件的理論基礎。只要用來存放HTML文件的文件夾有寫許可權(即許可權定義0777),即可創建文件。(針對UNIX系統而言,Win系統無須考慮。)仍以上例為例,若我們修改最後一句,並指定在test目錄下生成一個名為test.html的靜態文件:
Code:
以下是引用片段:
$title = "拓邁國際測試模板";
$file = "TwoMax Inter test templet,
author:_Max"Matrix@Two_Max";
$fp = fopen ("temp.html","r");
$content = fread ($fp,filesize ("temp.html"));
$content .= str_replace ("{ file }",$file,$content);
$content .= str_replace ("{ title }",$title,$content);
// echo $content;
$filename = "test/test.html";
$handle = fopen ($filename,"w"); //打開文件指針,創建文件
/*
檢查文件是否被創建且可寫
*/
if (!is_writable ($filename)){
die ("文件:".$filename."不可寫,請檢查其屬性後重試!");
}
if (!fwrite ($handle,$content)){ //將信息寫入文件
die ("生成文件".$filename."失敗!");
}
fclose ($handle); //關閉指針
die ("創建文件".$filename."成功!");
?
實際應用中常見問題解決方案參考:
一、文章列表問題:
在資料庫中創建欄位,記錄文件名,每生成一個文件,將自動生成的文件名存入資料庫,對於推薦文章,只需指向存放靜態文件的指定文件夾中的該頁面即可。利用PHP操作處理文章列表,存為字元串,生成頁面時替換此字元串即可。如,在頁面中放置文章列表的表格加入標記{ articletable },而在PHP處理文件中:
Code:
以下是引用片段:
$title = "拓邁國際測試模板";
$file = "TwoMax Inter test templet,
author:_Max"Matrix@Two_Max";
$fp = fopen ("temp.html","r");
$content = fread ($fp,filesize ("temp.html"));
$content .= str_replace ("{ file }",$file,$content);
$content .= str_replace ("{ title }",$title,$content);
// 生成列表開始
$list = ''''''''
$sql = "select id,title,filename from article";
$query = mysql_query ($sql);
while ($result = mysql_fetch_array ($query)){
$list .= ''''''''.$result[''''title''''].''''
''''
}
$content .= str_replace ("{ articletable }",$list,$content);
//生成列表結束
// echo $content;
$filename = "test/test.html";
$handle = fopen ($filename,"w"); //打開文件指針,創建文件
/*
檢查文件是否被創建且可寫
*/
if (!is_writable ($filename)){
die ("文件:".$filename."不可寫,請檢查其屬性後重試!");
}
if (!fwrite ($handle,$content)){ //將信息寫入文件
die ("生成文件".$filename."失敗!");
}
fclose ($handle); //關閉指針
die ("創建文件".$filename."成功!");
?
二、分頁問題。
如我們指定分頁時,每頁20篇。某子頻道列表內文章經資料庫查詢為45條,則,首先我們通過查詢得到如下參數:1,總頁數;2,每頁篇數。第二步, for ($i = 0; $i
allpages; $i++),頁面元素獲取,分析,文章生成,都在此循環中執行。不同的是,die ("創建文件".$filename."成功!";這句去掉,放到循環後的顯示,因為該語句將中止程序執行。例:
Code:
以下是引用片段:
$fp = fopen ("temp.html","r");
$content = fread ($fp,filesize ("temp.html"));
$onepage = '''ཐ''''
$sql = "select id from article where channel=''''$channelid''''";
$query = mysql_query ($sql);
$num = mysql_num_rows ($query);
$allpages = ceil ($num / $onepage);
for ($i = 0;$i$allpages; $i++){
if ($i == 0){
$indexpath = "index.html";
} else {
$indexpath = "index_".$i."html";
}
$start = $i * $onepage;
$list = ''''''''
$sql_for_page = "select name,filename,title from article where channel=''''$channelid'''' limit $start,$onepage";
$query_for_page = mysql_query ($sql_for_page);
while ($result = $query_for_page){
$list .= ''''''''.$title.''''
''''
}
$content = str_replace ("{ articletable }",$list,$content);
if (is_file ($indexpath)){
@unlink ($indexpath); //若文件已存在,則刪除
}
$handle = fopen ($indexpath,"w"); //打開文件指針,創建文件
/*
檢查文件是否被創建且可寫
*/
if (!is_writable ($indexpath)){
echo "文件:".$indexpath."不可寫,請檢查其屬性後重試!"; //修改為echo
}
if (!fwrite ($handle,$content)){ //將信息寫入文件
echo "生成文件".$indexpath."失敗!"; //修改為echo
}
fclose ($handle); //關閉指針
}
fclose ($fp);
die ("生成分頁文件完成,如生成不完全,請檢查文件許可權系統後重新生成!");
?
大致思路如此,其中如其它數據生成,數據輸入輸出檢查,分頁內容指向等可酌情在頁面中加入。
在實際文章系統處理過程當中,還有許多問題有待考慮,與動態頁面不同之處,需注意的地方還有很多。但大致思路即是如此,其它方面可舉一反三而得。
㈧ 安裝codeception需要安裝yii2嗎
當 Yii框架仍處於 RC(候選版)階段時,我們 對它進行過報道,那時它剛剛全面達到候選版本階段,(現在它已經發布了正式版本)我們感覺是時候再次討論這個話題:選擇 Yii框架的原因。 1. 易於安裝 對於web開發人員來說,時間就是金錢,沒有人願意把寶貴的時間花在一個復雜的安裝和配置過程。 安裝處理使用Composer。如果你想要描述安裝的過程,Sitepoint最近發表了一篇很棒的文章,在這兒。我傾向於使用基本的應用程序模板,即使我的網站有一個單獨的灶則鉛前端和後端組件。相反,我選擇使用一個模塊給我的網站的後台部分。(Yii模塊是最好的描述,小應用駐留在主應用程序裡面)。 注意:許多目錄的引用在後面的示例中,從簡單的模板去使用目錄的結構。 2. 利用現代技術 Yii是一種純粹的面向對象框架,並且利用PHP的一些更高級的功能,包括延遲靜態綁定,SPL類和介面,和匿名函數。 所有的類名稱空間,它允許你利用PSR-4兼容的自動裝載器。這意味著包括Yii 的 HTML的幫助類一樣的簡單: use yii\helpers\Html; Yii 也允許你定義別名來幫助簡化你的命名空間。 在上面的示例中, use 語句將載入一個類定義,默認放的目錄 /vendor/yiisoft/yii2/helpers. 這個別名在BaseYii 類在第79行中定義: public static $aliases = ['@yii' => __DIR__]; 框架本身的安裝使用Composer,是其擴展。 甚至出版的過程擴展一樣容易創建自己的 composer.json,並在Github託管代碼,列出您的擴展在Packagist。 3. 高度可擴展性 Yii 看起來就像一件樣式很棒的西裝,但也非常容易根據你的需求來進行定製. 實際上框架的每一個組件都是可以擴展的。一個簡單的示例就是添加一個唯一的主體ID到你的視圖上。 (你如果對隱好自己為什麼可能會想要這樣做感興趣的話,可以看看這篇 文章). 首先,我會在我的 app\components 目錄相面創建一個名為 View.php 的文件, 並加入如下代碼: namespace app\components; class View extends yii\web\View { public $bodyId; /* Yii allows you to add magic getter methods by prefacing method names with "get" */ public function getBodyIdAttribute() { return ($this->bodyId != '') ? 'id="' . $this->bodyId . '"' : ''; } } 然後,在我的主布局文件 (app\views\layouts\main.php) 中,我會將如下代碼添加到我的HTML中body標簽的裡面: <body <?=$this->BodyIdAttribute?>> 而最後,我會加下列的代碼添加到我的主配置文件中,以便讓Yii知道如何去使用我擴展的視圖類,而不是它自己默認的那個類: return [ // ... 'components' => [ // ... 'view' => [ 'class' => 'app\components\View' ] ] ]; 4. 鼓勵測試 Yii 框架和Codeception框架緊密地集成在一起。 Codeception 是一個優秀的PHP測試框架,它幫助簡化創建單元測試、功能盯讓驗收測試的流程。 條件是你在為所有的應用程序編寫自動化的測試用例,對吧? Codeception 擴展使得在測試時配置應用程序變得簡單。 測試應用程序,只需編輯一個已存在的文件/tests/_config.php。例如: return [ 'components' => [ 'mail' => [ 'useFileTransport' => true, ], 'urlManager' => [ 'showScriptName' => true, ], 'db' => [ 'dsn' => 'mysql:host=localhost;dbname=mysqldb_test', ], ], ]; 使用上面的配置,需要注意下面一些事項: 在功能驗收測試期間,所有發送的郵件都會被寫入一個文件中保存,而非真正地發送出去。 測試時URL的格式是index.php/controller/action,而非/controller/action。 測試時需要使用測試資料庫,而非生產資料庫。 Codeception 內部存在一個特殊的模塊,專門用於Yii 框架測試。 它在TestGuy類里添加了一些方法,保證功能測試時 Active Record(Yii 的ORM)可以正常工作。 例如,如果你想查看注冊表單是否成功地創建了一個用戶名為testuser的User對象,你可以這樣做: $I->amOnPage('register'); $I->fillField('username', 'testuser'); $I->fillField('password', 'qwerty'); $I->click('Register'); $I->seeRecord('app\models\User', array('name' => 'testuser')); 5. 簡化的安全方案 安全性是任何web應用的重要組成部分,幸運的是Yii有許多很棒的特性能幫你減輕負擔. Yii 帶來了一個安全性 應用程序組件,它暴露了一些可以幫助可以用來創建一個更加安全的應用程序的方法. 其中一些相對而言更加有用的方法有: generatePasswordHash: 從一個密碼和一個隨機的鹽值生成一個安全的哈希值. 這個方法會為你創建一個隨機的鹽值,然後使用PHP的 crypt 函數來根據所提供的字元串創建一個哈希值. validatePassword: 這是一個可以同 generatePasswordHash 搭配使用的方法, 並可以讓你檢查用戶提供的密碼是否同你存儲的哈希值匹配. generateRandomKey: 可逆讓你創建一個任何長度的隨機字元串 Yii 會自動對所有非安全 HTTP 請求方法 (PUT, POST, DELETE) 的可用CSRF令牌進行檢查, 並將在你使用 ActiveForm::begin() 方法創建你的開發表單標簽時生成並輸出一個令牌值. 這個特性可以通過編輯你的主配置文件,包含下面的代碼來禁用: return [ 'components' => [ 'request' => [ 'enableCsrfValidation' => false, ] ]; 為了堤防跨站腳本XSS的攻擊,Yii提供了另外一個叫做 HtmlPurifier 的輔助類. 這個類有一個名為 process 的靜態方法, 而它將會使用同名的 流行過濾器庫 來過濾你的輸出. Yii 也包含了隨時就緒的用於用戶認證和授權的類. 授權被分成了兩個類型: ACF (訪問控制過濾器) 和RBAC (基於角色訪問的控制). 兩者中更加的是 ACF, 其實現是通過在你控制器的添加下列的 行為 方法: use yii\filters\AccessControl; class DefaultController extends Controller { // ... public function behaviors() { return [ // ... 'class' => AccessControl::className(), 'only' => ['create', 'login', 'view'], 'rules' => [ [ 'allow' => true, 'actions' => ['login', 'view'], 'roles' => ['?'] ], [ 'allow' => true, 'actions' => ['create'], 'roles' => ['@'] ] ] ]; } // ... } 上面的代碼會告訴 DefaultControllerto 讓訪客用戶訪問login和view的action, 而不是create這個action. (問號 ? 是匿名用戶的別名, 而 @ 表示的是已經被授權的用戶). RBAC 是一個可以在應用程序中指定那些用戶可以執行特定的動作的強大方法. 它涉及為你的用戶創建角色,為你的app定義許可權,並然後為他們預期的角色使用這些角色. 如果你想要創建一個審核員(Moderator)的角色就可以使用這個方法, 並可以讓所有分配到這個角色的用戶可以對文章進行審核. 你也還可以使用 RBAC 定義規則, 它可以讓你在特定條件下針對你應用程序的某些方面進行授權. 例如,你可以創建一個規則讓用戶可以編輯他們自己的文章, 而不能修改由其他人創建的文章. 6. 縮短開發時間 大多數的項目都包含了重復的任務,沒有人想把時間浪費在這些重復工作上面。Yii 提供了一些工具來幫助你在這些任務上花費更少的時間,把大多數時間都用在定製應用來滿足你客戶的需求上。 其中最強大的一個工具就是「Gii」。Gii是一個基於web腳手架代碼工具,它可以讓你快速的創建一個代碼模板如下所示: Models Controllers Forms Moles Extensions CRUD controller actions and views Gii是高度可配置的。你可以設置它只從一個特定的環境載入。簡單的編輯web配置文件如下: if (YII_ENV_DEV) { // ... $config['moles']['gii'] = [ 'class' => 'yii\gii\Mole', 'allowedIPs' => ['127.0.0.1', '::1'] ] } 這確保了Gii只有設置了Yii的環境變數為(development)開發環境時才載入,並且只在通過本地環境訪問的時候載入。 現在,讓我們來看看模型的生成: 表格名稱使用了一個響應敲擊就會顯示的小窗口來嘗試給出對你的模型將會關聯的表格的猜測, 並且所有的域值輸入框都會有一個翻轉效果顯示出來的提示,提醒你如何完成對它們的填寫. 你可以在讓Gii輸出代碼之前先進行一下預覽, 而所有的代碼模板都是完全可定製的. 也有幾個可以用於資料庫遷移、消息翻譯(I18N)以及生成用於自動化測試資料庫道具的命令行輔助工具. 例如,你可以使用如下代碼創建一個新的資料庫遷移 文件: yii migrate/create create_user_table 這將會在 {應用目錄}/migrations 創建一個新的看起來像下面這樣的遷移模板: <?php use yii\db\Schema; class m140924_153425_create_user_table extends \yii\db\Migration { public function up() { } public function down() { echo "m140924_153425_create_user_table cannot be reverted.\n"; return false; } } 如此假如說我想要想這個表添加一些列. 我就只要簡單的將下面的代碼添加到 up 方法中: public function up() { $this->createTable('user', [ 'id' => Schema::TYPE_PK, 'username' => Schema::TYPE_STRING . ' NOT NULL', 'password_hash' => Schema:: TYPE_STRING . ' NOT NULL' ], null); } 然後為了確保我可以進行遷移的逆向操作,我就會編輯down方法: public function down() { $this->dropTable('user'); } 創建表格可能就是簡單的設計到在命令行上運行一個命令: ./yii migrate 而刪除表格是下面的這個命令: ./yii migrate/down 7. 很容易通過調整獲得更好的性能 所有人都知道一個慢吞吞的網站會造就許多心懷不滿的用戶, 因此Yii為你提供了一些工具來幫助你讓應用程序獲得更快的速度. 所有的Yii緩存組件都擴展自yii/caching/Cache, 它能讓你在使用一個公共API的同時選擇任意某一個緩存系統. 你甚至可以同時注冊多個高速緩存組件. Yii 當前支持資料庫和文件系統緩存, 還有 APC, Memcache, Redis, WinCache, XCache 以及 Zend Data Cache. 默認情況下,如果你是使用的 Active Record ,那麼 Yii 會額外運行一個查詢來確定生成你模型的表的結構. 你可以通過像下面這樣編輯你的主配置文件,對你的應用程序進行設置,以緩存這些表結構: return [ // ... 'components' => [ // ... 'db' => [ // ... 'enableSchemaCache' => true, 'schemaCacheDuration' => 3600, 'schemaCache' => 'cache', ], 'cache' => [ 'class' => 'yii\caching\FileCache', ], ], ]; 最後,Yii有一個命令行工具可以便於對前端欄位進行縮小化. 簡單地運行下面的命令就可以生成一個配置模板: ./yii asset/template config.php 然後編輯該配置,指定你想要用那些工具來執行縮小化操作(比如. Closure Compiler, YUI Compressor, 或者 UglifyJS). 生成的配置模板如下所示: <?php return [ 'jsCompressor' => 'java -jar compiler.jar --js {from} --js_output_file {to}', 'cssCompressor' => 'java -jar yuicompressor.jar --type css {from} -o {to}', 'bundles' => [ // 'yii\web\YiiAsset', // 'yii\web\JqueryAsset', ], 'targets' => [ 'app\config\AllAsset' => [ 'basePath' => 'path/to/web', 'baseUrl' => '', 'js' => 'js/all-{hash}.js', 'css' => 'css/all-{hash}.css', ], ], 'assetManager' => [ 'basePath' => __DIR__, 'baseUrl' => '', ], ]; 接下來,運行這個控制台命令以執行壓縮. yii asset config.php /app/assets_compressed.php 最後,修改你的web應用程序配置文件,使用壓縮後的資源. 'components' => [ // ... 'assetManager' => [ 'bundles' => require '/app/assets_compressed.php' ] ] 注意: 你需要手動下載並安裝這些額外的工具.
㈨ php如何清除html格式並去除文字中的空格然後截取文字
PHP清除html、css、js格式並去除空格的PHP函數
01 function cutstr_html($string,$length=0,$ellipsis='…'){
02 $string=strip_tags($string);
03 $string=preg_replace('/\n/is','',$string);
04 $string=preg_replace('/ |/is','',$string);
05 $string=preg_replace('//is','',$string);
06 preg_match_all("/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|\xe0[\xa0-\xbf][\x80-\xbf]|[\xe1-\xef][\x80-\xbf][\x80-\xbf]|\xf0[\x90-\xbf][\x80-\xbf][\x80-\xbf]|[\xf1-\xf7][\x80-\xbf][\x80-\xbf][\x80-\xbf]/",$string,$string);
07 if(is_array($string)&&!empty($string[0])){
08 if(is_numeric($length)&&$length){
09 $string=join('',array_slice($string[0],0,$length)).$ellipsis;
10 }else{
11 $string=implode('',$string[0]);
12 }
13 }else{
14 $string='';
15 }
16 return $string;
17 }
php 去除html標簽 js 和 css樣式
01 function clearHtml($content){
02 $content=preg_replace("/<a[^>]*>/i","",$content);
03 $content=preg_replace("/<\/a>/i","",$content);
04 $content=preg_replace("/<div[^>]*>/i","",$content);
05 $content=preg_replace("/<\/div>/i","",$content);
06 $content=preg_replace("/<!--[^>]*-->/i","",$content);//注釋內容
07 $content=preg_replace("/style=.+?['|\"]/i",'',$content);//去除樣式
08 $content=preg_replace("/class=.+?['|\"]/i",'',$content);//去除樣式
09 $content=preg_replace("/id=.+?['|\"]/i",'',$content);//去除樣式
10 $content=preg_replace("/lang=.+?['|\"]/i",'',$content);//去除樣式
11 $content=preg_replace("/width=.+?['|\"]/i",'',$content);//去除樣式
12 $content=preg_replace("/height=.+?['|\"]/i",'',$content);//去除樣式
13 $content=preg_replace("/border=.+?['|\"]/i",'',$content);//去除樣式
14 $content=preg_replace("/face=.+?['|\"]/i",'',$content);//去除樣式
15 $content=preg_replace("/face=.+?['|\"]/",'',$content);//去除樣式 只允許小寫 正則匹配沒有帶 i 參數
16 return $content;
17 }
㈩ PHP、html代碼如何實現屏蔽用戶使用火狐瀏覽器訪問自己網站
用JAVASCRIPT代碼來判斷對方是否使用的蘆則尺是火狐瀏覽器 在最開始加入下面的代碼 <script type="text/javascript">陪高盯塌 if(isFirefox=navigator.userAgent.indexOf("Firefox")>0){ location.href="跳轉頁面" } </script>
滿意請採納