• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            戰(zhàn)魂小筑

            討論群:309800774 知乎關(guān)注:http://zhihu.com/people/sunicdavy 開源項(xiàng)目:https://github.com/davyxu

               :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              257 隨筆 :: 0 文章 :: 506 評(píng)論 :: 0 Trackbacks

            我們有時(shí)需要限制lua代碼的運(yùn)行環(huán)境,或者是讓使用者不能訪問(wèn)到lua的一些全局函數(shù).lua語(yǔ)言本身沒(méi)有類似于C++, C#, Java那樣的成員訪問(wèn)控制. 但lua提供了setfenv函數(shù)可以很靈活的處理各類權(quán)限問(wèn)題

            廢話不多說(shuō), 看代碼

               1:  -- 創(chuàng)建沙盒
               2:  function SpawnSandBox( )
               3:   
               4:      local SandBoxGlobals = {}
               5:      
               6:      -- 基礎(chǔ)函數(shù)添加
               7:      SandBoxGlobals.print             = print
               8:      SandBoxGlobals.table             = table
               9:      SandBoxGlobals.string             = string     
              10:      SandBoxGlobals.math               = math 
              11:      SandBoxGlobals.assert             = assert 
              12:      SandBoxGlobals.getmetatable    = getmetatable 
              13:      SandBoxGlobals.ipairs             = ipairs 
              14:      SandBoxGlobals.pairs             = pairs 
              15:      SandBoxGlobals.pcall             = pcall 
              16:      SandBoxGlobals.setmetatable    = setmetatable 
              17:      SandBoxGlobals.tostring        = tostring 
              18:      SandBoxGlobals.tonumber        = tonumber 
              19:      SandBoxGlobals.type            = type 
              20:      SandBoxGlobals.unpack             = unpack 
              21:      SandBoxGlobals.collectgarbage     = collectgarbage
              22:      SandBoxGlobals._G                = SandBoxGlobals
              23:      
              24:      return SandBoxGlobals
              25:  end
              26:   
              27:  -- 在沙盒內(nèi)執(zhí)行腳本, 出錯(cuò)時(shí)返回錯(cuò)誤, nil表示正確
              28:  function ExecuteInSandBox( SandBox, Script )
              29:      
              30:      local ScriptFunc, CompileError = loadstring( Script )
              31:      
              32:      if CompileError then
              33:          return CompileError
              34:      end
              35:      
              36:      setfenv( ScriptFunc, SandBox )
              37:      
              38:      local Result, RuntimeError = pcall( ScriptFunc )
              39:      if RuntimeError then
              40:          return RuntimeError
              41:      end
              42:      
              43:      return nil
              44:  end
              45:   
              46:  function ProtectedFunction( )
              47:      print("protected func")
              48:  end
              49:   
              50:   
              51:  local SandBox = SpawnSandBox( )
              52:   
              53:   
              54:  print ( "Response=", ExecuteInSandBox( SandBox, "table.foreach( _G, print )" ) )
              55:   
              56:  print ( "Response=", ExecuteInSandBox( SandBox, "ProtectedFunction()" ) )
              57:   
              58:  SandBox.ProtectedFunction = ProtectedFunction
              59:   
              60:  print ( "Response=", ExecuteInSandBox( SandBox, "ProtectedFunction()" ) )

             

            54行執(zhí)行結(jié)果是

             

               1:  _G    table: 00421258
               2:  string    table: 00421050
               3:  pairs    function: 00567F58
               4:  collectgarbage    function: 005675F0
               5:  unpack    function: 004217E8
               6:  assert    function: 005675B0
               7:  print    function: 00567830
               8:  ipairs    function: 00567F28
               9:  type    function: 004217A8
              10:  tonumber    function: 00421768
              11:  tostring    function: 00421788
              12:  table    table: 00420DA8
              13:  math    table: 004210C8
              14:  setmetatable    function: 00421748
              15:  getmetatable    function: 00567710
              16:  pcall    function: 005677F0
              17:  Response=    nil
             
            54行由于沒(méi)有注冊(cè)這個(gè)全局函數(shù), 因此無(wú)法訪問(wèn)
            Response=    [string "ProtectedFunction()"]:1: attempt to call global 'ProtectedFunction' (a nil value)
             
            58行在全局環(huán)境中加上了這個(gè)函數(shù),因此在60行訪問(wèn)正常
            protected func
            Response=    nil
             
            posted on 2012-03-02 09:40 戰(zhàn)魂小筑 閱讀(4221) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 腳本技術(shù)C++/ 編程語(yǔ)言
            一本色道久久88精品综合| 热re99久久精品国产99热| 欧美精品久久久久久久自慰| 日本欧美久久久久免费播放网| 亚洲乱码中文字幕久久孕妇黑人| 国产午夜久久影院| 日韩欧美亚洲综合久久| 国产成人久久精品一区二区三区 | 久久精品国产精品亚洲| 久久无码人妻一区二区三区| 国产精品成人99久久久久| 日产精品久久久一区二区| 狠狠色婷婷久久综合频道日韩| 狠狠色丁香婷婷综合久久来来去| 2021久久精品国产99国产精品| 色综合久久久久综合体桃花网| 久久久久久久久久久| 亚洲中文字幕无码久久2017| 久久天天婷婷五月俺也去| 久久人人爽人人爽人人片AV麻豆 | 无码精品久久久久久人妻中字| 久久激情亚洲精品无码?V| 一本久久免费视频| 欧美亚洲国产精品久久| 国产三级久久久精品麻豆三级| 无码国内精品久久人妻| 久久最新精品国产| 天天躁日日躁狠狠久久| 久久人人爽人人爽人人片AV麻豆 | 久久精品国产亚洲av麻豆色欲| 93精91精品国产综合久久香蕉| 91精品国产91热久久久久福利| 久久夜色精品国产噜噜亚洲a| 精品一区二区久久| 久久精品国产亚洲AV大全| 99精品久久精品一区二区| 久久久久女教师免费一区| 欧美精品一区二区精品久久 | 久久久黄片| 女人高潮久久久叫人喷水| 欧美亚洲国产精品久久高清 |