Php 在codeigniter 3中安全上载和显示图像或文件

Php 在codeigniter 3中安全上载和显示图像或文件,php,codeigniter,security,image-uploading,Php,Codeigniter,Security,Image Uploading,我想在我的codeigniter 3中上传图像,我想向我的用户显示上传的图像(这是在注册级别,用户正在输入他的个人资料数据) 我应该把上传的图片给他看。 我读过: 将其移出公共html是一个好主意,也可以尝试 重命名文件,只需向其添加扩展名 还有一个: 不要将上载的文件移动到可从URL访问的目录 但我不知道我如何才能显示的图片,这是不是目录,这是可访问的URL。 我不知道这对我来说真的很重要,我使用了codeigniter上传类,我不知道我应该做什么样的安全操作 这是我的控制器: public

我想在我的codeigniter 3中上传图像,我想向我的用户显示上传的图像(这是在注册级别,用户正在输入他的个人资料数据) 我应该把上传的图片给他看。 我读过:

将其移出公共html是一个好主意,也可以尝试 重命名文件,只需向其添加扩展名

还有一个:

不要将上载的文件移动到可从URL访问的目录

但我不知道我如何才能显示的图片,这是不是目录,这是可访问的URL。 我不知道这对我来说真的很重要,我使用了codeigniter上传类,我不知道我应该做什么样的安全操作 这是我的控制器:

public function do_resize($img_name ,$image_original_width , $image_original_height   )
{

    // $nesbat = $image_original_height  / $image_original_width ;

    $config_manip = array(
    'image_library' => 'gd2',
    'source_image' => '../uploads/'.$img_name,
    'new_image' => '../uploads/'.$img_name,
    'maintain_ratio' => TRUE,
    'create_thumb' => TRUE,
    'thumb_marker' => '_thumb',
    'width' => 150,
    'height' => 150
    );
    $this->load->library('image_lib', $config_manip);
    if (!$this->image_lib->resize()) {
        // echo $this->image_lib->display_errors();
        return false ;
    }
    else
    {
        return true ;
    }
    // clear //
    $this->image_lib->clear();

}

