首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PHP:用于将web form/app包装在服务器的shell脚本中的包/模板

PHP:用于将web form/app包装在服务器的shell脚本中的包/模板
EN

Stack Overflow用户
提问于 2018-08-19 05:53:47
回答 1查看 27关注 0票数 0

我想提供简单的公共web/访问带有许多标志的shell脚本。用户通过浏览器输入对应于参数的字段,或者只是编写一个GET请求。当它们提交时,PHP清理该输入,并使用这些参数调用system或exec作为我的脚本,并在标记中返回输出丑陋的样式。

我已经知道如何以业余的方式做这件事,但我对PHP还不是很了解,因为它在安全性方面有很糟糕的名声。当时有一百万个陷阱。最重要的是,我知道让用户直接访问shell可能是一个巨大的安全风险。尽管如此,如果不是PHP安全方面的专家就直接编写这个应用程序,感觉有点轻率。

幸运的是,使用PHP为shell脚本编写API似乎是一项非常常见的任务,知道自己在做什么的人已经做对了。在最好的情况下,我可以从他们的代码中工作,并感到安全。但我显然没有在谷歌上搜索正确的关键字,因为我找不到任何适合的关键字。有什么关于包/模板/示例的建议可以利用吗?

重复搜索

我已经找到了this,但它似乎大多说“是的,它是有风险的”。它没有提供太多的风险核算,也没有提供安全地执行这个非常一般的任务的模板代码。当然,这确实让我意识到我的问题的范围是巨大的。假设我的脚本没有可以使其停止的参数组合,并且不会写入磁盘,只会写入屏幕。除非你另外告诉我,否则我最担心的是减轻恶意输入和人们以某种方式使用不安全的PHP全局变量来做我从未想过的令人费解的可怕事情。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-19 06:10:30

只要您的脚本控制它接收和处理的参数,并且可能对可能导致shell脚本出现问题的参数执行一些健全性检查,并且您避开了收到的参数,那么您就应该是非常安全的。

示例PHP脚本:

代码语言:javascript
复制
<?php

$path_to_executable = '/bin/ls';

$command = [];
$command[] = escapeshellarg($path_to_executable);

if (isset($_GET['arg1'])) {
    if ($_GET['arg1'] > 1000) {
        echo "Error: Please don't specify an 'arg1' higher than 1000.";
        exit(1);
    }
}

$supported_args = ['arg1', 'arg2', 'arg3'];
foreach ($supported_args as $arg) {
    if (isset($_GET[$arg])) {
        $command[] = "--$arg " . escapeshellarg($_GET[$arg]);
    }
}

$command = implode($command, ' ');
echo "Executing $command ...\n";
exec($command . " 2>&1", $result, $return_val);
echo "Returned value: $return_val\n";
echo "Result: " . implode("\n", $result);

示例用法:

代码语言:javascript
复制
$ curl 'http://localhost:3000/51912835.php?arg1=test&arg3=patate&arg4=no'
Executing '/bin/ls' --arg1 'test' --arg3 'patate' ...
Returned value: 2
Result: /bin/ls: unrecognized option '--arg1'
Try '/bin/ls --help' for more information.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51912835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档