Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将URL参数作为命令行脚本参数传递安全注意事项

将URL参数作为命令行脚本参数传递安全注意事项
EN

Stack Overflow用户
提问于 2018-07-21 11:32:07
回答 1查看 62关注 0票数 0

我正在编写一个web应用程序,我需要将一些url参数作为命令行参数传递给另一个脚本。我应该做些什么来避免安全问题?我使用Sympfony的进程来执行bash命令,使用Laravel来构建应用程序。

下面是一些代码,查看buildScreenshotCommand以查看我是如何构建命令字符串的,还要注意,$urlRequest是使用Laravel的Request $request类填充的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php

namespace App\Logic;

use App\Logic\TimeHelper;
use App\UrlRequest;
use Illuminate\Support\Facades\Storage;
use Symfony\Component\Process\Exception\ProcessFailedException;
use Symfony\Component\Process\Process;

class Screenshot {

    static function take(UrlRequest $urlRequest)
    {
        $name = self::generateName($urlRequest);
        $command = self::buildScreenshotCommand($name, $urlRequest);

        $startTime = TimeHelper::milliseconds();

        $process = new Process($command);
        $process->run();

        $endTime = TimeHelper::milliseconds();

        if (!$process->isSuccessful())
        {
            throw new ProcessFailedException($process);
        }

        $output = $process->getOutput();

        if (trim($output) === '')
        {
            $urlRequest->successful = 1;

            $file = self::uploadToS3($name);
            $urlRequest->image_url = $file['url'];
            $urlRequest->file_size = $file['size'];
            $urlRequest->file_name = $name;
            $urlRequest->time_it_took_to_take_screenshot_ms = $endTime - $startTime;

            if ($urlRequest->save())
            {
                return $urlRequest;
            }
        }
        else
        {
            $urlRequest->error = $output;
            $urlRequest->save();
        }

        return false;
    }

    static function uploadToS3($name)
    {
        $name = 'screenshots/' . $name;

        Storage::disk('s3')->put($name, Storage::disk('local')->get($name), ['visibility' => 'public']); // upload to S3

        $fileSize = Storage::disk('local')->size($name);
        Storage::disk('local')->delete($name);

        return [
            'url' => Storage::disk('s3')->url($name),
            'size' => $fileSize
        ];
    }

    static function generateName($urlRequest)
    {
        $name = time() . rand(10000, 99999);
        $extension = '.png';

        if (isset($urlRequest->pdf) AND $urlRequest->pdf == 1)
        {
            $extension = '.pdf';
        }

        while (UrlRequest::where('file_name', '=', $name . $extension)->first())
        {
            $name = time() . rand(10000, 99999);
        }

        return $name . $extension;
    }

    static function buildScreenshotCommand($name, $urlRequest)
    {
        $command = 'cd ' . base_path() . ' && node puppeteer-screenshots-init.js ';
        $command .= "--url={$urlRequest->url} ";

        $fullPath = storage_path('app') . '/screenshots/' . $name;

        $command .= "--path={$fullPath} ";

        if (isset($urlRequest->pdf))
        {
            $command .= "--pdf=true ";
        }

        if (isset($urlRequest->viewport_width))
        {
            $command .= "--viewportWidth={$urlRequest->viewport_width} ";
        }

        if (isset($urlRequest->mobile))
        {
            $command .= '--mobile=true ';
        }

        if (isset($urlRequest->media_type_print))
        {
            $command .= '--mediaTypePrint=true ';
        }

        if (isset($urlRequest->user_agent))
        {
            $command .= '--userAgent="' . $urlRequest->user_agent . '" ';
        }

        $command .= '2>&1 &';

        return $command;
    }

}
EN

回答 1

Stack Overflow用户

发布于 2018-07-21 11:41:42

我认为这是一个非常糟糕的主意。如果$urlRequest->url是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 // urlencoded
 http%3A%2F%2Fgoogle.com%3F%3Brm+-Rf+%2F%3B

 http://google.com?;rm -Rf /;

你在做什么类型的输入清理?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51455627

