整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          從Java程序員的視角看JavaScript

          們無(wú)法在一篇博文里解釋 JavaScript 的所有細(xì)節(jié)。如果你正或多或少地涉及了 web 應(yīng)用程序開(kāi)發(fā),那么,我們的 Java 工具和技術(shù)范圍報(bào)告揭示了,大多數(shù)(71%)Java 開(kāi)發(fā)者被歸到了這一類,只是你對(duì) JavaScript 遇到了阻礙。

          毫無(wú)疑問(wèn),你已經(jīng)知道了 Java 和 JavaScript,不管它們有著多么類似的命名,彼此沒(méi)有共享太多共通之處。Java 的靜態(tài)類型、符合直接規(guī)律的簡(jiǎn)單語(yǔ)法和冗長(zhǎng),與 JavaScript 的動(dòng)態(tài)、缺乏一致性原則和怪異,有著巨大的不同。

          然而,JavaScript 是 web 的編程語(yǔ)言,最近由于 Node.js 和 JVM 自己的 Nashorn JavaScript 引擎的發(fā)展,在服務(wù)器端獲得了相當(dāng)?shù)淖⒁狻?/p>

          本文,我不想只是漫談 JavaScript 的好與不好,或重復(fù)任何人都能免費(fèi)找到的、不計(jì)其數(shù)的 JavaScript 教程。我想列出一些有助于理解 JavaScript 做為一種語(yǔ)言的技術(shù)點(diǎn),并從接近 horse的角度來(lái)理解。

          我們將在本文包含下列語(yǔ)言級(jí)別的技術(shù)點(diǎn):

          • JavaScript 的通用性
          • JavaScript 的函數(shù)編程問(wèn)題
          • 不同于 Java 的繼承

          另外,你會(huì)找到一些工具方面的推薦,沒(méi)有這些工具,你是不想著手 JavaScript 項(xiàng)目的,包含了構(gòu)建系統(tǒng)的代碼質(zhì)量分析和測(cè)試框架方面的工具。

          優(yōu)點(diǎn)

          編寫一次,差不多處處運(yùn)行!

          毋庸置疑 JavaScript 是 web 編程語(yǔ)言,是很多其它語(yǔ)言的編譯目標(biāo),也是用來(lái)證明有時(shí)候人們只是想擁有更多自由時(shí)間的終極方式。盡管如此,這不是一件壞事。每一臺(tái)能夠?yàn)g覽現(xiàn)代網(wǎng)站的電腦都裝備了具有性能和可用的 JavaScript 引擎。最重要的是,JavaScript 代碼可以在后端運(yùn)行。

          內(nèi)置到我們喜愛(ài)的 JVM 的、輕量級(jí)高性能 JavaScript 運(yùn)行時(shí) Nashorn,完全能夠解釋 JavaScript 腳本,還能夠解釋項(xiàng)目中帶有 Java 代碼的 JavaScript 腳本。

          鑒于每臺(tái)電腦運(yùn)行時(shí)都可獲得的自由,JavaScript 成為 Java 體驗(yàn)的完美延續(xù)。

          函數(shù)式編程:一等公民是函數(shù),而不是遞歸

          JavaScript 中的函數(shù)是第一類公民,它們是值,可被存儲(chǔ)在變量里、傳遞給其它函數(shù)、在適當(dāng)?shù)臅r(shí)候再執(zhí)行。

          這打開(kāi)了函數(shù)式編程世界的大門,這是結(jié)構(gòu)化 JavaScript 編程的完美方式。

          注意,JavaScript 里的對(duì)象是任何東西的映射,對(duì)象的每個(gè)特性(attribute)都在同一個(gè)映射里:函數(shù)、屬性(property)、構(gòu)造器;易變性帶來(lái)了更大的隱患,而對(duì)于 Java,你至少能夠確保方法和字段結(jié)構(gòu)在某種程度上是穩(wěn)定的。

          反過(guò)來(lái),這使得函數(shù)式編程更加有利:涉及到小的、可理解函數(shù)和不變的數(shù)據(jù)結(jié)構(gòu)是在 JavaScript 里運(yùn)行的方式。

          這不是沒(méi)有依據(jù)的,下面是在 JavaScript 里定義一個(gè) reduce 函數(shù)的例子,來(lái)自于《Eloquent JavaScript》一書。

          function forEach (array, action) {
          for (var i = 0; i < array.length; i++) {
          action (array[i]); //apply action to every element of the arra. }
          } 
          function reduce (combine, base, array) {
          forEach (array, function (element) {
          base = combine (base, element); // and here we apply function passed as ‘combine’ parameter to ‘base’ and ‘element’ });
          return base;
          }
          function add (a, b) { // btw, this is how you define a function in JavaScript return a + b;
          }
          function sum (numbers) {
          return reduce (add, 0, numbers);
          }
          

          注意:我們沒(méi)有在這里使用 reduce 的遞歸版本。JavaScript 沒(méi)有以尾調(diào)用【注1】為特色,這意味著每個(gè)函數(shù)的遞歸版本都將用到棧的深度,和 Java 一樣,如果你遞歸太深,程序就崩潰。

          繼承:就像真實(shí)的世界

          JavaScript 的繼承是基于原型的。即,你沒(méi)有擴(kuò)展了其它類型的類型,而實(shí)際上,你擁有的實(shí)例從其它實(shí)例繼承了功能。

          想象一下,對(duì)象A就像一個(gè)映射,我們剛才稍微提到了一些、但是用了不同的視角,然后另一個(gè)類似映射的對(duì)象B從A繼承了一切。

          這說(shuō)明B可以訪問(wèn)A所有部分:A的方法、字段等等。

          在實(shí)踐中,我從來(lái)沒(méi)有看到有人實(shí)際使用簡(jiǎn)單的基于原型的繼承。通常當(dāng)某人需要繼承時(shí),他只是構(gòu)造類,因此你可以用到所有廣泛的技能,和基于類的繼承的工作模式。

          ——Rene Saarsoo,XRebel 前端工程師

          我不太確定 Java 開(kāi)發(fā)者應(yīng)該從中吸取什么,但是要當(dāng)心繼承方式的不同,對(duì)于父級(jí)對(duì)象要格外留意、而不要意外地改變整個(gè)程序的行為。

          任何時(shí)候要避免的

          列出不可靠的 JavaScript 設(shè)計(jì)上的決定比想象中要容易。在 JavaScript 程序中要避免的最明顯的地方就是全局變量的聲明

          注意,在 JavaScript 里,無(wú)論什么時(shí)候,不使用 var 關(guān)鍵詞定義變量,那么定義的變量被推到了它們被定義的作用域頂端。這意味著,每個(gè)用這種方式定義的變量將跑到全局范圍頂部,這會(huì)引發(fā)沖突以及你和同事不可預(yù)期的頭痛。

          可以開(kāi)啟 strict 模式。只需在腳本文件頂部寫上“use strict”,那么不經(jīng)意編寫的全局變量聲明將顯示錯(cuò)誤。

          JavaScript 與 Java 另一個(gè)重要的不同點(diǎn)在于,前者是動(dòng)態(tài)類型語(yǔ)言,其真諦是所有東西都可以是任何類型。這很明顯了,實(shí)在不能再?gòu)?qiáng)調(diào)了:不要針對(duì)不同類型的值,去復(fù)用相同的變量

          跟蹤剛開(kāi)始是個(gè) string 類型的變量,但是現(xiàn)在它成了浮點(diǎn)數(shù)、或者函數(shù)了,相信我!

          還有,我不想太深入類型和布爾值的討論,但是要警惕 JavaScript 引擎扔給你的隱式類型轉(zhuǎn)換。

          搞定工作的小提示

          正如我上面提到的,在編程上要更加注意這種語(yǔ)言的語(yǔ)法和怪癖,而不僅僅是知道。項(xiàng)目很少由于語(yǔ)言的不足而失敗,更多的失敗是與總體項(xiàng)目框架不足有關(guān)。下面是有助于你交付項(xiàng)目的一些工具。

          靜態(tài)代碼分析

          大部分項(xiàng)目是不同的,其復(fù)雜度和需求導(dǎo)致了大量的細(xì)節(jié),你該如何著手代碼庫(kù)呢。盡管如此,在所有地方都有一致性的目標(biāo),那就是代碼質(zhì)量

          是的,代碼質(zhì)量,對(duì)于任何開(kāi)發(fā)者來(lái)說(shuō),最重要的工作就是交付。但是不要在質(zhì)量上妥協(xié),不要對(duì)你提交的代碼感到不自信就不情愿與同事分享。

          幸運(yùn)的是,JavaScript 有一套得體的解決方案——JSHint。JSHint 是為 JavaScript 量身打造的靜態(tài)分析工具,與應(yīng)用于 Java 代碼的 FindBug 類似。JSHint 可以在你的代碼庫(kù)運(yùn)行,并高亮出可疑的或有問(wèn)題的地方,即使你不會(huì)馬上產(chǎn)生 bug,但這些地方將來(lái)變得難以維護(hù)。在項(xiàng)目中支持它相當(dāng)簡(jiǎn)單。幫自己一個(gè)忙——如果你在寫 JavaScript 代碼,就用 JSHint 讓它更安全、少一些尷尬。

          REPL

          REPL 代表“讀取-求值-輸出”循環(huán)(Read-Eval-Print Loop)【注2】,是很多動(dòng)態(tài)語(yǔ)言的強(qiáng)大工具。如果你看過(guò) Scala 或 Groovy,你一定能夠理解這個(gè)概念。

          激活 JavaScript REPL 的一種途徑是打開(kāi)瀏覽器的控制臺(tái),它產(chǎn)生了對(duì) JavaScript 代碼求值的界面。

          另一個(gè)比較方便的工具是 jjs,它捆綁在 JDK1.8。

          它是命令行工具,允許你訪問(wèn) JDK 中的 Nashorn JavaScript 引擎,完全有能力執(zhí)行那些甚至最為嚴(yán)格的 JavaScript 腳本。

          測(cè)試

          對(duì)于任何一個(gè)項(xiàng)目,你都想運(yùn)行一些測(cè)試。測(cè)試對(duì)于動(dòng)態(tài)類型的語(yǔ)言尤為重要,最好選擇一種測(cè)試框架。我推薦 Jasmine,它是用于測(cè)試 JavaScript 的行為驅(qū)動(dòng)開(kāi)發(fā)框架。

          在 Jasmine,你用 describe 描述測(cè)試套件,它阻止了你想測(cè)試的代碼訪問(wèn)。在測(cè)試中的代碼完成后,你 expect 一些結(jié)果。

          很明顯這里不是要給出教程,但是我想讓你一瞥 JavaScript 代碼看起來(lái)是多么地優(yōu)雅。Jasmine 是 JavaScript 項(xiàng)目最好的實(shí)踐之一,我們私下在產(chǎn)品開(kāi)發(fā)中應(yīng)用到了 ZeroTurnaround 項(xiàng)目,尤其是對(duì)于富含 JavaScript 的不間斷運(yùn)行的交互分析器 XRebel。

          構(gòu)建工具

          最后,你的項(xiàng)目將需要的、比較重要的是構(gòu)建工具。如果你在 Java 項(xiàng)目中使用 JavaScript,請(qǐng)確保你可以避開(kāi) Java 構(gòu)建工具,這就差不多足夠了。但是,對(duì)于獨(dú)立的 JavaScript 項(xiàng)目,沒(méi)有必要引入龐然大物—Maven【注3】。

          可以考慮的 JavaScript 項(xiàng)目用到的構(gòu)建工具是 GulpJS【注4】。它是基于插件的構(gòu)建系統(tǒng),你可以為其指定任務(wù)。任務(wù)可以是“拷貝 src 目錄下的 .js 文件到 dest”、或“壓縮我的 JavaScript 代碼用于生產(chǎn)環(huán)境”。讓人受到震動(dòng)的是,GulpJS 把任務(wù)相關(guān)的文件流加入過(guò)濾器,因此你可以把上面的兩個(gè)任務(wù)加入一次有效的清掃中。

          還有大量的可用插件,借助適當(dāng)?shù)臉?gòu)建系統(tǒng),你將發(fā)現(xiàn)項(xiàng)目中的協(xié)作會(huì)輕松很多。

          結(jié)論

          我們只是看到了 JavaScript 的冰山一角,并盡量介紹一些 Java 開(kāi)發(fā)者在解決 JavaScript 時(shí)應(yīng)該知道的概念和工具。自然地,這里沒(méi)有提供要學(xué)習(xí)的完整的技術(shù)清單,但是如果你正準(zhǔn)備義無(wú)反顧地深入 JavaScript 項(xiàng)目,這會(huì)幫助你起步,擁抱 JavaScript 的怪癖將有助于你不會(huì)頻繁地沮喪。

          你了解讓 JS 開(kāi)發(fā)者走向快樂(lè)的秘密或最佳實(shí)踐嗎?毫無(wú)疑問(wèn)應(yīng)該去分享!在下面評(píng)論或在 Twitter:@shelajev 上與我交談。我樂(lè)于聽(tīng)到你的想法!

          • 注1:在計(jì)算機(jī)科學(xué)里,尾調(diào)用是指一個(gè)函數(shù)里的最后一個(gè)動(dòng)作是一個(gè)函數(shù)調(diào)用的情形:即這個(gè)調(diào)用的返回值直接被當(dāng)前函數(shù)返回的情形。這種情形下稱該調(diào)用位置為尾位置。若這個(gè)函數(shù)在尾位置調(diào)用本身(或是一個(gè)尾調(diào)用本身的其他函數(shù)等等),則稱這種情況為尾遞歸,是遞歸的一種特殊情形。尾調(diào)用不一定是遞歸調(diào)用,但是尾遞歸特別有用,也比較容易實(shí)現(xiàn)。
          • 注2:REPL 是一個(gè)簡(jiǎn)單的,交互式的編程環(huán)境。這個(gè)詞常常用于指代一個(gè) Lisp 的交互式開(kāi)發(fā)環(huán)境,但也能指代命令行的模式和例如 APL, BASIC, Clojure, F#, Haskell, J, Julia, Perl, PHP, Prolog, Python, R, Ruby, Scala, Smalltalk, Standard ML, Tcl, Javascript 這樣的編程語(yǔ)言所擁有的類似的編程環(huán)境。這也被稱做交互式頂層構(gòu)件(interactive toplevel)。
          • 注3:Maven 除了以程序構(gòu)建能力為特色之外,還提供 Ant 所缺少的高級(jí)項(xiàng)目管理工具。由于 Maven 的缺省構(gòu)建規(guī)則有較高的可重用性,所以常常用兩三行 Maven 構(gòu)建腳本就可以構(gòu)建簡(jiǎn)單的項(xiàng)目,而使用 Ant 則需要十幾行。事實(shí)上,由于 Maven 的面向項(xiàng)目的方法,許多 Apache Jakarta 項(xiàng)目現(xiàn)在使用 Maven,而且公司項(xiàng)目采用 Maven 的比例在持續(xù)增長(zhǎng)。
          • 注4:從頭編寫 HTMLCSSJavascript 是上個(gè)世紀(jì)的事情了,如今的 JavaScript 都是通過(guò) CoffeeScript 這樣的支持句法縮寫的編輯器寫成的。如果你希望寫完 JavaScript 能夠一個(gè)工具完成代碼清理優(yōu)化工作,Gulp 就是你的不二之選,GulpJS 類似 Ant 或 Maven 之于 Java。

          作者:前端小攻略

          原文:https://my.oschina.net/u/3972188/blog/2999914

          術(shù)語(yǔ)

          略。基本可以從wikipedia上找到解釋。

          http://kylin.incubator.apache.org/docs/gettingstarted/terminology.html

          1 架構(gòu)簡(jiǎn)介

          在介紹Kylin的各種操作之前,首先讓我們來(lái)了解一下Kylin的總體設(shè)計(jì),包括其架構(gòu)、工作流程、和數(shù)據(jù)模型。

          1.1 架構(gòu)

          Kylin目前是一個(gè)MOLAP系統(tǒng),也就是基于對(duì)Cube進(jìn)行預(yù)計(jì)算來(lái)滿足低延遲的查詢處理。Kylin的數(shù)據(jù)源就是Hive上的表,以星型模式存在。Kylin的離線計(jì)算過(guò)程(下圖中藍(lán)色箭頭的數(shù)據(jù)流)會(huì)讀取Hive中的原始數(shù)據(jù),將事實(shí)表和維表join起來(lái),然后對(duì)各種維度組合(cuboid)進(jìn)行計(jì)算。計(jì)算后的cube以key-value的形式存儲(chǔ)在HBase中。

          對(duì)于SQL請(qǐng)求,Kylin的查詢引擎會(huì)判斷SQL能否由HBase中的cube滿足。如果可以,查詢就會(huì)轉(zhuǎn)換為HBase的range scan操作,直接獲得結(jié)果數(shù)據(jù),因此能做到秒級(jí)的響應(yīng)。對(duì)于無(wú)法由cube實(shí)現(xiàn)的查詢,Kylin可以將查詢路由給Hive執(zhí)行,不過(guò)當(dāng)前版本由于性能原因,disable了路由查詢的功能。

          1.2 工作流程

          使用Kylin的工作流程如下圖所示。

          首先,RD創(chuàng)建一個(gè)Kylin的項(xiàng)目。一個(gè)項(xiàng)目中可以定義多個(gè)Cube。

          然后,RD需要告訴Kylin需要訪問(wèn)Hive上的哪些表,即「加載Hive表」。注意這里Kylin只會(huì)從Hive Metastore同步表的元信息,并不會(huì)讀取表的數(shù)據(jù)。

          之后就是最主要的「Cube建模」過(guò)程。這一步就是定義Cube的元信息,包括Data Model(指定事實(shí)表與維表,以及他們的連接方式)和Cube Model(有哪些維度和度量,如何增量刷新,以及聚集組和rowkey這些高級(jí)設(shè)置)。

          建模完成之后,RD就可以出發(fā)「Cube構(gòu)建」的動(dòng)作了。Kylin提供了Cube構(gòu)建管理的REST API,因此Cube的構(gòu)建是可以與現(xiàn)有的調(diào)度系統(tǒng)集成的。

          Cube構(gòu)建成功之后,數(shù)據(jù)分析師就可以進(jìn)行查詢啦,例如進(jìn)行常見(jiàn)的上卷下鉆操作。下一小節(jié)會(huì)提到,Kylin中的Cube對(duì)分析師是透明的,分析師還是對(duì)Hive中的星型模式查詢,這是Kylin區(qū)別于其他方案(例如生產(chǎn)aggr表和summary表)的主要特征。

          1.3 數(shù)據(jù)模型

          在Kylin系統(tǒng)內(nèi),不同角色人員看到的數(shù)據(jù)模型是不同的。下圖說(shuō)明了其中的區(qū)別。

          • 對(duì)于終端用戶(即數(shù)據(jù)分析師),其看到的數(shù)據(jù)是在Hive中以星型模式組織起來(lái)的表,并且使用SQL對(duì)這些表進(jìn)行分析。這些表可能在使用Kylin之前就存在于數(shù)據(jù)倉(cāng)庫(kù)之中了,也就是說(shuō),Kylin對(duì)于終端用戶應(yīng)該是“透明”的。但是在實(shí)際場(chǎng)景里,由于Hive和Kylin在SQL語(yǔ)法以及支持的查詢類型等方面的區(qū)別,目前Kylin還無(wú)法做到完全的透明。不過(guò)Kylin在設(shè)計(jì)中是有「查詢路由」模塊的,該模塊會(huì)把無(wú)法重寫到HBase的查詢路由給Hive執(zhí)行,從而實(shí)現(xiàn)真正的透明。
          • 對(duì)于Cube建模人員,其任務(wù)是建立從Hive源表到HBase KV模型的映射。因此Cube建模人員接觸的數(shù)據(jù)模型主要是Cube的元信息,包括標(biāo)識(shí)事實(shí)表和維表、標(biāo)識(shí)維度屬性和度量屬性(Aggregation)、以及定義HBase的rowkey等。
          • 最后,對(duì)于系統(tǒng)管理員,其面對(duì)的主要是物理數(shù)據(jù)模型,即存儲(chǔ)系統(tǒng)的KV模型。

          2 Cube建模

          關(guān)于Cube建模的步驟和操作方式,目前官方教程已經(jīng)比較全面了,故不再贅述。請(qǐng)讀者自行閱讀。

          http://kylin.incubator.apache.org/docs/tutorial/create_cube.html

          .本文為公測(cè)版,一旦發(fā)現(xiàn)有任何錯(cuò)誤內(nèi)容,會(huì)立即進(jìn)行修復(fù),請(qǐng)持續(xù)關(guān)注本站。

          2.本文在正式版之前會(huì)不斷的邀請(qǐng)各路黑客大手進(jìn)行評(píng)價(jià)測(cè)試,歡迎提出異議。

          本文僅針對(duì)網(wǎng)站部分,本文會(huì)對(duì)typecho,wordpress進(jìn)行測(cè)試

          如果你root端口為22,并且密碼是123456,就沒(méi)必要往下看了。

          網(wǎng)站環(huán)境為linux tengine/nginx mariaDB,同理,apache也有相關(guān)設(shè)置,百度實(shí)驗(yàn)下即可。

          **本文會(huì)闡述以下部分

          1.基礎(chǔ)權(quán)限控制

          2.執(zhí)行目錄限制

          3.PHP的限制

          4.webshell寫入與執(zhí)行

          5.權(quán)限細(xì)分,必須寫入的目錄**

          1.基礎(chǔ)權(quán)限控制

          什么叫基礎(chǔ)權(quán)限?在LNMP架構(gòu)下,nginx+php-fpm架構(gòu)需要什么權(quán)限?

          這里我們先來(lái)看一下默認(rèn)權(quán)限

          默認(rèn)我們的nginx運(yùn)行用戶是nginx,而php-fpm的默認(rèn)用戶是apache,默認(rèn)用戶安全嗎?

          看一下webshell

          uid=48(apache) gid=48(apache) groups=48(apache)

          很明顯,我們的默認(rèn)用戶是apache

          我們使用shell新建一個(gè)目錄,很明顯,我們是無(wú)法建立文件夾的

          mkdir: cannot create directory `1': Permission denied

          在網(wǎng)上很多教程會(huì)告訴我們,吧nginx和phpfpm改成同樣的用戶,我們看看會(huì)發(fā)生什么。

          [root@gov 1]# sudo -u nginx mkdir 1

          [root@gov 1]# ll

          total 4

          drwxr-xr-x 2 nginx nginx 4096 Aug 19 18:08 1

          沒(méi)錯(cuò),這是一項(xiàng)愚蠢的決定!

          所以默認(rèn)權(quán)限是安全的嗎?并不是,你忘了上傳目錄,我們看下上傳目錄的權(quán)限

          drwxrwx--- 3 nginx apache 4096 Aug 14 17:09 uploads

          沒(méi)錯(cuò),上傳目錄的存在就是放大權(quán)限,如果php沒(méi)有寫入權(quán)限,那么他就無(wú)法上傳圖片。

          假設(shè),我們手里有一個(gè)0day,現(xiàn)在我要用它來(lái)getshell

          我會(huì)選擇uploads目錄

          -rw-r--r-- 1 apache apache 0 Aug 19 18:11 1.php

          完美寫入,接著你的站就會(huì)被玩壞了,寫入shell后我們可以插件數(shù)據(jù)庫(kù)鏈接密碼,進(jìn)網(wǎng)站后臺(tái),脫褲,掛黑鏈等等等等

          網(wǎng)站里有幾個(gè)目錄是默認(rèn)可以寫入的?在你的網(wǎng)站目錄下執(zhí)行l(wèi)s -l

          通常plugins themes uploads 這三個(gè)目錄都是可以寫入的。

          你還有其他目錄可以寫入?趕緊修改權(quán)限吧!

          加入我們的網(wǎng)站在/var/www/html/root

          那么下面的命令是極好的,對(duì)于必須要有上傳權(quán)限的uploads目錄,我們下面再說(shuō)

          chown -R nginx.apache html

          find /var/www/html/root -type d -exec chmod 750 {} \;

          find /var/www/html/root -not -type d -exec chmod 640 {} \;

          chmod 770 /var/www/html/root/uploads -R

          如果你有某些插件也需要寫入權(quán)限,給他權(quán)限,并認(rèn)真看下面的內(nèi)容。

          2.執(zhí)行目錄限制

          我們的apache權(quán)限有多大呢?相同的網(wǎng)站擁有相同的權(quán)限。

          默認(rèn)情況下,我們的apache權(quán)限能瀏覽大部分目錄。最要命的問(wèn)題在于,他可以跨站執(zhí)行,從你的網(wǎng)站一直接執(zhí)行到網(wǎng)站二。

          我們需要給他一個(gè)限制,每個(gè)虛擬主機(jī)一個(gè)單獨(dú)的限制,沒(méi)錯(cuò)就是open_basedir。

          這里我們需要特別的技巧,每個(gè)虛擬機(jī)都要限制

          這樣虛擬主機(jī)將只允許在網(wǎng)站目錄和tmp目錄執(zhí)行,而不能穿越到其他目錄

          在烏云有一篇討論繞過(guò)open_basedir的文章,所以open_basedir只能讓你更安全而不是徹底安全,所以你還需要往下看。

          server {

          location ~ .*\.php(\/.*)*$ {

          #include pathinfo.conf;

          fastcgi_pass 127.0.0.1:9000;

          fastcgi_index index.php;

          fastcgi_param PHP_VALUE "open_basedir=$document_root:/tmp/";

          3.PHP的限制

          我們想一個(gè)另類解決辦法,如何限制webshell的執(zhí)行?

          在php.ini里,我們可以選擇關(guān)閉某些不安全的函數(shù)

          但是由于php這玩意分之多又復(fù)雜,這里只能整理出一部分不安全的函數(shù)。

          直接添加到php.ini最后面即可

          disable_functions=exec,system,passthru,shell_exec,escapeshellarg,escapeshellcmd,proc_close,proc_open,ini_alter,dl,popen,pcntl_exec,socket_accept,socket_bind,socket_clear_error,socket_close,socket_connect,socket_create_listen,socket_create_pair,socket_create,socket_get_option,socket_getpeername,socket_getsockname,socket_last_error,socket_listen,socket_read,socket_recv,socket_recvfrom,socket_select,socket_send,socket_sendto,socket_set_block,socket_set_nonblock,socket_set_option,socket_shutdown,socket_strerror,socket_write,stream_socket_server,disk_total_space,disk_free_space,diskfreespace,getrusage,get_current_user,getmyuid,getmypid,dl,leak,listen,chgrp,link,symlink,dlopen,proc_nice,proc_get_stats,proc_terminate,shell_exec,sh2_exec,posix_getpwuid,posix_getgrgid,posix_kill,ini_restore,mkfifo,dbmopen,dbase_open,filepro,filepro_rowcount,posix_mkfifo,putenv,sleep,chmod,chown,chroot,ini_set,phpinfo,proc_get_status,error_log,syslog,readlink,putenv

          在看webshell,我們會(huì)發(fā)現(xiàn)里面空空如也了,并不能執(zhí)行命令了。

          4.webshell寫入與執(zhí)行

          現(xiàn)在我們的網(wǎng)站已經(jīng)很安全了,他能否更加安全?

          現(xiàn)在,我們就要說(shuō)說(shuō)我們必須要有執(zhí)行權(quán)限的upload目錄了,nginx同樣提供了解決方案

          location ~ /(usr/uploads)/.*\.(php|php5)?$

          {

          deny all;

          }

          這個(gè)時(shí)候我們打開(kāi)uploads中的php文件會(huì)提示403

          403 Forbidden

          You don't have permission to access the URL on this server. Sorry for the inconvenience.

          我們的效果得到驗(yàn)證,即使寫入也不能執(zhí)行。

          5.必須要寫入權(quán)限但是又包含php文件的目錄。

          例如我的用的郵件通知插件目錄內(nèi)有cache和和log目錄,是必須有寫入權(quán)限的

          這里千萬(wàn)不要犯懶,直接給CommentToMail寫入

          location ~ /(usr/uploads|usr/plugins/CommentToMail/cache|usr/plugins/CommentToMail/log)/.*\.(php|php5)?$

          {

          deny all;

          }

          既可以實(shí)現(xiàn)寫入文件,又可以讓php無(wú)法執(zhí)行。

          總結(jié),上面的所有配置:

          用戶與PHP運(yùn)行權(quán)限分離

          nginx:apache

          執(zhí)行目錄限制

          open_basedir

          PHP函數(shù)限制

          php.ini

          特殊目錄關(guān)閉PHP解析

          deny all

          權(quán)限細(xì)分

          xx|xx|xx

          歡迎拍磚,同時(shí) 起司靶場(chǎng)v2 上線,完全脫離安全鎖之類的軟件,歡迎測(cè)試。

          起司靶場(chǎng)v2


          主站蜘蛛池模板: 人妻AV中文字幕一区二区三区| 国产激情无码一区二区app| 国产一区二区三区在线2021| 人妻AV中文字幕一区二区三区| 精品视频一区二区三区四区| 成人精品一区久久久久| 亚洲制服丝袜一区二区三区| 欧美日韩一区二区成人午夜电影| 免费一区二区三区四区五区| 久久高清一区二区三区| 蜜桃视频一区二区三区| 亚洲第一区视频在线观看| 色狠狠一区二区三区香蕉蜜桃| 中文字幕日韩精品一区二区三区| 亚洲男人的天堂一区二区| 久久er99热精品一区二区 | 后入内射国产一区二区| 一夲道无码人妻精品一区二区| 国产在线观看一区二区三区四区| 久久精品国产一区| 又硬又粗又大一区二区三区视频| 国产福利一区二区精品秒拍| 亚洲AV一区二区三区四区| 久久精品黄AA片一区二区三区 | 在线观看国产一区二三区| 久久免费精品一区二区| 一区二区国产在线播放| 一区二区三区免费视频观看| 国产三级一区二区三区 | 国产免费一区二区三区不卡 | 国产av一区二区三区日韩| 亚洲一区在线观看视频| 欧美日本精品一区二区三区| 欧美日韩一区二区成人午夜电影 | 国产主播一区二区| 国产一区二区三区精品视频| 久久se精品一区二区| 97精品一区二区视频在线观看| 伊人色综合一区二区三区影院视频| 亚洲精品无码一区二区| 亚洲AV无码一区二区三区久久精品 |