PHP:package/template 用于围绕服务器的 shell 脚本包装 Web form/app
PHP: package/template for wrapping web form/app around a server's shell script
我想提供对带有许多标志的 shell 脚本的简单 public web/GET 访问。用户通过他们的浏览器输入与参数相对应的字段,或者只是编写一个 GET 请求。当他们提交时,PHP 清除该输入并使用这些参数为我的脚本调用系统或 exec,并且 returns 在标签中输出丑陋的样式。
我已经知道如何进行这种业余风格的操作,但我还没有深入研究 PHP,因为它在安全方面的名声很糟糕。那时有一百万个陷阱。
最重要的是,我知道让用户直接访问 shell 可能会带来巨大的安全风险。尽管如此,在没有 PHP 安全方面的专家的情况下继续编写此应用程序感觉有点鲁莽。
幸运的是,使用 PHP 为 shell 脚本编写 API 似乎是一项非常常见的任务,知道自己在做什么的人已经完成了正确的。在最好的情况下,我可以使用他们的代码并感到安全。但我显然不是在谷歌上搜索正确的关键字,因为我找不到合适的关键字。关于 packages/templates/examples 我可以利用的任何建议?
重复搜索
我已经找到了 this,但似乎主要是说 "yes, it's risky"。它没有提供太多的风险计算,也没有提供安全执行这个非常一般的任务的模板代码。当然,它确实让我意识到我的问题范围很大。假设我的脚本没有可以使其停止运行并且不写入磁盘而只写入屏幕的参数组合。除非你另有说明,否则我主要担心减轻恶意输入和人们以某种方式使用不安全的 PHP 全局变量来做我从未想过的难以理解的可怕事情。
只要您的脚本控制它接收和处理的参数,并且可能对可能导致您的 shell 脚本出现问题的参数进行一些健全性检查,并且您转义收到的参数,你应该很安全。
示例 PHP 脚本:
<?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);
用法示例:
$ 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.
我想提供对带有许多标志的 shell 脚本的简单 public web/GET 访问。用户通过他们的浏览器输入与参数相对应的字段,或者只是编写一个 GET 请求。当他们提交时,PHP 清除该输入并使用这些参数为我的脚本调用系统或 exec,并且 returns 在标签中输出丑陋的样式。
我已经知道如何进行这种业余风格的操作,但我还没有深入研究 PHP,因为它在安全方面的名声很糟糕。那时有一百万个陷阱。 最重要的是,我知道让用户直接访问 shell 可能会带来巨大的安全风险。尽管如此,在没有 PHP 安全方面的专家的情况下继续编写此应用程序感觉有点鲁莽。
幸运的是,使用 PHP 为 shell 脚本编写 API 似乎是一项非常常见的任务,知道自己在做什么的人已经完成了正确的。在最好的情况下,我可以使用他们的代码并感到安全。但我显然不是在谷歌上搜索正确的关键字,因为我找不到合适的关键字。关于 packages/templates/examples 我可以利用的任何建议?
重复搜索
我已经找到了 this,但似乎主要是说 "yes, it's risky"。它没有提供太多的风险计算,也没有提供安全执行这个非常一般的任务的模板代码。当然,它确实让我意识到我的问题范围很大。假设我的脚本没有可以使其停止运行并且不写入磁盘而只写入屏幕的参数组合。除非你另有说明,否则我主要担心减轻恶意输入和人们以某种方式使用不安全的 PHP 全局变量来做我从未想过的难以理解的可怕事情。
只要您的脚本控制它接收和处理的参数,并且可能对可能导致您的 shell 脚本出现问题的参数进行一些健全性检查,并且您转义收到的参数,你应该很安全。
示例 PHP 脚本:
<?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);
用法示例:
$ 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.