如何保護(hù)網(wǎng)站的安全-網(wǎng)上總結(jié)到一起的蒜绽,自己又加了點(diǎn)

當(dāng)開發(fā)一個互聯(lián)網(wǎng)服務(wù)的時候镶骗,必須時刻牢記安全觀念,并在開發(fā)的代碼中體現(xiàn)躲雅。PHP腳本語言對安全問題并不關(guān)心鼎姊,特別是對大多數(shù)沒有經(jīng)驗(yàn)的開發(fā)者來說。每當(dāng)你講任何涉及到錢財事務(wù)等交易問題時相赁,需要特別注意安全問題的考慮相寇,例如開發(fā)一個論壇或者是一個購物車等。

安全保護(hù)一般性要點(diǎn)

不相信表單

對于一般的Javascript前臺驗(yàn)證钮科,由于無法得知用戶的行為唤衫,例如關(guān)閉了瀏覽器的javascript引擎,這樣通過POST惡意數(shù)據(jù)到服務(wù)器绵脯。需要在服務(wù)器端進(jìn)行驗(yàn)證佳励,對每個php腳本驗(yàn)證傳遞到的數(shù)據(jù),防止XSS攻擊和SQL注入

不相信用戶

要假設(shè)你的網(wǎng)站接收的每一條數(shù)據(jù)都是存在惡意代碼的蛆挫,存在隱藏的威脅赃承,要對每一條數(shù)據(jù)都進(jìn)行清理

關(guān)閉全局變量

在php.ini文件中進(jìn)行以下配置:

register_globals = Off

如果這個配置選項(xiàng)打開之后,會出現(xiàn)很大的安全隱患悴侵。例如有一個process.php的腳本文件楣导,會將接收到的數(shù)據(jù)插入到數(shù)據(jù)庫,接收用戶輸入數(shù)據(jù)的表單可能如下:

<input name="username" type="text" size="15" maxlength="64">

這樣畜挨,當(dāng)提交數(shù)據(jù)到process.php之后筒繁,php會注冊一個$username變量噩凹,將這個變量數(shù)據(jù)提交到process.php,同時對于任何POST或GET請求參數(shù)毡咏,都會設(shè)置這樣的變量驮宴。如果不是顯示進(jìn)行初始化那么就會出現(xiàn)下面的問題:

<?php

? ? // Define $authorized = true only if user is authenticated

? ? if (authenticated_user()) {

? ? $authorized = true;

? ? }

? ? ?>

此處,假設(shè)authenticated_user函數(shù)就是判斷$authorized變量的值呕缭,如果開啟了register_globals配置堵泽,那么任何用戶都可以發(fā)送一個請求,來設(shè)置$authorized變量的值為任意值從而就能繞過這個驗(yàn)證恢总。

所有的這些提交數(shù)據(jù)都應(yīng)該通過PHP預(yù)定義內(nèi)置的全局?jǐn)?shù)組來獲取迎罗,包括$_POST、$_GET片仿、$_FILES纹安、$_SERVER、$_REQUEST等砂豌,其中$_REQUEST是一個$_GET/$_POST/$_COOKIE三個數(shù)組的聯(lián)合變量厢岂,默認(rèn)的順序是$_COOKIE、$_POST阳距、$_GET塔粒。

推薦的安全配置選項(xiàng)

error_reporting設(shè)置為Off:不要暴露錯誤信息給用戶,開發(fā)的時候可以設(shè)置為ON

safe_mode設(shè)置為Off

register_globals設(shè)置為Off

將以下函數(shù)禁用:system筐摘、exec卒茬、passthru、shell_exec咖熟、proc_open扬虚、popen

open_basedir設(shè)置為 /tmp ,這樣可以讓session信息有存儲權(quán)限球恤,同時設(shè)置單獨(dú)的網(wǎng)站

根目錄

expose_php設(shè)置為Off

allow_url_fopen設(shè)置為Off

allow_url_include設(shè)置為Off

SQL注入攻擊

