eval 会对后面的命令进行两遍扫描。如果第一遍扫描后,命令是个普通命令,则执行此命令;如果命令中含有变量的间接引用,则保证间接引用的语义。也就是说,eval 命令将会首先扫描命令行进行所有的置换,然后再执行该命令。
EVAL命令是Redis提供的功能之一,它可以让用户在Redis中执行Lua脚本。
使用空格分隔每个参数,如果参数中含有变量,则替换为变量值,然后再将构造的命令交由 Shell 解释执行。它通常用于动态生成和执行命令,或者将字符串解释为可执行的 Shell 代码。
eval 就是执行以下两个步骤 1.第一次,执行变量替换,类似与C语言的宏替代
对于带有管道或重定向的组合命令最推荐的方式是将其封装到一个函数里,然后在需要时直接调用即可。
要在Redis中创建一个Lua环境,我们需要使用EVAL命令,并提供一个Lua脚本作为参数。Lua脚本可以包含一系列的Lua代码,由Redis执行。EVAL命令将创建一个新的Lua环境,并将脚本加载到该环境中。创建Lua环境可以提高执行脚本的效率,因为避免了每次执行脚本时重新加载的开销。
Lua 是一种轻量小巧的脚本语言,用标准 C 语言编写并以源代码形式开放,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。由于 Lua 语言具备原子性,其在执行的过程中不会被其它程序打断,对于并发下数据的一致性是有帮助的。
1. 执行系统命令: system, passthru, shell_exec, exec, popen, proc_open
Lua 由标准 C 编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译,运行。
Redis2.6加入了对Lua脚本的支持。Lua脚本可以被用来扩展Redis的功能,并提供更好的性能。
Lua脚本特性的出现给Redis带来了很大的变化,其中最重要的就是使得用户可以按需对Redis服务器的功能进行扩展:在Lua脚本特性出现之前,用户如果想要给Redis服务器增加新功能,那么只能自行修改Redis服务器源码,这样做不仅麻烦,还会给Redis服务器带来升级困难、无法与标准Redis服务器兼容等问题,而Lua脚本的出现则为用户提供了一种标准的、无后顾之忧的方法来扩展Redis服务器的功能。
还记得上篇文章记一次拿webshell踩过的坑(如何用PHP编写一个不包含数字和字母的后门),我们讲到了一些PHP的一些如何巧妙地绕过数字和字母受限的技巧,今天我要给大家分享的是如何在命令长度受限的情况下成功get到webshell,以及关于函数参数受限的突破,mysql的一些骚操作技巧~~~
前言 为什么要用lua脚本操作redis数据库? 1.减少开销–减少向redis服务器的请求次数 2.原子操作–redis将lua脚本作为一个原子执行 3.可复用–其他客户端可以使用已经执行过
eval() 函数功能非常强大,它可以接收一个字符串参数,当把一个字符串传递给 eval() 之后,eval() 会把这个字符串当成一个有效的表达式(所谓表达式就是 eval() 会把字符串的引号去掉,然后将中间的内容当成有效的代码)来求值,并返回计算结果:
Redis 脚本使用Lua解释器来执行脚本。Redis 2.6版本通过内嵌支持Lua环境。执行脚本的常用命令为EVAL。
Redis提供了丰富的指令集,但是仍然不能满足所有场景,在一些特定场景下,需要自定义一些指定来完成某些功能。因此,Redis提供了Lua脚本支持,用户可以自己编写脚本来实现想要的功能。
《Redis设计与实现》读书笔记(三十四) ——Redis Lua脚本环境设计与实现 (原创内容,转载请注明来源,谢谢) 一、创建lua环境 为了在redis服务器执行lua脚本,redis服务器内嵌了一个lua环境,redis服务器启动的时候,会自动创建lua环境,步骤如下: 1)创建一个基础lua环境。 调用lua的C API函数lua_open,创建新的lua环境。但是这个是原生的环境,redis会对其进行定制。 2)载入多个lua函数库,以便lua脚本的执行。 包括基础库、表格库、字符串库、数学库
Redis 脚本使用 Lua 解释器来执行脚本。 Redis 2.6 版本通过内嵌支持 Lua 环境。执行脚本的常用命令为 EVAL。
最近学习了PHP命令执行,内容比较多,把自己学到的总结下来,加深理解,水平有限,欢迎大佬斧正。
lua是一种比较轻量的脚本语言,可以嵌入应用程序中,能以较小的代价定制功能。在Redis里,也可以通过使用lua脚本来实现特定的效果。 llua脚本是一个和Redis独立的技术,不仅能用在Redis里,还能用在其他场景中。 l我们先使用docker命令创建redis容器再进入容器内部
Redis在2.6推出了脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行。
未对用户输入进行检查过滤,导致用户输入的参数被应用当成命令来执行。 命令执行漏洞是指应用有时需要调用一些执行系统命令的函数,如:system()、exec()、shell_exec()、eval()、passthru()等函数,代码未对用户可控参数做过滤,当用户能控制这些函数中的参数时,就可以将恶意系统命令拼接到正常命令中,从而造成命令执行攻击。
以下主要翻译自man getopt。 getopt是用来解析传入shell的命令行参数的,它可以支持如 ‘rm -r’ 中’-r’形式的参数解析。
一、引言 Redis学了一段时间了,基本的东西都没问题了。从今天开始讲写一些redis和lua脚本的相关的东西,lua这个脚本是一个好东西,可以运行在任何平台上,也可以嵌入到大多数语言当中,来扩展其功能。lua脚本是用C语言写的,体积很小,运行速度很快,并且每次的执行都是作为一个原子事务来执行的,我们可以在其中做很多的事情。由于篇幅很多,一次无法概述全部,这个系列可能要通过多篇文章的形式来写,好了,今天我们进入正题吧。 二、Lua简介 Lua 是一个小巧的脚本语言。是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo所组成并于1993年开发。 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译,运行。Lua并没有提供强大的库,这是由它的定位决定的。所以Lua不适合作为开发独立应用程序的语言。Lua 有一个同时进行的JIT项目,提供在特定平台上的即时编译功能。 Lua脚本可以很容易的被C/C++ 代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,ini等文件格式,并且更容易理解和维护。 Lua由标准C编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译,运行。一个完整的Lua解释器不过200k,在目前所有脚本引擎中,Lua的速度是最快的。这一切都决定了Lua是作为嵌入式脚本的最佳选择。 三、使用Lua脚本的好处 1、减少网络开销:可以将多个请求通过脚本的形式一次发送,减少网络时延和请求次数。 2、原子性的操作:Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。因此在编写脚本的过程中无需担心会出现竞态条件,无需使用事务。 3、代码复用:客户端发送的脚步会永久存在redis中,这样,其他客户端可以复用这一脚本来完成相同的逻辑。 4、速度快:见 与其它语言的性能比较, 还有一个 JIT编译器可以显著地提高多数任务的性能; 对于那些仍然对性能不满意的人, 可以把关键部分使用C实现, 然后与其集成, 这样还可以享受其它方面的好处。 5、可以移植:只要是有ANSI C 编译器的平台都可以编译,你可以看到它可以在几乎所有的平台上运行:从 Windows 到Linux,同样Mac平台也没问题, 再到移动平台、游戏主机,甚至浏览器也可以完美使用 (翻译成JavaScript). 6、源码小巧:20000行C代码,可以编译进182K的可执行文件,加载快,运行快。 四、redis和lua整合详解 1、调用Lua脚本的语法: $ redis-cli --eval path/to/redis.lua KEYS[1] KEYS[2] , ARGV[1] ARGV[2] ... --eval,告诉redis-cli读取并运行后面的lua脚本 path/to/redis.lua,是lua脚本的位置 KEYS[1] KEYS[2],是要操作的键,可以指定多个,在lua脚本中通过KEYS[1], KEYS[2]获取 ARGV[1] ARGV[2],参数,在lua脚本中通过ARGV[1], ARGV[2]获取。 注意: KEYS和ARGV中间的 ',' 两边的空格,不能省略。
Lua语言提供了如下几种数据类型:booleans(布尔)、numbers(数值)、strings(字符串)、tables(表格)。
最近刚刚学到两个新的命令exec和eval,这两个命令可以在代码中动态执行python脚本。
Lua 是由巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组于1993年开发的一种轻量、小巧的脚本语言,用标准 C 语言编写,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
Redis 是高性能的 KV 内存数据库,除了做缓存中间件的基本作用外还有很多用途,比如胖哥以前分享的Redis GEO 地理位置信息计算。Redis 提供了丰富的命令来供我们使用以实现一些计算。Redis 的单个命令都是原子性的,有时候我们希望能够组合多个 Redis 命令,并让这个组合也能够原子性的执行,甚至可以重复使用。Redis 开发者意识到这种场景还是很普遍的,就在 2.6 版本中引入了一个特性来解决这个问题,这就是 Redis 执行 Lua 脚本。
一句话木马就是只需要一行代码的木马,短短一行代码,就能做到和大马相当的功能。为了绕过waf的检测,一句话木马出现了无数中变形,但本质是不变的:木马的函数执行了我们发送的命令。
前段时间写Redis分布式锁,想着在小灰文章的基础上再总结一下,这样能有更深的印象,顺便把Lua脚本分享一下,如果项目中使用Redis比较多,那么Lua脚本一定是会用到的,因为它简单强大。
Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能
本文主要是分享在实际工作中同事遇到的问题案例;活动组在做活动时,开发人员未考虑到接口并发场景,导致因为一些用户在实际抽奖(土豪一般都是狂抽)过程中对余额产生了增加/减少的操作,导致缓存的余额出现异常;通过我review代码发现,开发者在更新缓存时:先get后set或者incrby,导致并发场景下get的值是一致的,所以缓存异常。
今天讲一些redis和lua脚本的相关的东西,lua这个脚本是一个好东西,可以运行在任何平台上,也可以嵌入到大多数语言当中,来扩展其功能。lua脚本是用C语言写的,体积很小,运行速度很快,并且每次的执行都是作为一个原子事务来执行的,我们可以在其中做很多的事情。由于篇幅很多,一次无法概述全部,这个系列可能要通过多篇文章的形式来写,好了,今天我们进入正题吧。
redis一款高并发的内存K-V数据库,提供了好多命令,但是其中有部分对于生产环境来说比较危险,需要禁用掉。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
要在Lua脚本中实现对Redis数据库的读取和写入操作,可以使用Redis的EVAL命令执行Lua脚本,在脚本中调用Redis的读写操作。
如果页面中存在这些函数并且对于用户的输入没有做严格的过滤,那么就可能造成远程命令执行漏洞
eval是Python的一个内置函数,这个函数的作用是,返回传入字符串的表达式的结果。想象一下变量赋值时,将等号右边的表达式写成字符串的格式,将这个字符串作为eval的参数,eval的返回值就是这个表达式的结果。
有读者问我为什么这么久都没有出Redis Lua中学教程,表示村头厕所已经好久没有纸了。其实我早就要写这篇中学教程了,奈何最近太忙了,就一拖再拖,直到今天我终于又开始动笔了。忘记Lua相关概念的同学可以先回顾一下小学教程。
Redis的实现保证eval的执行是原子的,即使eval执行的lua超时,Redis也不会自动终止执行。
这次我们举得实际一点,还是上篇文章 account 表,假设 id=1,balance=1000,不过这次我们扣款 1000,两个事务的时序图如下:
RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。
eval和exec都是python内置的可以执行python代码的函数,但它们之间有所区别。
命令执行直接调用操作系统命令。其原理是,在操作系统中,“&、|、||”都可以作为命令连接符使用,用户通过浏览器提交执行命令,由于服务器端没有针对执行函数做过滤,将用户的输入作为系统命令的参数拼接到命令行中,在没有过滤用户输入的情况下,造成命令执行漏洞。
2.6版本之后支持嵌入Lua脚本,客户端使用Lua脚本,直接在服务器端原子的执行多条命令
看以下两条命令: [zhangsan@XEN /sys]$ a="ls";b="\$a";c="$b";"$c" Hey! No command '$a' found, did you mean
周末第一次组队和大佬们打比赛,web题只做了一道签到题。之后从11点开始坐牢。后面两道web题很难,都是知识盲区。
2.6版本之后支持嵌入Lua脚本,客户端使用Lua脚本,直接在服务器端原子的执行多条命令 Lua脚本执行过程 创建并修改Lua环境 1 创建基础Lua环境 2 载入函数库 3 创建全局表格Lua 4 替换随机函数 5 创建排序辅助函数 6 创建redis.pcall函数 7 全局环境保护 8 修改后的Lua环境保存到服务器状态的Lua属性,等待脚本执行 Redis中带有不确定性的命令: SINTER SUNION SDIFF SMEMEBERS HKEYS HVALS KEYS 注意: Redis提供
领取专属 10元无门槛券
手把手带您无忧上云