我正在尝试测试 PHP 与 bash shell(版本 4.2)的交互。我的 bash shell 没有针对 shellshock 打补丁(是的,我知道如何打补丁;我正在 VM 中测试;我更专注于 PHP 与 shell 的交互)。
我有一个简单的 PHP 程序,它从查询字符串中获取参数,通过 putenv() 将其添加到环境中,然后使用 system() 运行命令。脚本如下:
<?php
function getParam()
{
$arg = NULL;
if (isset($_GET["arg"]) && !empty($_GET["arg"]))
{
$arg = $_GET["arg"];
}
return $arg;
}
$arg = getParam();
putenv("ARG=$arg");
system("set");
?>
如您所见,system() 使用 set 命令打印 shell 变量。我首先尝试使用以下方法:
curl http://localhost/myphp.php?arg=123
在输出中,我可以看到以下行:
ARG=123
本着 shellshock 的精神,我将我的论点更改如下:
curl http://localhost/myphp.php?arg="()%20%7B%20echo%20hello;%20%7D;"
参数基本设置为:
arg=() { echo hello; };
当我运行脚本时,我没有在 set 的输出中看到 ARG。
但后来我按如下方式更改了 curl 请求:
curl http://localhost/myphp.php?arg="()%20%7B%20echo%20hello;%20%7D;%20echo%20PID:%20;%20echo%20%24%24%20;%20echo%20Set:%20;%20set%20"
这次,参数设置为:
arg=() { echo hello; }; echo PID:; echo $$; echo Set:; set
这一次,我仍然没有在 system() 的输出中看到 ARG,但由于参数如下,我确实看到了额外的输出:
PID:0
Set:
// Omitted some output
ARG ()
{
echo hello
}
所以我的问题是,为什么我看不到 set 中的参数 ARG 通过 system() 输出,而是看到它在 set 输出中通过参数 ?
编辑:
重新表述问题以使其更清楚:在 PHP 代码中,我调用 system(set)(最后一行)VS 我将 set 作为查询的一部分传递字符串。通过 system() 执行的设置不显示 shell 变量中存在 ARG 显示从查询字符串执行的 set(尽管输出 PID为 0 - 所以必须考虑到这一点来解释这一点)。
这是完整的输出:http://pastebin.com/raw.php?i=WcBXgYAj
如果我将 system(set) 更改为 system(env),我会看到输出:http://pastebin.com/raw.php?i=q1r6Z3Zi
最佳答案
代替
arg=() { echo hello; };
试试这个
() { :;};echo Yes we can...
或者这个
%28%29%20%7B%20%3A%3B%7D%3Becho%20Yes%20we%20can...
...或者介于两者之间
你可以尝试追踪一些东西:
(){ :;};dd if=/etc/hostname of=/tmp/testfile-$$-$RANDOM
关于与 Shell 交互时的 PHP 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33880183/
这可能是个愚蠢的问题。但是,我是一个新手......你怎么能在交互式rubyshell中有多行代码?好像你只能有一条长线。按回车键运行代码。无论如何我可以在不运行代码的情况下跳到下一行吗?再次抱歉,如果这是一个愚蠢的问题。谢谢。 最佳答案 这是一个例子:2.1.2:053>a=1=>12.1.2:054>b=2=>22.1.2:055>a+b=>32.1.2:056>ifa>b#Thecode‘if..."startsthedefinitionoftheconditionalstatement.2.1.2:057?>puts"f
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
我从Ubuntu服务器上的RVM转移到rbenv。当我使用RVM时,使用bundle没有问题。转移到rbenv后,我在Jenkins的执行shell中收到“找不到命令”错误。我内爆并删除了RVM,并从~/.bashrc'中删除了所有与RVM相关的行。使用后我仍然收到此错误:rvmimploderm~/.rvm-rfrm~/.rvmrcgeminstallbundlerecho'exportPATH="$HOME/.rbenv/bin:$PATH"'>>~/.bashrcecho'eval"$(rbenvinit-)"'>>~/.bashrc.~/.bashrcrbenvversions
已经有一个问题回答了如何将“America/Los_Angeles”转换为“PacificTime(US&Canada)”。但是我想将“美国/太平洋”和其他过时的时区转换为RailsTimeZone。我无法在图书馆中找到任何可以帮助我完成此任务的东西。 最佳答案 来自RailsActiveSupport::TimeZonedocs:TheversionofTZInfobundledwithActiveSupportonlyincludesthedefinitionsnecessarytosupportthezonesdefinedb
两个gsub产生不同的结果。谁能解释一下为什么?代码也可在https://gist.github.com/franklsf95/6c0f8938f28706b5644d获得.ver=9999str="\tCFBundleDevelopmentRegion\n\ten\n\tCFBundleVersion\n\t0.1.190\n\tAppID\n\t000000000000000"putsstr.gsub/(CFBundleVersion\n\t.*\.).*()/,"#{$1}#{ver}#{$2}"puts'--------'putsstr.gsub/(CFBundleVersio
我在一段非常简单的代码(如我所想)中得到了一个错误的值:org=4caseorgwhenorg=4val='H'endputsval=>nil请不要生气,我希望我错过了一些非常明显的东西,但我真的想不通。谢谢。 最佳答案 这是典型的Ruby错误。case有两种被调用的方法,一种是你传递一个东西作为分支的基础,另一种是你不传递的东西。如果您确实在case中指定了一个表达式语句然后评估所有其他条件并与===进行比较.在这种情况下org评估为false和org===false显然不是真的。所有其他情况也是如此,它们要么是真的,要么是假的。
假设您在Ruby中执行此操作:ar=[1,2]x,y=ar然后,x==1和y==2。是否有一种方法可以在我自己的类中定义,从而产生相同的效果?例如rb=AllYourCode.newx,y=rb到目前为止,对于这样的赋值,我所能做的就是使x==rb和y=nil。Python有这样一个特性:>>>classFoo:...def__iter__(self):...returniter([1,2])...>>>x,y=Foo()>>>x1>>>y2 最佳答案 是的。定义#to_ary。这将使您的对象被视为要分配的数组。irb>o=Obje
我有一个问题。我想从另一个ruby脚本运行一个ruby脚本并捕获它的输出信息,同时让它也输出到屏幕。亚军#!/usr/bin/envrubyprint"Enteryourpassword:"password=gets.chompputs"Hereisyourpassword:#{password}"我运行的脚本文件:开始.rboutput=`runner`putsoutput.match(/Hereisyour(password:.*)/).captures[0].to_s正如您在此处看到的那样,存在问题。在start.rb的第一行,屏幕是空的。我在运行程序中看不到“输入您的密
在几个项目中,我希望有一个类似rakeserver的rake任务,它将通过任何需要的方式开始为该应用程序提供服务。这是一个示例:task:serverdo%x{bundleexecrackup-p1234}end这行得通,但是当我准备停止它时,按Ctrl+c并没有正常关闭;它中断了Rake任务本身,它说rakeaborted!并给出堆栈跟踪。在某些情况下,我必须执行Ctrl+c两次。我可能可以用Signal.trap写一些东西来更优雅地中断它。有没有更简单的方法? 最佳答案 trap('SIGINT'){puts"Yourmessa
我经常将预配置的lambda插入可枚举的方法中,例如“map”、“select”等。但是“注入(inject)”的行为似乎有所不同。例如与mult4=lambda{|item|item*4}然后(5..10).map&mult4给我[20,24,28,32,36,40]但是,如果我制作一个2参数lambda用于像这样的注入(inject),multL=lambda{|product,n|product*n}我想说(5..10).inject(2)&multL因为“inject”有一个可选的单个初始值参数,但这给了我......irb(main):027:0>(5..10).inject