對于操作數(shù)據(jù)庫的SQL語句,需要特別注意安全性荸镊,因?yàn)橛脩艨赡茌斎胩囟ㄕZ句使得原有的SQL語句改變了功能咽斧。類似下面的例子:

$sql = "select * from pinfo where product = '$product'";

此時如果用戶輸入的$product參數(shù)為:

39'; DROP pinfo; SELECT 'FOO

那么最終SQL語句就變成了如下的樣子:

select product from pinfo where product = '39'; DROP pinfo; SELECT 'FOO'

這樣就會變成三條SQL語句,會造成pinfo表被刪除躬存,這樣會造成嚴(yán)重的后果张惹。

這個問題可以簡單的使用PHP的內(nèi)置函數(shù)解決:

$sql = 'Select * from pinfo where product = '"'

mysql_real_escape_string($product) . '"';

好處是防止了sql的注入,壞處是此函數(shù)需要進(jìn)行數(shù)據(jù)庫鏈接岭洲。正確操作應(yīng)該是宛逗,比如說哈,我技術(shù)一般盾剩,我就用了最笨的方法 雷激,自己定義一個方法替蔬,把常見的需要過濾的字段屬性封裝到一個函數(shù)里,例如這里哈:

?functionfilter_value_for_sql($str){

??$str= str_replace("and","",$str);

??$str= str_replace("execute","",$str);

??$str= str_replace("update","",$str);

??$str= str_replace("count","",$str);

??$str= str_replace("chr","",$str);

??$str= str_replace("mid","",$str);

??$str= str_replace("master","",$str);

??$str= str_replace("truncate","",$str);

??$str= str_replace("char","",$str);

??$str= str_replace("declare","",$str);

??$str= str_replace("select","",$str);

??$str= str_replace("create","",$str);

??$str= str_replace("delete","",$str);

??$str= str_replace("insert","",$str);

??$str= str_replace("'","",$str);

??$str= str_replace('"',"",$str);

??$str= str_replace(" ","",$str);

??$str= str_replace("or","",$str);

??$str= str_replace("=","",$str);

??$str= str_replace(" ","",$str);

??return$str;

?}

感覺目前也就這些吧 反正我做目前的電商系統(tǒng) 用這些進(jìn)行過濾是夠的屎暇,當(dāng)然我們的系統(tǒng)用的是yii承桥,通過model自帶的驗(yàn)證規(guī)則就能過濾,你的框架要是沒有驗(yàn)證規(guī)則根悼,改改我這個也行哈凶异。

防止SQL注入攻擊需要做好兩件事:

對輸入的參數(shù)總是進(jìn)行類型驗(yàn)證

對單引號、雙引號挤巡、反引號等特殊字符總是使用mysql_real_escape_string函數(shù)進(jìn)行轉(zhuǎn)義(不過最近的開發(fā)當(dāng)中發(fā)現(xiàn)從PHP5.4之后開始就不太適用了剩彬,第一是因?yàn)榇撕瘮?shù)每次執(zhí)行都要先進(jìn)行數(shù)據(jù)庫鏈接,默認(rèn)連接的是本服務(wù)器上的數(shù)據(jù)庫矿卑,如果數(shù)據(jù)庫和項(xiàng)目在2個單獨(dú)的服務(wù)器上喉恋,此處比報錯,提示數(shù)據(jù)庫鏈接失敺嗾瀑晒;還有個原因此函數(shù)5.5開始已經(jīng)報廢棄錯誤,請更換其他函數(shù)徘意。建議的話采用參數(shù)提交的方式進(jìn)行驗(yàn)證苔悦,或者如果使用框架建議通過model層的正則或者自定義的驗(yàn)證規(guī)則進(jìn)行驗(yàn)證后提交)

但是,這里根據(jù)開發(fā)經(jīng)驗(yàn)椎咧,不要開啟php的Magic Quotes玖详,這個特性在php6中已經(jīng)廢除,總是自己在需要的時候進(jìn)行轉(zhuǎn)義勤讽。