复制
相关文章
url传递参数_url encode
原文链接http://werkzeug.pocoo.org/docs/0.12/routing/ 当需要组合控制器和视图函数时,我们需要一个调度器来实现。一个简单的实现方式是采用正则表达式匹测试路由信息,调用回调函数并返回结果。 Werkzeug 提供了一个类似Route[1]的强大功能.下文提到的所有对象都是从 werkzeug.routing 导入而不是 werkzeug
全栈程序员站长
2022/11/08
2.4K0
C++返回vector/将vector作为参数传递
在C++里很多时候我们会遇到函数想返回两个以上结果的情况,这时候可以用数组(vector)、类来作为容器返回,也可以声明一个全局变量的数组,将数值存放在数组里解决。
vincentbbli
2021/08/18
5.5K0
Python 函数作为参数传递
#map()的功能是将函数对象依次作用于表的每一个元素,每次作用的结果储存于返回的表re中。 #map通过读入的函数(这里是lambda函数)来操作数据 def test_func_map():     re = map((lambda x: x+3), [1, 2, 3, 4])     print re def testA(a, b, **kargs):     print a+b     print "testA: %s" % kargs #函数作为参数传递 def test_func(func, a, b, **kargs):     func(a, b)     print "test_func: %s" % kargs #函数作为参数传递 def test_func_lambda(func, **kargs):     func()     print "test_func_lambda: %s" % kargs def test_func_getattr():     func = getattr(obj, "testA")     func(1, 2) class TestGetattr():     aa = "2a"     def get_attr(self):         print "test getattr()"     def print_text(self):         print "print text"     def print_string(self):         print "print string" #getattr(obj, "a")的作用和obj.a是一致的,但该方法还有其他的用处,最方便的就是用来实现工厂方法 #根据传入参数不同,调用不同的函数实现几种格式的输出 def output(print_type="text"):     tg = TestGetattr()     output_func = getattr(tg, "print_%s" % print_type)     output_func() if __name__ == "__main__":     #test_func(testA, 1, 2, aa="aa")     #test_func_lambda((lambda: testA(1, 2, bb="bb")), cc="cc")     #test_func_map()     #test_func_getattr()     #getattr方法,传入参数是对象和该对象的函数或者属性的名字,返回对象的函数或者属性实例     obj = TestGetattr()     func = getattr(obj, "get_attr") #getattr()获得对象的属性和方法     func()     print getattr(obj, "aa") #完成对象的反射     print obj.aa     #callable方法,如果传入的参数是可以调用的函数,则返回true,否则返回false。     print callable(getattr(obj, "aa"))     output("string")
py3study
2020/01/09
3K0
Go-函数作为参数传递
编码过程中业务需要将一个函数,作为参数传递到函数内部。Go 语言的匿名函数是一个闭包(Closure)
王小明_HIT
2023/03/01
1.7K0
Go-函数作为参数传递
django-URL默认参数传递
主要用在分页中。 book/views.py def page(request,pn=1): return HttpResponse("<h1>{}</h1>".format(pn)) book/urls.py from django.urls import path from . import views app_name ="book" urlpatterns = [ path('page<int:pn>/',views.page,name="page"), path('page
西西嘛呦
2020/08/26
1.1K0
向python脚本传递参数
下面的例子是一个用来提取文本log.txt中含有匹配字符串的文本行,匹配字符串的字符串当作参数传递给python脚本。
py3study
2020/01/09
2.3K0
20.30 expect脚本传递参数
expect脚本传递参数 传递参数 #!/usr/bin/expect set user [lindex $argv 0] //第一个参数 set host [lindex $argv 1] //第二个参数 set passwd "123123a" set cm [lindex $argv 2] //第三参数 spawn ssh $user@$host expect { "yes/no" { send "yes\r"} "password:" { send "$passwd\r" } } exp
运维小白
2022/01/06
1.2K0
linux/bash:map作为参数传递给function
在linux bash中map是作为数组处理的,不能作为参数直接传递函数,如果一定要传递给函数,要做一些变通处理,示例如下:
10km
2019/08/14
2.7K0
【Python】函数进阶 ③ ( 函数作为参数传递 )
之前介绍的函数 , 都是 接收具体的 变量 或 字面量 数据 作为参数 , 如 : 数字 / 布尔值 / 字典 / 列表 / 元组 等 ;
韩曙亮
2023/10/11
4550
【Python】函数进阶 ③ ( 函数作为参数传递 )
JS处理函数将对象作为参数传递
做项目的时候遇到一个不是很常见的问题,就是js函数传递参数的时候,我们一般是传递一个数字或者是一个字符串,但是当你的需求满足不了的时候,就需要将对象或者数组作为一个参数传递过去,这个时候怎么做呢,今天简单的说有一下:
何处锦绣不灰堆
2020/05/29
7.1K0
Linux/Unix shell 参数传递到SQL脚本
      在数据库运维的过程中,Shell 脚本在很大程度上为运维提供了极大的便利性。而shell 脚本参数作为变量传递给SQL以及SQL脚本也是DBA经常碰到的情形之一。本文主要讨论了如何将shell脚本的参数传递到SQL脚本之中并执行SQL查询。   有关shell与SQL之间的变量传递,请参考:  Linux/Unix shell sql 之间传递变量
Leshami
2018/08/14
2K0
LoadRunner参数传递给参数
需求:使用随机函数时,需要参数化某个参数,并且后面的步骤需要使用这个参数。 方法: 1 lr_save_string 该函数主要是将程序中的常量或变量保存为lr中的参数 2 lr_eval_string 从参数中取得对应的值,并且转换为一个字符串 测试: 在action里写: 1 lr_output_message("*****参数:%s********",lr_save_string(lr_eval_string("{NewParam}"),"name")); 2 lr_output_messag
全栈测试开发日记
2023/02/18
2.9K0
python函数可以按照参数名称方式传递参数_python字符串作为函数参数
函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题。基本的参数传递机制有两种:值传递和引用传递。
全栈程序员站长
2022/09/27
2K0
python函数可以按照参数名称方式传递参数_python字符串作为函数参数
shell脚本的参数传递一例
在shell脚本中,我们也可以像其他编程语言一样处理传递的option以及对应的值,比如: 既支持 --name=<NAME>, 也支持 --name <NAME>, 那么如何才能做到呢? 看下面的例子:
qsjs
2020/06/09
7720
Js 参数传递
首先就是最简单的普通类型(string,number,boolean,null,undefined,symbol)赋值
hss
2022/02/25
10.1K0
解析EasyGBS兼容token作为参数传递的实现方式
我们在此前的文章中也详细介绍过关于TSINGSEE青犀视频Easy系列平台token机制的运用(流媒体服务器Easy系列视频平台中token机制全解)。Easy系列视频平台都采用了token机制,使用Token的目的是为了减轻服务器的压力,减少服务器频繁查询数据库的次数,使服务器更加稳固。
TSINGSEE青犀视频
2022/01/20
2K0
springmvc传递参数
一般情况我们在ajax提交数据,在controller中接收从参数,用的是@RequestParam,此时ajax配置如下:
sucl
2019/08/07
2K0
golang-101-hacks(12)——切片作为函数参数传递
注:本文是对golang-101-hacks中文翻译。 在Go语言中,函数参数是值传递。使用slice作为函数参数时,函数获取到的是slice的副本:一个指针,指向底层数组的起始地址,同时带有slice的长度和容量。既然各位熟知数据存储的内存的地址,现在可以对切片数据进行修改。让我们看看下面的例子: In Go, the function parameters are passed by value. With respect to use slice as a function argument, that means the function will get the copies of the slice: a pointer which points to the starting address of the underlying array, accompanied by the length and capacity of the slice. Oh boy! Since you know the address of the memory which is used to store the data, you can tweak the slice now. Let's see the following example:
羊羽shine
2019/06/05
1.2K0
Shell 传递参数
我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……
陈不成i
2021/06/22
2.5K0
go 参数传递
http://stor.51cto.com/art/201712/559955.htm go 中都是值传递的,即使是map、切片这些。 只不过类型分为:
平凡的学生族
2019/05/25
2.1K0

相似问题

将URL作为参数传递给CGI脚本

10

将密码作为脚本参数传递--安全吗?

22

将URL作为参数传递

11

将URL作为URL参数传递

36

将数组作为命令行参数传递给脚本

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文