我搜索了社区,发现添加:
$cmd = 'file --brief --mime ' . @escapeshellarg($file['tmp_name']) .
可能会解决问题,但事实并非如此。
我正在尝试在Codeginter PHP中上传文件。
我开发了一个在我的本地机器上工作正常的应用程序,我能够上传文件,但之后我将它移动到了实时服务器。
现在我收到一个错误:
遇到PHP错误
Severity: Warning
Message: escapeshellarg() has been disabled for security reasons
Filename: libraries/Upload.php
Line Number: 1039
A PHP Error was encountered
Severity: Warning
Message: Cannot modify header information - headers already sent by (output started at /home/primeasp/public_html/bizlnps_prov/system/core/Exceptions.php:186)
Filename: helpers/url_helper.php
Line Number: 543
但事实并非我在这里发布了。
为什么我收到此错误?我将如何解决它?
代码:
function do_upload()
{
$config['upload_path'] = './uploads/';
$config['allowed_types'] = '*';
$this->load->library('upload', $config);
$this->upload->initialize($config);
if ( ! $this->upload->do_upload())
{
$error = array('error' => $this->upload->display_errors());
$this->load->view('customer/upload/upload_ini', $error);
}
else
{
$data = array('upload_data' => $this->upload->data());
$id = $this->session->userdata('id');
foreach ($data as $row)
{
$file_name = $row['file_name'];
$file_path = $row['file_path'];
}
$site = $this->session->userdata('site');
$insert_data = array(
'customer_id' => $id,
'base_ini_filename' => $file_name,
'file_path'=>$file_path,
'site_key'=>$site
);
$this->db->insert('base_ini', $insert_data);
redirect('customer/upload_ini/index');
$this->data['subview'] = 'customer/upload/upload_success';
$this->load->view('customer/_layout_main', $this->data);
}
答案 0 :(得分:2)
主持人已停用escapeshellarg
功能。在函数前使用@
可以抑制错误,但这并不意味着函数在添加后实际可以正常工作。
找到允许此功能的主机或购买专用资源,例如VPS / Dedicated服务器,您可以在其中安装自己的PHP版本并选择您希望启用的功能。
答案 1 :(得分:0)
escapeshellarg() 在字符串周围添加单引号,并引用/转义任何现有的单引号,允许您将字符串直接传递给shell函数并将其视为单个安全参数。
这很简单,因为它在主机上被阻止了。
$cmd = "file --brief --mime '" . str_replace("'","\'",$file['tmp_name']). "'";
<强> Fiddle 强>