不用擔心這個問題,只要盡力避免對閉包內(nèi)變量重新賦值,一般不會,閉包里面一般都返回函數(shù),很少是單純變量
創(chuàng)新互聯(lián)公司是專業(yè)的順城網(wǎng)站建設(shè)公司,順城接單;提供網(wǎng)站設(shè)計制作、做網(wǎng)站,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進行順城網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
一、SQL注入漏洞
SQL 注入攻擊( SQL Injection ),簡稱注入攻擊、SQL注入,被廣泛用于非法獲取網(wǎng)站控制權(quán),是發(fā)生在應(yīng)用程序的數(shù)據(jù)庫層上的安全漏洞。在設(shè)計程序,忽略了對輸入字符串中夾帶的SQL指令的檢查,被數(shù)據(jù)庫誤認為是正常的SQL指令而運行,從而使數(shù)據(jù)庫受到攻擊,可能導致數(shù)據(jù)被竊取、更改、刪除,以及進一步導致網(wǎng)站被嵌入惡意代碼、被植入后門程序等危害。
通常情況下, SQL 注入的位置包括:
(1)表單提交,主要是POST 請求,也包括GET 請求;
(2)URL 參數(shù)提交,主要為GET 請求參數(shù);
(3)Cookie 參數(shù)提交;
(4)HTTP 請求頭部的一些可修改的值,比如Referer 、User_Agent 等;
(5)一些邊緣的輸入點,比如.mp3 文件的一些文件信息等。
SQL注入的危害不僅體現(xiàn)在數(shù)據(jù)庫層面上, 還有可能危及承載數(shù)據(jù)庫的操作系統(tǒng);如果SQL 注入被用來掛馬,還可能用來傳播惡意軟件等,這些危害包括但不局限于:
(1)數(shù)據(jù)庫信息泄漏:數(shù)據(jù)庫中存放的用戶的隱私信息的泄露。作為數(shù)據(jù)的存儲中心,數(shù)據(jù)庫里往往保存著各類的隱私信息, SQL 注入攻擊能導致這些隱私信息透明于攻擊者。
(2)網(wǎng)頁篡改:通過操作數(shù)據(jù)庫對特定網(wǎng)頁進行篡改。
(3)網(wǎng)站被掛馬,傳播惡意軟件:修改數(shù)據(jù)庫一些字段的值,嵌入網(wǎng)馬鏈接,進行掛馬攻擊。
(4)數(shù)據(jù)庫被惡意操作:數(shù)據(jù)庫服務(wù)器被攻擊,數(shù)據(jù)庫的系統(tǒng)管理員帳戶被篡改。
(5)服務(wù)器被遠程控制,被安裝后門。經(jīng)由數(shù)據(jù)庫服務(wù)器提供的操作系統(tǒng)支持,讓黑客得以修改或控制操作系統(tǒng)。
(6)破壞硬盤數(shù)據(jù),癱瘓全系統(tǒng)。
二、跨站腳本漏洞
跨站腳本攻擊(Cross-site scripting,通常簡稱為XSS)發(fā)生在客戶端,可被用于進行竊取隱私、釣魚欺騙、竊取密碼、傳播惡意代碼等攻擊。
XSS攻擊使用到的技術(shù)主要為HTML和Javascript,也包括VBScript和ActionScript等。XSS攻擊對WEB服務(wù)器雖無直接危害,但是它借助網(wǎng)站進行傳播,使網(wǎng)站的使用用戶受到攻擊,導致網(wǎng)站用戶帳號被竊取,從而對網(wǎng)站也產(chǎn)生了較嚴重的危害。
XSS類型包括:
(1)非持久型跨站:即反射型跨站腳本漏洞,是目前最普遍的跨站類型??缯敬a一般存在于鏈接中,請求這樣的鏈接時,跨站代碼經(jīng)過服務(wù)端反射回來,這類跨站的代碼不存儲到服務(wù)端(比如數(shù)據(jù)庫中)。上面章節(jié)所舉的例子就是這類情況。 (2)持久型跨站:這是危害最直接的跨站類型,跨站代碼存儲于服務(wù)端(比如數(shù)據(jù)庫中)。常見情況是某用戶在論壇發(fā)貼,如果論壇沒有過濾用戶輸入的Javascript代碼數(shù)據(jù),就會導致其他瀏覽此貼的用戶的瀏覽器會執(zhí)行發(fā)貼人所嵌入的Javascript代碼。 (3)DOM跨站(DOM XSS):是一種發(fā)生在客戶端DOM(Document Object Model文檔對象模型)中的跨站漏洞,很大原因是因為客戶端腳本處理邏輯導致的安全問題。
三、弱口令漏洞
弱口令(weak password) 沒有嚴格和準確的定義,通常認為容易被別人(他們有可能對你很了解)猜測到或被破解工具破解的口令均為弱口令。設(shè)置密碼通常遵循以下原則:
(1)不使用空口令或系統(tǒng)缺省的口令,這些口令眾所周知,為典型的弱口令。
(2)口令長度不小于8個字符。
(3)口令不應(yīng)該為連續(xù)的某個字符(例如:AAAAAAAA)或重復某些字符的組合(例如:tzf.tzf.)。
(4)口令應(yīng)該為以下四類字符的組合,大寫字母(A-Z)、小寫字母(a-z)、數(shù)字(0-9)和特殊字符。每類字符至少包含一個。如果某類字符只包含一個,那么該字符不應(yīng)為首字符或尾字符。
(5)口令中不應(yīng)包含本人、父母、子女和配偶的姓名和出生日期、紀念日期、登錄名、E-mail地址等等與本人有關(guān)的信息,以及字典中的單詞。
(6)口令不應(yīng)該為用數(shù)字或符號代替某些字母的單詞。
(7)口令應(yīng)該易記且可以快速輸入,防止他人從你身后很容易看到你的輸入。
(8)至少90天內(nèi)更換一次口令,防止未被發(fā)現(xiàn)的入侵者繼續(xù)使用該口令。
四、HTTP報頭追蹤漏洞
HTTP/1.1(RFC2616)規(guī)范定義了HTTP TRACE方法,主要是用于客戶端通過向Web服務(wù)器提交TRACE請求來進行測試或獲得診斷信息。當Web服務(wù)器啟用TRACE時,提交的請求頭會在服務(wù)器響應(yīng)的內(nèi)容(Body)中完整的返回,其中HTTP頭很可能包括Session Token、Cookies或其它認證信息。
攻擊者可以利用此漏洞來欺騙合法用戶并得到他們的私人信息。該漏洞往往與其它方式配合來進行有效攻擊,由于HTTP TRACE請求可以通過客戶瀏覽器腳本發(fā)起(如XMLHttpRequest),并可以通過DOM接口來訪問,因此很容易被攻擊者利用。
五、Struts2遠程命令執(zhí)行漏洞
ApacheStruts是一款建立Java web應(yīng)用程序的開放源代碼架構(gòu)。Apache Struts存在一個輸入過濾錯誤,如果遇到轉(zhuǎn)換錯誤可被利用注入和執(zhí)行任意Java代碼。 網(wǎng)站存在遠程代碼執(zhí)行漏洞的大部分原因是由于網(wǎng)站采用了Apache Struts Xwork作為網(wǎng)站應(yīng)用框架,由于該軟件存在遠程代碼執(zhí)高危漏洞,導致網(wǎng)站面臨安全風險。
六、文件上傳漏洞
文件上傳漏洞通常由于網(wǎng)頁代碼中的文件上傳路徑變量過濾不嚴造成的,如果文件上傳功能實現(xiàn)代碼沒有嚴格限制用戶上傳的文件后綴以及文件類型,攻擊者可通過Web訪問的目錄上傳任意文件,包括網(wǎng)站后門文件( webshell ),進而遠程控制網(wǎng)站服務(wù)器。因此,在開發(fā)網(wǎng)站及應(yīng)用程序過程中,需嚴格限制和校驗上傳的文件,禁止上傳惡意代碼的文件。同時限制相關(guān)目錄的執(zhí)行權(quán)限,防范webshell攻擊。
七、私有IP地址泄露漏洞
IP地址是網(wǎng)絡(luò)用戶的重要標示,是攻擊者進行攻擊前需要了解的。獲取的方法較多,攻擊者也會因不同的網(wǎng)絡(luò)情況采取不同的方法,如:在局域網(wǎng)內(nèi)使用Ping指令, Ping對方在網(wǎng)絡(luò)中的名稱而獲得IP;在Internet上使用IP版的QQ直接顯示。最有效的辦法是截獲并分析對方的網(wǎng)絡(luò)數(shù)據(jù)包。攻擊者可以找到并直接通過軟件解析截獲后的數(shù)據(jù)包的IP 包頭信息,再根據(jù)這些信息了解具體的IP。
針對最有效的“數(shù)據(jù)包分析方法”而言,就可以安裝能夠自動去掉發(fā)送數(shù)據(jù)包包頭IP信息的一些軟件。不過使用這些軟件有些缺點, 譬如:耗費資源嚴重,降低計算機性能;訪問一些論壇或者網(wǎng)站時會受影響;不適合網(wǎng)吧用戶使用等等。
現(xiàn)在的個人用戶采用最普及隱藏IP 的方法應(yīng)該是使用代理,由于使用代理服務(wù)器后,“轉(zhuǎn)址服務(wù)”會對發(fā)送出去的數(shù)據(jù)包有所修改,致使“數(shù)據(jù)包分析”的方法失效。一些容易泄漏用戶IP 的網(wǎng)絡(luò)軟件(QQ 、MSN 、IE 等)都支持使用代理方式連接Internet ,特別是QQ 使用“ ezProxy ”等代理軟件連接后, IP版的QQ都無法顯示該IP地址。雖然代理可以有效地隱藏用戶IP,但攻擊者亦可以繞過代理, 查找到對方的真實IP地址,用戶在何種情況下使用何種方法隱藏IP,也要因情況而論。
八、未加密登錄請求
由于Web 配置不安全, 登陸請求把諸如用戶名和密碼等敏感字段未加密進行傳輸,攻擊者可以竊聽網(wǎng)絡(luò)以劫獲這些敏感信息。
九、敏感信息泄露漏洞
SQL 注入、XSS、目錄遍歷、弱口令等均可導致敏感信息泄露,攻擊者可以通過漏洞獲得敏感信息。
Web應(yīng)用漏洞原理
Web應(yīng)用攻擊是攻擊者通過瀏覽器或攻擊工具,在URL或者其它輸入?yún)^(qū)域(如表單等),向Web服務(wù)器發(fā)送特殊請求,從中發(fā)現(xiàn)Web應(yīng)用程序存在的漏洞,從而進一步操縱和控制網(wǎng)站,查看、修改未授權(quán)的信息。
首先,你需要先更正/準確化對所謂閉包的理解,參見我在這里的回答:
當你明確的理解了閉包之后,再來看你上面這段代碼,就會發(fā)現(xiàn)問題了。
element.onclick?=?function()?{
alert(element.id);
}
這里,element 對象的 onclick 指向了你的匿名函數(shù),所以我們首先可以明確,在 element 對象釋放之前,你這個匿名函數(shù)是肯定釋放不了的了。
問題是 element 對象能在將來某個時刻被釋放嗎?不能!因為你的匿名函數(shù)里又引用了 element 對象!
也就是說,element 對象引用了你的匿名函數(shù),你的匿名函數(shù)又引用了 element。結(jié)果就形成了環(huán)形引用。這就是問題所在。
這么來看,這里就形成了內(nèi)存泄漏。但是再仔細深究,其實也不盡然。因為雖然這里形成了環(huán)形引用,但是現(xiàn)代垃圾回收器其實并不是簡單的只看一個對象的引用計數(shù)是否為0來判斷能不能回收的。而是要看是否存在一條從根對象指向該對象的路徑來判斷的。簡單的來說就是,對于現(xiàn)代垃圾回收器,這種簡單的環(huán)狀引用不會造成內(nèi)存泄漏。
前端開發(fā),熱愛生活
var call = function(x) {
console.log(x++);
setTimeout(function() { call(x); }, 1);
};
call(0);
以這段代碼為例,的確x這個變量會一直存在在內(nèi)存之中,但這么一個變量還不至于讓內(nèi)存達到溢
出。并且可以在chrome Dev Tool中模擬一次垃圾回收結(jié)果:
可以看到j(luò)s heap一直在增加可以看到j(luò)s heap一直在增加
但是console 依然在跑,其實這已經(jīng)算是內(nèi)存泄露了。但是console 依然在跑,其實這已經(jīng)算是內(nèi)存泄露了。
如果內(nèi)存會周期性地按時增長,泄露最終將導致瀏覽器變慢或者停止執(zhí)行腳本。從性能優(yōu)化角度來講已經(jīng)是不得不做的事情了。是想如果循環(huán)執(zhí)行的代碼中包含了一個大數(shù)組new Array(1000000).join('*'),那是非常危險的。
一般setTimeout遞歸是在做輪詢,這會需要給一個結(jié)束條件,執(zhí)行clearTimeout。
1、當頁面中元素被移除或替換時,若元素綁定的事件仍沒被移除,在IE中不會作出恰當處理,此時要先手工移除事件,不然會存在內(nèi)存泄露。
2、對于純粹的 ECMAScript 對象而言,只要沒有其他對象引用對象 a、b,也就是說它們只是相互之間的引用,那么仍然會被垃圾收集系統(tǒng)識別并處理。但是,在 Internet Explorer 中,如果循環(huán)引用中的任何對象是 DOM 節(jié)點或者 ActiveX 對象,垃圾收集系統(tǒng)則不會發(fā)現(xiàn)它們之間的循環(huán)關(guān)系與系統(tǒng)中的其他對象是隔離的并釋放它們。最終它們將被保留在內(nèi)存中,直到瀏覽器關(guān)閉。
3、閉包可以維持函數(shù)內(nèi)局部變量,使其得不到釋放。
4、
a?=?{p:?{x:?1}};
b?=?a.p;delete?a.p;
執(zhí)行這段代碼之后b.x的值依然是1.由于已經(jīng)刪除的屬性引用依然存在,因此在JavaScript的某些實現(xiàn)中,可能因為這種不嚴謹?shù)拇a而造成內(nèi)存泄露。所以在銷毀對象的時候,要遍歷屬性中屬性,依次刪除。
5、一些DOM操作:IE系列的特有問題 簡單的來說就是在向不在DOM樹上的DOM元素appendChild;IE7中,貌似為了改善內(nèi)存泄露,IE7采用了極端的解決方案:離開頁面時回收所有DOM樹上的元素,其它一概不管。
最常見的內(nèi)存泄露源于DOM事件綁定,尤其是帶著事件的dom反復創(chuàng)建、移除的時候,泄露的多少取決與處理函數(shù)的閉包范圍內(nèi)有多少內(nèi)存。常見的避免方法是:
1、不要動態(tài)綁定事件;
2、不要在動態(tài)添加,或者會被動態(tài)移除的dom上綁事件,用事件冒泡在父容器監(jiān)聽事件;
3、如果要違反上面的原則,必須提供destroy方法,保證移除dom后事件也被移除,這點可以參考Backbone的源代碼,做的比較好;
4、單例化,少創(chuàng)建dom,少綁事件。