防止基本的XSS攻擊

XSS攻擊不像其他攻擊蟋座,這種攻擊在客戶端進(jìn)行,最基本的XSS工具就是防止一段javascript腳本在用戶待提交的表單頁面脚牍,將用戶提交的數(shù)據(jù)和cookie偷取過來向臀。

XSS工具比SQL注入更加難以防護(hù),各大公司網(wǎng)站都被XSS攻擊過诸狭,雖然這種攻擊與php語言無關(guān)券膀,但可以使用php來篩選用戶數(shù)據(jù)達(dá)到保護(hù)用戶數(shù)據(jù)的目的,這里主要使用的是對用戶的數(shù)據(jù)進(jìn)行過濾驯遇,一般過濾掉HTML標(biāo)簽芹彬,特別是a標(biāo)簽。下面是一個普通的過濾方法:

function transform_HTML($string, $length = null) {

? ? // Helps prevent XSS attacks

? ? // Remove dead space.

? ? $string = trim($string);

? ? // Prevent potential Unicode codec problems.

? ? $string = utf8_decode($string);

? ? // HTMLize HTML-specific characters.

? ? $string = htmlentities($string, ENT_NOQUOTES);

? ? $string = str_replace("#", "#", $string);

? ? $string = str_replace("%", "%", $string);

? ? $length = intval($length);

? ? if ($length > 0) {

? ? $string = substr($string, 0, $length);

? ? }

? ? return $string;

? ? }

這個函數(shù)將HTML的特殊字符轉(zhuǎn)換為了HTML實(shí)體叉庐,瀏覽器在渲染這段文本的時候以純文本形式顯示舒帮。如bold會被顯示為:

BoldText

上述函數(shù)的核心就是htmlentities函數(shù),這個函數(shù)將html特殊標(biāo)簽轉(zhuǎn)換為html實(shí)體字符,這樣可以過濾大部分的XSS攻擊玩郊。

但是對于有經(jīng)驗(yàn)的XSS攻擊者肢执,有更加巧妙的辦法進(jìn)行攻擊:將他們的惡意代碼使用十六進(jìn)制或者utf-8編碼,而不是普通的ASCII文本瓦宜,例如可以使用下面的方式進(jìn)行:

<a href="http://host/a.php?variable=%22%3e %3c%53%43%52%49%50%54%3e%44%6f%73%6f%6d%

65%74%68%69%6e%67%6d%61%6c%69%63%69%6f%75%73%3c%2f%53%43%52%49%50%54%3e">

這樣瀏覽器渲染的結(jié)果其實(shí)是:

<a href="http://host/a.php?variable="> <SCRIPT>Dosomethingmalicious</SCRIPT>

這樣就達(dá)到了攻擊的目的蔚万。為了防止這種情況,需要在transform_HTML函數(shù)的基礎(chǔ)上再將#和%轉(zhuǎn)換為他們對應(yīng)的實(shí)體符號临庇,同時加上了$length參數(shù)來限制提交的數(shù)據(jù)的最大長度反璃。

使用SafeHTML防止XSS攻擊

上述關(guān)于XSS攻擊的防護(hù)非常簡單,但是不包含用戶的所有標(biāo)記假夺,同時有上百種繞過過濾函數(shù)提交javascript代碼的方法淮蜈,也沒有辦法能完全阻止這個情況。

目前已卷,沒有一個單一的腳本能保證不被攻擊突破梧田,但是總有相對來說防護(hù)程度更好的。一共有兩個安全防護(hù)的方式:白名單和黑名單侧蘸。其中白名單更加簡單和有效裁眯。

一種白名單解決方案就是SafeHTML,它足夠智能能夠識別有效的HTML讳癌,然后就可以去除任何危險的標(biāo)簽穿稳。這個需要基于HTMLSax包來進(jìn)行解析。

安裝使用SafeHTML的方法:

