思維新建站官網:www.inspinovation.cn
文|何掌柜
對于很多 web 應用來說,簡單地轉義 HTML 是不夠的。 你可能想完全去除任何HTML,或者允許一小部分子集的 HTML 存在。 若是如此,則使用 HTML Purifier 庫。
HTML Purifier 是一個經過充分測試但效率比較低的庫。 這就是為什么如果你的需求并不復雜就應使用htmlentities(), 因為它的效率要快得多。
HTML Purifier 相比 strip_tags() 是有優勢的, 因為它在凈化 HTML 之前會對其校驗。 這意味著如果用戶輸入無效 HTML,HTML Purifier 相比 strip_tags() 更能保留 HTML 的原意。 HTML Purifier 高度可定制,允許你為 HTML 的一個子集建立白名單來允許這個 HTML 子集的實體存在輸出中。
但其缺點就是相當的慢,它要求一些設置,在一個共享主機的環境里可能是不可行的。 其文檔通常也復雜而不易理解。 以下示例是一個基本的使用配置。 查看文檔閱讀 HTML Purifier 提供的更多更高級的特性。
示例
// Include the HTML Purifier library
require_once('htmlpurifier-4.4.0/HTMLPurifier.auto.php');
// Oh no! The user has submitted malicious HTML, and we have to display it in our web app!
$evilHtml = '
Mua-ha-ha! Twiddling my evil mustache...
';
// Set up the HTML Purifier object with the default configuration.
$purifier = new HTMLPurifier(HTMLPurifier_Config::createDefault());
$safeHtml = $purifier->purify($evilHtml);
// $safeHtml is now sanitized. You can output $safeHtml to your users without fear!
?>
陷阱
以錯誤的字符編碼使用 htmlentities() 會造成意想不到的輸出。 在調用該函數時始終確認指定了一種字符編碼,并且該編碼與將被凈化的字符串的編碼相匹配。 更多細節請查看 UTF-8 一節。
使用 htmlentities() 時,始終包含 ENT_QUOTES 和字符編碼參數。 默認情況下,htmlentities() 不會對單引號編碼。多愚蠢的默認做法!
HTML Purifier 對于復雜的 HTML 效率極其的低。可以考慮設置一個緩存方案如APC來保存經過凈化的結果以備后用。
因思維新專注于高端網站訂制開發,不僅僅為您建設網站,還為您做網絡營銷。
于工作需要,有幾個nginx配置的需求,在這里整理記錄一下。
1. 屏蔽請求方式,僅允許POST、GET等
當有非我們允許的請求方式訪問站點時,定義返回403狀態碼,示例配置如下:
if ($request_method !~ ^(GET|POST)$ )
{
return 403;
}
2. 定義錯誤頁
有時候我們訪問到不存在的頁面或報錯,如403/404/502/503/504/405等,再或者500這種程序錯誤時,出于安全和用戶友好度的考慮,希望能夠跳轉到統一的錯誤頁等。可以添加如下示例配置:
error_page 404 403 502 503 /error.html
location = /error.html {
root html;
}
這里前提是要自己寫好一個錯誤頁面,放到指定的nginx服務器目錄里。
3. 屏蔽指定url
比如一臺nginx提供的多個server_name共用靜態資源時,但又有資源僅僅想讓某個server_name訪問到;又比如程序寫的不夠合理,當生產環境跑起來時發現有些地址不應該提供到互聯網訪問;再或者我們想通過nginx屏蔽掉一些惡意的訪問如特殊字符,都可以使用下面示例配置進行指定url的屏蔽跳轉到錯誤頁:
if ( $request_uri ~* "\.\.;|test1234|home/test\.do" ){
rewrite xxxxxxxxx; #或return指定錯誤碼
}
作用域可以是server,也可以是location。上面寫法使用正則匹配包含以上字符串的url,根據使用場景調整,轉義使用\,多個字符串之間用|分隔。
4. 屏蔽指定IP地址
比如我們的服務部署后只想指定IP地址可以訪問或指定的IP不可訪問時,可以使用下面示例配置強制跳轉到錯誤頁面。
if ($http_x_forwarded_for !~ ^(192.168.3.100|123.123.123.123|222.222.222.222)) {
return 403; #或 rewrite指定頁面
}
作用域可以是server,也可以是location。
5. 比較奇葩的需求
我這里有一個服務test對互聯網開放訪問,但是其中比如地址 /test/admin.jsp 和 /test/config.jsp 又只想讓指定的幾個人訪問到其他人不允許訪問,這里我將上面的3和4組合起來使用了,配置示例如下:
location /test {
set $flag 0;
if ( $request_uri ~* "admin\.jsp|config\.jsp" ) {
set $flag "${flag}1";
}
if ($http_x_forwarded_for !~ ^(192.168.3.100|123.123.123.123|222.222.222.222)) {
set $flag "${flag}2";
}
if ( $flag = "012" ){
return 403;
}
proxy_pass xxxxxxxxxxxxxxxxx;
proxy_set_header xxxxxxxxxxxxxxx;
.......................
}
本來想if如果是真的話flag=flag+1, 不過隨手寫了寫,發現寫不對,就換這種比較熟悉的字符串拼接的方式了,殊途同歸;
flag初始為1,如果訪問到指定的url則會變成01, 如果訪問到url的卻又不是我們白名單允許的IP,flag會變成012,最后對flag做下判斷如過時“012”則拒絕訪問。
寫在最后:
如有錯誤請評論告知,多多包涵。
也可以點擊以下鏈接關注我的CSDN,謝謝
使用Nginx配置文件屏蔽指定請求_馮大仙的博客-CSDN博客
TML 規范的開發是一個漸進的過程,有時會出現問題。隨著時間的推移,許多元素和屬性被添加到 HTML 中,直到后來 Web 社區集體意識到有更好的方法時才被刪除。由于已棄用和過時的元素和屬性已經存在于網絡上,因此許多現代瀏覽器繼續支持它們的使用。盡管它們可能仍然有效,但您應該始終遵循最新版本的要求 HTML。不能保證瀏覽器對過時和棄用元素的支持會持續下去。有效但執行不A力。
有幾種 HTML 元素和屬性是有效的并且應該被使用,但是這些特性的實現隨著時間的推移而發生了變化,而 Web 開發社區的一些人還沒有注意到。HTMLtables就是一個很好的例子。table在某一時刻,使用 HTML元素創建網頁布局是很常見的。幾乎沒有人再這樣做了,CSS 比tables以往任何時候都更強大。但是,即使是經驗豐富的 Web 開發人員,也存在許多其他不太嚴重的誤用和語法錯誤。以下是一些經常被誤用得完全有效且有用的 HTML 功能以及正確實現的示例。
雖然在技術上不是 HTML 元素,但DOCTYPE聲明應該是每個 HTML 文檔中出現的第一件事。這個聲明是瀏覽器文檔中代碼的語言。過去,這個聲明包括幾個部分,可能會有點復雜。然而,在 HTML5 中,這很簡單:
使用該聲明開始每個人 HTML 文檔,Web 瀏覽器將準確地知道您要說什么。
Web 瀏覽器必須知道用于編寫文檔的字符集才能正確呈現它。在絕大多數情況下,要聲明的正確字符集是UTF-8。如果您需要聲明其他任何內容,很可能您已經知道并知道如何去做。如果您不確定,請堅持使用 UTF-8 是一個安全的選擇。在 HTML5 中聲明字符集比在以前的 HTML 版本中要簡單得多。這是現代 HTML5 中聲明的正確語法:
只需將該行放到head您的 HTML 文檔中即可。
過去,通常使用meta標簽來提供版權信息。但是,這不是處理此任務的正確方法,并且網絡爬蟲無法識別標簽的這種標簽外使用meta。識別版權的正確方法是使用HTML 文檔link中的元素,如下所示:head
您還可以在錨點和區域元素上使用rel="license"屬性值對。
在過去,通常使用如下語法將腳本添加到 HTML 文檔中:
這是有充分理由的。在某一時刻,許多瀏覽器無法識別script標簽,并試圖將標簽之間的內容呈現為 HTML,從而導致它們以純文本形式顯示腳本。為了避免這個問題,開發人員會注釋掉文本,這樣它就不會被不受支持的瀏覽器呈現為 HTML。那些日子已經離我們很遠了。所有現代瀏覽器都支持該script標簽。只需完全刪除 HTML 注釋括號,或者更好的是,將 JavaScript 編寫在單獨的文件中,然后使用script標記將其導入到當前的 HTML 文檔中,如下所示:
還有不少元素曾經是 HTML 規范的一部分,但后來被棄用或廢棄。以下是您可能仍在使用的八個 HTML 元素,您應該立即停止使用它們以及您可以使用的替代標簽:
有許多元素和屬性曾經是 HTML 的一部分,但執行的任務更適合 CSS。這些元素已經被棄用,取而代之的是讓 CSS 控制網頁呈現。
曾經使用 HTML 元素(如font、basefont、center、strike和u. 這些元素都已被棄用,取而代之的是 CSS 提供的字體和排版控件。要了解更多信息,請查看我們的字體和網頁排版教程。一個從未真正流行起來的獨特標簽是multicol。此標簽可用于將文本分成多列,類似于報紙的外觀。現在可以使用 CSScolumns屬性在現代瀏覽器中創建類似但更強大的效果。
廣泛的 HTML 元素屬性曾經可用于控制 HTML 元素的呈現。幾乎所有這些標簽都已被棄用,現在 CSS 提供了相同的功能。如果您不熟悉 CSS 以及如何實現這些屬性,我們的 CSS 教程將幫助您立即開始使用層疊樣式表。下面是一些更常用的屬性和現在可以用來實現相同結果的 CSS 屬性。
在本文中,我們介紹了一些最常見的元素和屬性,這些元素和屬性使用不當或已被棄用或過時。然而,我們真的只是觸及了冰山一角。如果您想了解已從 HTML 規范中刪除的所有 HTML 元素和屬性,請參閱以下資源:
*請認真填寫需求信息,我們會在24小時內與您取得聯系。