2011-12-16 2 views
1

나는이 주제가 널리 논의 된 것을 알고있다. 저의 연구를 해본 결과 이미지 파일을 DB 대신 BLOB 파일로 저장하기로 결정했습니다. 내가 가지고있는 문제는 파일을 업로드하고 지정된 폴더에 저장 한 다음 대상을 db에 저장하는 가장 좋은 방법을 찾아 내려고 시도하는 것입니다 .say ../ img/something.jpg - 살펴 보았습니다. 많은 자원들이 있지만 그 대부분은 그 과정에서 중요한 단계들을 놓치고있다.PHP를 사용하여 이미지 파일을 서버에 업로드하는 가장 안전한 방법은 무엇입니까?

문제 :

  1. 파일을 대상 파일 텍스트로 대상 파일을 저장
  2. 에 이미지를 업로드
  3. 크기 제한 IMG 파일
  4. 을 업로드 할 수있는 안전한 방법을 찾기 DB에

나는 PHP와 MySQL을 사용하고있다.

+0

당신은'file'을 업로드하고 '파일을 제한?에 대한 안전한 방법을 찾기로 무슨 뜻 이죠'특정 확장 또는로 제한 하시겠습니까? .. – luastoned

+0

예. 사용자를 .png 또는 .jpg 파일로만 제한하십시오. – diesel

+0

사용자가 자신의 프로필 이미지를 말하고 안전하게 이미지를 업로드 할 수있게하고 싶습니다. 나는 사용자가 내 사이트에 위협을 가하는 실행 파일이나 다른 것을 업로드하는 것을 원하지 않는다. – diesel

답변

0

당신이 당신이 무엇을 원하는의 기본 개념을 다루고 이동 :

<?php 
    $allowedTypes = array("image/jpg", "image/jpeg", "image/png"); 
    $maxSize = 3 * 1024 * 1024; // 3Mb 

    $fileType = $_FILES["file"]["type"]; 
    $fileSize = $_FILES["file"]["size"]; 

    // check if there was an error 
    if ($_FILES["file"]["error"] > 0) 
    { 
     die($_FILES["file"]["error"]); 
    } 

    // check if the filetype is valid 
    if (!in_array($fileType, $allowedTypes)) 
    { 
     die("Invalid file type: $fileType"); 
    } 

    // check if the size doesn't exceed the limitations 
    if ($fileSize > $maxSize) 
    { 
     die("The file was too big: $fileSize"); 
    } 

    $name = $_FILES["file"]["name"]; 
    $tmpfile = $_FILES["file"]["tmp_name"]; 

    // check if the filename is valid 
    if (preg_match("/[\w-]+\.(jpg|jpeg|png)$/", $name) != 1) 
    { 
     die("Invalid file name: $name"); 
    } 

    // create unique name if needed 

    $path = "/var/www/images/" . $name; 

    move_uploaded_file($tmpfile, $path); 

    // add the filepath to mysql 
    mysql_connect("localhost", "username", "password"); 
    mysql_select_db("imagedb"); 
    mysql_query("INSERT INTO images (Location, Size) VALUES ('$path', '$size');"); 
?> 

이것은 그것이 어떻게 행해질 수 있는지를 보여주기위한 것입니다.

+1

도움을 주셔서 감사합니다! – diesel

+0

@ Col.Shrapnel 나는 결국 그는 고유 한 파일 이름을 생성하고 싶지만 어쨌든 그에게 달려 있다고 말했다. 플러스 기본 아이디어! = 가장 안전한 파일 업로드. 그것에 대해 생각하면 허용되지 않는 문자를 사용하면 move_uploaded_file이 오류가 발생할 수 있습니다. – luastoned

+1

질문은 "업로드하는 방법"이 아니라 안전한 업로드 방법입니다. 어쨌든 코드가 실패합니다. 실행 파일은 쉽게 허용됩니다. –

-2

개인적으로 내가 stackexchange 웹 사이트 여기에 사용되는 imgur을 사용하십시오

this을 읽을

다음
+0

나는 일종의 혼란 스럽다. 그래서 당신이 말하고자하는 것은 파일을 imgur에 업로드하는 것입니다. – diesel

+0

@diesel 내가 할 수있는 일이지만, 너는 자유롭게 할 수있어. :) – Lynob

+0

나에게 전화를 걸지 만, 나는 그 연결을 보지 않고있다. – diesel

1

몰라 무엇에 대한 모든 점,하지만 당신이 정말로 염려 할 필요하면 파일 확장자에 대한

  • 검사입니다.
    파일 이름에서 추출한 다음 허용되는 파일과 비교하십시오.
    파일명이 하나의 점으로 만 표시되는지 확인하거나 적어도 이상한 Apache 동작으로 인해 name.html.jpg과 같은 이름이 없어도됩니다.

  • 파일 내용을 확인하십시오. 가장 좋은 방법은 업로드 된 이미지에서 새로운 이미지를 만드는 것입니다.

  • DB를 사용하는 동안 일반적인 예방 조치를 취하십시오.

+0

을 사용하고 싶을 것입니다. 제가 겪고있는 주된 문제는 사용자가 업로드하고 싶지 않은 파일을 업로드 할 수 있다는 것입니다. – diesel

+0

내 솔루션을 다시 확인하십시오. 정규식 검사는 이상한 파일을 방지해야합니다. – luastoned

+0

@diesel은 이러한 바람직하지 않은 콘텐츠의 예가 무엇입니까? 어쨌든 새로운 이미지를 만드는 것은 충분히 안전해야합니다. 원하지 않는 내용에 실패하거나 확실하게 말할 수있는 내용의 파일을 생성합니다. –

관련 문제