function do_upload()
{

    $file_name = $this->input->post("file_name") ;

    $config['upload_path'] = '../uploads/';
    $config['allowed_types'] = 'gif|jpg|png';
    $config['max_size'] = '10000';
    $config['max_width']  = '1024';
    $config['max_height']  = '768';
    $config['file_name']  = $file_name;


    // delete if .gif image exists before

    if ( is_file('./uploads/'.$file_name.".gif")   )
    {
        unlink("./uploads/".$file_name.".gif"); 
        unlink("./uploads/".$file_name."_thumb.gif"); 
    }



    // delete if .gif image exists before

    if ( is_file('./uploads/'.$file_name.".jpg")   )
    {
        unlink("./uploads/".$file_name.".jpg"); 
        unlink("./uploads/".$file_name."_thumb.jpg"); 
    }


    // delete if .gif image exists before

    if ( is_file('./uploads/'.$file_name.".png")   )
    {
        unlink("./uploads/".$file_name.".png"); 
        unlink("./uploads/".$file_name."_thumb.png"); 
    }


    $this->load->library('upload', $config);



    if ( ! $this->upload->do_upload())
    {
        $error = array('error' => $this->upload->display_errors());
        echo "<div id='upload_status'>fail</div>";
        echo "<div id='error_mesage'>".$this->upload->display_errors()."</div>";
    }
    else
    {
        $data = array('upload_data' => $this->upload->data());
        $upload_data = $this->upload->data(); 

        $uploaded_file_name =   $upload_data['file_name'];

        $resize = $this->do_resize($uploaded_file_name  , $upload_data['image_width'] , $upload_data['image_height'] ) ;
        if ($resize == true ) 
        {
            echo "<div id='upload_status'>success</div>";
            echo "<div id='uploaded_image_link'  >".$upload_data['file_name']."</div> ";
            $thumb_link = str_replace($file_name,$file_name."_thumb",$upload_data['file_name']);
            echo "<div id='uploaded_image_thumb_link'  >".$thumb_link."</div> ";
        }
        //if $resize == true , nabashe -> uploade koli fail eleam mishe ta dobare anjam beshe
        else 
        {
            echo "<div id='upload_status'>fail</div>";
        }


    }
}
public函数不调整大小($img\u name、$image\u original\u width、$image\u original\u height)
{
//$nesbat=$image\u original\u height/$image\u original\u width;
$config\u manip=array(
“图像库”=>“gd2”,
'source_image'=>'../uploads/'。$img_name,
“新建图像”=>“../uploads/”。$img\u name,
“保持_比率”=>TRUE,
“create_thumb”=>TRUE,
“拇指标记”=>“\u拇指”,
“宽度”=>150,
“高度”=>150
);
$this->load->library($image\u lib',$config\u manip);
如果(!$this->image\u lib->resize()){
//echo$this->image_lib->display_errors();
返回false;
}
其他的
{
返回true;
}
//清楚的//
$this->image_lib->clear();
}
函数do_upload()
{
$file\u name=$this->input->post(“文件名”);
$config['upload_path']='../uploads/';
$config['allowed_types']='gif | jpg | png';
$config['max_size']='10000';
$config['max_width']='1024';
$config['max_height']='768';
$config['file\u name']=$file\u name;
//如果之前存在.gif图像,请删除
如果(是_文件('./uploads/'.$file_name..gif”))
{
取消链接(“./uploads/”$file_name..gif”);
取消链接(“./uploads/”$file\u name.\u thumb.gif”);
}
//如果之前存在.gif图像,请删除
if(is_file('./uploads/'.$file_name..jpg”))
{
取消链接(“./uploads/”$file_name..jpg”);
取消链接(“./uploads/”$file\u name.\u thumb.jpg”);
}
//如果之前存在.gif图像,请删除
如果(是_文件('./上传/'.$file_name..png”))
{
取消链接(“./uploads/”$file_name..png”);
取消链接(“./uploads/”$file\u name.\u thumb.png”);
}
$this->load->library('upload',$config);
如果(!$this->upload->do_upload())
{
$error=array('error'=>$this->upload->display_errors());
回应“失败”;
回显“$this->upload->display_errors()”;
}
其他的
{
$data=array('upload_data'=>$this->upload->data());
$upload_data=$this->upload->data();
$upload_file_name=$upload_data['file_name'];
$resize=$this->do_resize($upload_file_name,$upload_data['image_width'],$upload_data['image_height']);
如果($resize==true)
{
呼应“成功”;
echo“$upload_data['file_name']”;
$thumb\u link=str\u replace($file\u name,$file\u name.“\u thumb”,$upload\u data['file\u name']);
回显“$thumb_链接”;
}
//如果$resize==true,则nabashe->上传koli失败eleam mishe ta dobare anjam beshe
其他的
{
回应“失败”;
}
}
}

图像通常是公共资产,但您可以通过几种方式保护它们

  • 将index.html或index.php文件放在图像目录中
  • 重写文件名(将混淆原始名称)
  • 要在上传后查看图像,需要AJAX或页面刷新。页面刷新更容易编码,只需上传文件并在前面的页面上显示该文件

    您可以保护文件夹,以确保特定页面有权显示图像。这会使事情变得更复杂,但使用某种资源访问系统可能会帮助您实现这一点

    一旦页面被加载-图像将可供该用户使用,并在那里下载

    我不确定你到底在保护什么(个人资料图片,成人内容…),但图像,如CSS文件是公共资产


    Rich

    使用这种方式,我们可以防止来自其他服务器的映像调用

    防止图像热链接(IMP)
    -图像热链接是在我们的网站中使用他人的图像URL并使用其带宽的过程/技术。为了防止这个秘密,我们可以通过在htaccess中添加以下行来防止外部服务器的访问

    RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?yourdomain.com [NC]
    RewriteRule \.(jpg|jpeg|png|gif)$ - [NC,F,L]
    

    只需创建一个空白的index.html文件,并将index.html文件放在除应用程序/系统文件夹外的所有其他公用文件夹中(它们已经有了该文件)。 这是一种简单的安全技术,用于限制查看者查看公用文件夹中的文件