1晌坤、前往http://pixel-apes.com/safehtml/?page=safehtml 下載最新的SafeHTML

2逢艘、將文件放入服務(wù)器的classes 目錄,這個目錄包含所有的SafeHTML和HTMLSax庫

3骤菠、在自己的腳本中包含SafeHTML類文件

4它改、建立一個SafeHTML對象

5、使用parse方法進(jìn)行過濾

<?php

? ? /* If you're storing the HTMLSax3.php in the /classes directory, along

? ? with the safehtml.php script, define XML_HTMLSAX3 as a null string. */

? ? define(XML_HTMLSAX3, '');

? ? // Include the class file.

? ? require_once('classes/safehtml.php');

? ? // Define some sample bad code.

? ? $data = "This data would raise an alert <script>alert('XSS Attack')</script>";

? ? // Create a safehtml object.

? ? $safehtml = new safehtml();

? ? // Parse and sanitize the data.

? ? $safe_data = $safehtml->parse($data);

? ? // Display result.

? ? echo 'The sanitized data is <br />' . $safe_data;

? ? ?>

SafeHTML并不能完全防止XSS攻擊商乎,只是一個相對復(fù)雜的腳本來檢驗(yàn)的方式央拖。

使用單向HASH加密方式來保護(hù)數(shù)據(jù)

單向hash加密保證對每個用戶的密碼都是唯一的,而且不能被破譯的鹉戚,只有最終用戶知道密碼鲜戒,系統(tǒng)也是不知道原始密碼的。這樣的一個好處是在系統(tǒng)被攻擊后攻擊者也無法知道原始密碼數(shù)據(jù)崩瓤。

加密和Hash是不同的兩個過程。與加密不同踩官,Hash是無法被解密的却桶,是單向的;同時兩個不同的字符串可能會得到同一個hash值,并不能保證hash值的唯一性。

MD5函數(shù)處理過的hash值基本不能被破解颖系,但是總是有可能性的嗅剖,而且網(wǎng)上也有MD5的hash字典。

使用mcrypt加密數(shù)據(jù)

MD5 hash函數(shù)可以在可讀的表單中顯示數(shù)據(jù)嘁扼,但是對于存儲用戶的信用卡信息的時候信粮,需要進(jìn)行加密處理后存儲,并且需要之后進(jìn)行解密趁啸。

最好的方法是使用mcrypt模塊强缘,這個模塊包含了超過30中加密方式來保證只有加密者才能解密數(shù)據(jù)。

<?php

? ? $data = "Stuff you want encrypted";

? ? $key = "Secret passphrase used to encrypt your data";

? ? $cipher = "MCRYPT_SERPENT_256";

? ? $mode = "MCRYPT_MODE_CBC";

? ? function encrypt($data, $key, $cipher, $mode) {

? ? // Encrypt data

? ? return (string)

? ? base64_encode

? ? (

? ? mcrypt_encrypt

? ? (

? ? $cipher,

? ? substr(md5($key),0,mcrypt_get_key_size($cipher, $mode)),

? ? $data,

? ? $mode,

? ? substr(md5($key),0,mcrypt_get_block_size($cipher, $mode))

? ? )

? ? );

? ? }

? ? function decrypt($data, $key, $cipher, $mode) {

? ? // Decrypt data

? ? return (string)

? ? mcrypt_decrypt

? ? (

? ? $cipher,

? ? substr(md5($key),0,mcrypt_get_key_size($cipher, $mode)),

? ? base64_decode($data),

? ? $mode,

? ? substr(md5($key),0,mcrypt_get_block_size($cipher, $mode))

? ? );

? ? }

? ? ?>

mcrypt函數(shù)需要以下信息:

1不傅、待加密數(shù)據(jù)

2旅掂、用來加密和解密數(shù)據(jù)的key

3、用戶選擇的加密數(shù)據(jù)的特定算法(cipher:如 MCRYPT_TWOFISH192,MCRYPT_SERPENT_256访娶,MCRYPT_RC2, MCRYPT_DES, and MCRYPT_LOKI97)

