Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php XML文件保存,潜在的安全问题?_Php_Xml_Security_Magento_File Io - Fatal编程技术网

Php XML文件保存,潜在的安全问题?

Php XML文件保存,潜在的安全问题?,php,xml,security,magento,file-io,Php,Xml,Security,Magento,File Io,我正在创建一个Magento模块,它将用户输入数据保存到一个xml文件中(保存在服务器上供以后使用——想想名片订单)。我想知道我的进程有多安全,可能会出现什么(如果有的话)安全问题。我会注意到,我与一家专门从事pci兼容服务器的公司共同主持了这个网站,另外,该公司在CHROOT下运行 我有一些遗留的flash文件来做输入(有很多,或者我只是重新创建它们)。这些是打印订单,因此它们需要接受所有形式的特殊字符(因此,在验证方面不会做太多) 从那里: $.ajax->processor.php->

我正在创建一个Magento模块,它将用户输入数据保存到一个xml文件中(保存在服务器上供以后使用——想想名片订单)。我想知道我的进程有多安全,可能会出现什么(如果有的话)安全问题。我会注意到,我与一家专门从事pci兼容服务器的公司共同主持了这个网站,另外,该公司在
CHROOT
下运行

我有一些遗留的flash文件来做输入(有很多,或者我只是重新创建它们)。这些是打印订单,因此它们需要接受所有形式的特殊字符(因此,在验证方面不会做太多)

从那里: $.ajax->processor.php->

    /* grab params */
    if (isset($_POST)) {
        foreach ($_POST as $key => $value) {
            $params[$key] = filter_var($value, FILTER_SANITIZE_STRING);
        }
    }

    /* build xml */
    $xml = new DOMDocument('1.0', 'UTF-8');
    $xml_root = $xml->createElement('Root');
    foreach ($params as $key => $value) {
        $xml_node = $xml->createElement( $key );
        if(!empty($value) && $value != 'undefined'){
            $xml_node->appendChild( $xml->createTextNode( $value ));
        }
        $xml_root->appendChild($xml_node);
    }
    $xml->appendChild($xml_root);

    /* create filename */
    $d = new DateTime('now');
    $date = str_replace(" ", ".",$d->format('Y-m-d G:i:s'));
    $keyvar = preg_replace('/[^a-zA-Z0-9-]/', '', $params['keyVar']);
    $filename = str_replace(" ", "", $params['template'].".".$date.".".$keyvar.".xml" );
    $file = $_SERVER['DOCUMENT_ROOT'].'/media/customer/orders/'.$filename;

    /* write it */
    $xml->save($file);
然后我只是将文件的引用(而不是位置)传递回要附加到订单的客户机

所以:不包括;VAR经过消毒(仍然允许使用特殊字符);唯一文件名;文件保存到未知位置(通过前端)

该系统将由IT安全部门进行审查,我只想在审查之前了解任何情况


我遗漏了什么吗?

在可服务文件之外保存是一个好主意,而且易于实现。 另外-保存前最后检查目录遍历

$path = '/home/user/orders/printing/';
$file = $path.$filename;

if ( !preg_match("../", $file) ){
    /* write it */
    $xml->save($file);
}

可能是从documnet_根目录中保存文件,或者该位置至少不应被浏览。如果此代码易受目录遍历的攻击,请使用数据库或其他工具。
$filename
来自何处?文件名是从其产品类型(其模板)、日期戳和人类可读标识符连接而来的(keyvar。我认为在doc root之外保存文件会很容易实现。我认为我可以测试“./”以防止目录遍历。如前所述-服务器被设置为chroot监狱,因此我认为这不会是一个问题。