Perl中的“在列表上下文中调用了CGI :: param”警告

德瓦什·阿格劳瓦尔

我有一个Perl脚本,可以在数据库中添加数据

    #!/usr/bin/perl
    use cPanelUserConfig;


    use strict;
    use warnings;
    use DBI;
    use CGI::Carp qw(warningsToBrowser fatalsToBrowser);
    use CGI;
    use CGI::Cookie;
    use CGI::Session qw();
    use JSON;
    #use MIME::Lite;

    my $CFG = do "config.pl";
    my $cgi = CGI->new;
    my $db_handle = DBI->connect ("DBI:mysql:$CFG->{database}", $CFG->{user}, $CFG->{password} ) or die "Couldn't connect to database: $DBI::errstr\n";

    my $decdata = decode_json($cgi->param('POSTDATA'));

    my $CustomerID;# = $decdata->{'CustomerID'};
    my $DeliverySlot = $decdata->{'DeliverySlot'};
    my $PaymentMode = $decdata->{'PaymentMode'};
    my $CustomerName = $decdata->{'CustomerName'};
    my $Address = $decdata->{'Address'};
    my $City = $decdata->{'City'};
    my $Mobile = $decdata->{'Mobile'};

    my $th = $db_handle->prepare("select customer_id from table_customers where mobile = '$Mobile'");
    $th->execute() or die "Couldn't connect to database: $DBI::errstr\n";
    my @data = $th->fetchrow_array();
    if ($data[0]) 
    {
        $CustomerID = $data[0];
    }
    else
    {
        my $sql_query = qq{insert into table_customers values (NULL, '$CustomerName', '$Address', '$Mobile', NULL, NULL)};
        my $statement = $db_handle->prepare ($sql_query)    or die "Couldn't prepare query '$sql_query': $DBI::errstr\n";  
        $statement->execute()   or die "SQL Error: $DBI::errstr\n";  
        $CustomerID = $statement->{mysql_insertid};
    }

    my $sql_query = qq{insert into table_orders values (NULL, '$CustomerID', NOW(),  '$PaymentMode', CURDATE(), '$DeliverySlot')};
    my $statement = $db_handle->prepare ($sql_query)    or die "Couldn't prepare query '$sql_query': $DBI::errstr\n";  
    $statement->execute()   or die "SQL Error: $DBI::errstr\n";  


    my $id = $statement->{mysql_insertid};
    my $sql_query = qq{insert into table_order_status values ($id, 1, NOW())};
    my $statement = $db_handle->prepare ($sql_query)    or die "Couldn't prepare query '$sql_query': $DBI::errstr\n";  
    $statement->execute()   or die "SQL Error: $DBI::errstr\n";  



    my $aref = $decdata->{'ItemList'};

    for my $element (@$aref)
    {
        my $i_name = $element->{ItemName}; 
        my $i_quantity = $element->{Quantity}; 
        my $i_mrpprice = $element->{MRP}; 
        my $i_sellprice = $element->{SellPrice};

        my $sql_query = qq{insert into table_order_details values ('$id', 2, 2, $i_quantity, '$i_mrpprice', '$i_sellprice', '$i_name')};
        my $statement = $db_handle->prepare ($sql_query)    or die "Couldn't prepare query '$sql_query': $DBI::errstr\n";  
        $statement->execute()   or die "SQL Error: $DBI::errstr\n";  
    }


    $db_handle->disconnect;

    print $cgi->header;

执行脚本时,虽然在DB中输入是完美的,但我在错误日志文件中看到此错误。

[Fri Sep 25 06:57:59.276603 2015] [cgi:error] [pid 530749:tid 140571387594496] [client 61.0.172.200:16058] AH01215: [Fri Sep 25 06:57:59 2015] PlaceOrder.pl: CGI::param called in list context from PlaceOrder.pl line 19, this can lead to vulnerabilities. See the warning in "Fetching the value or values of a single named parameter" 

第19行是:

my $decdata = decode_json($cgi->param('POSTDATA'));

这是什么错误以及如何解决。任何帮助或评论都将非常有帮助。

清醒

那么,除了指出CGI非核心,因为它不再被视为是很好的做法,它的值得一试CGI::Alternatives(我知道这并不总是可能的,因为它会保证全部重写):

my $decdata = decode_json(scalar $cgi->param('POSTDATA'));

问题是-如果您要的是值列表或单个值,param方法会在内部进行检测(请参阅:)wantarray()但是因为您要将其传递给函数(decode_json)-它位于列表上下文中。鉴于您的帖子,这似乎不太可能是您想要的-因此,通过scalar(或只是"".强制执行标量上下文将达到目的

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

摆脱“浮点上下文中的整数除法”警告

解决“浮点上下文中的整数除法”警告

反应警告:失败的上下文类型:在“组件”中未指定必需的上下文“路由器”

标量上下文中的Perl数组

React / Reactstrap警告:在严格模式树中已检测到旧版上下文API

可空注释上下文与可空警告上下文

在父上下文 handlebars.js 中访问 object.param

Perl 定義-或在列表上下文中,為什麼是標量?

Perl文件读取:在列表上下文中读取时合并多行

“此字段泄漏上下文对象”警告 Hilt Injection

在调用者上下文中打印包含列表变量的表达式

React-bootstrap选项卡:警告:在<TabContainer>的上下文中,为<NavItem>赋予生成的id和aria-controls属性

如果在不同的上下文中调用了回调,则简单的AWS Lambda响应为null

SPARK中不允许在干扰上下文中调用volatile函数

正确理解 angular14 中的注入 - 必须从注入上下文中调用注入()

如何在Moose构造函数中确定在哪个上下文中调用它?

不在对象上下文中时使用$ this在静态方法中调用简单方法

在Python中,如何在共享上下文中使用许多exec调用?

lambda是否在调用脚本的上下文或定义的脚本的上下文中执行?

在不包含Scaffold的上下文中调用Scaffold.of()

静态上下文中的Java方法调用链接

从静态上下文中的 a 调用非静态方法

从非静态上下文中调用静态方法

“无法从此上下文中调用SpreadsheetApp.getUi()”

在调用上下文中访问局部变量

请解释“!”的含义 在函数调用的上下文中

如何获取上下文中的总项目以反映在Django列表视图的模板中

将列表对象过滤到jsp页面中的servlet上下文中

在单子上下文中生成列表