4商虐、用來加密的模式

5、加密的種子崖疤,用來起始加密過程的數(shù)據(jù)秘车,是一個額外的二進(jìn)制數(shù)據(jù)用來初始化加密算法

6、加密key和種子的長度劫哼,使用mcrypt_get_key_size函數(shù)和mcrypt_get_block_size函數(shù)可以獲取

如果數(shù)據(jù)和key都被盜取叮趴,那么攻擊者可以遍歷ciphers尋找開行的方式即可,因此我們需要將加密的key進(jìn)行MD5一次后保證安全性沦偎。同時由于mcrypt函數(shù)返回的加密數(shù)據(jù)是一個二進(jìn)制數(shù)據(jù)疫向,這樣保存到數(shù)據(jù)庫字段中會引起其他錯誤,使用了base64encode將這些數(shù)據(jù)轉(zhuǎn)換為了十六進(jìn)制數(shù)方便保存豪嚎。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末搔驼,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子侈询,更是在濱河造成了極大的恐慌舌涨,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扔字,死亡現(xiàn)場離奇詭異囊嘉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)革为,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門扭粱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人震檩,你說我怎么就攤上這事琢蛤◎讯椋” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵博其,是天一觀的道長套才。 經(jīng)常有香客問我,道長慕淡,這世上最難降的妖魔是什么背伴? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮峰髓,結(jié)果婚禮上傻寂,老公的妹妹穿的比我還像新娘。我一直安慰自己儿普,他們只是感情好崎逃,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著眉孩,像睡著了一般个绍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上浪汪,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天巴柿,我揣著相機(jī)與錄音,去河邊找鬼死遭。 笑死广恢,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的呀潭。 我是一名探鬼主播钉迷,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼钠署!你這毒婦竟也來了糠聪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤谐鼎,失蹤者是張志新(化名)和其女友劉穎舰蟆,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體狸棍,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡身害,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了草戈。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片塌鸯。...
    茶點(diǎn)故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖唐片,靈堂內(nèi)的尸體忽然破棺而出丙猬,到底是詐尸還是另有隱情丢习,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布淮悼,位于F島的核電站,受9級特大地震影響揽思,放射性物質(zhì)發(fā)生泄漏袜腥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一钉汗、第九天 我趴在偏房一處隱蔽的房頂上張望羹令。 院中可真熱鬧,春花似錦损痰、人聲如沸福侈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肪凛。三九已至,卻和暖如春辽社,著一層夾襖步出監(jiān)牢的瞬間伟墙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工滴铅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留戳葵,地道東北人。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓汉匙,卻偏偏與公主長得像拱烁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子噩翠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容

  • XXXphp給了開發(fā)者極大的靈活性戏自,但是這也為安全問題帶來了潛在的隱患,近期需要總結(jié)一下以往的問題绎秒,在這里借翻譯一...
    柏樹_Jeff閱讀 332評論 0 2
  • 數(shù)據(jù)加密在我們生活中的地位已經(jīng)越來越重要了浦妄,尤其是考慮到在網(wǎng)絡(luò)上發(fā)生的大量 交易和傳輸?shù)拇罅繑?shù)據(jù)。如果對于采用安全...
    無崖老師閱讀 815評論 1 1
  • sql注入防御 最好兩者結(jié)合使用!再有见芹! 一定要預(yù)處理剂娄,一定要預(yù)處理,一定要預(yù)處理玄呛! xss攻擊防御 使用Saf...
    每天都是幸運(yùn)的一天閱讀 457評論 0 0
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5阅懦? 答:HTML5是最新的HTML標(biāo)準(zhǔn)。 注意:講述HT...
    kismetajun閱讀 27,486評論 1 45
  • 今天的隨筆話題想說一下感恩惯吕,真的,也是我發(fā)自肺腑的心聲怕午! 一日為師終身為父废登! 為什么要說這句話呢,...
    李錦康閱讀 321評論 2 2