파일 이름 검증에 대한 비즈니스 모범 사례는 무엇입니까?
-
18-09-2019 - |
문제
나는 "딜레마"가 있고 비즈니스 모범 사례가 무엇인지 궁금합니다.
업로드를 사용하여 이미지를 업로드하고 있습니다. 이제 파일을 저장하기 전에 파일 이름을 검증해야합니다.
나는 다른 솔루션을 보았지만 하나의 좋은 솔루션을 얻을 수는 없습니다.
내 기준은 다음과 같습니다.
- 파일 이름은 모두 소문자에 있어야합니다
- 파일 이름은 charaters 만 포함 할 수 있습니다 [A-Z0-9_-
- 파일 이름을 바꿀 수 있어야합니다
파일 이름이 있으면 어떻게 하시겠습니까? my.file(name).jpeg
?
파일 이름을 폭발시킬 수 있습니다. 확장을 저장 한 다음 파일 이름을 다시 얻도록 간청하십시오. 그러나 그것이 최고의 해결책인지 확실하지 않습니다.
약간 도움이되는 다음 기능이 있습니다.
function getExts($filename)
{
$exts = explode("[/\\.]", $filename) ;
$n = count($exts)-1;
$exts = $exts[$n];
return $exts;
}
function validFilename($filename)
{
$filename = str_replace(" ", "_", $filename);
$pattern = "/[^[a-z0-9_-]/";
return preg_replace($pattern, "", strtolower($filename));
}
업데이트 1
$ _files를 통해 파일을 받고 있습니다. 이것은 다음 데이터를 제공합니다.
- $ _files [ "파일"] [ "이름"] - 업로드 된 파일의 이름
- $ _files [ "파일"] [ "유형"] - 업로드 된 파일의 유형
- $ _files [ "파일"] [ "크기"] - 업로드 된 파일의 바이트 크기
- $ _files [ "file"] [ "tmp_name"] - 서버에 저장된 파일의 임시 사본 이름
- $ _files [ "file"] [ "Error"] - 파일 업로드에서 발생하는 오류 코드
업데이트 2
방금 뭔가를 찾았습니다. 나는 사용할 수있다 getimagesize 7 개의 요소 배열을 반환합니다. 이러한 요소 중 하나는 [2]는 imageType_xxx입니다.
그래서이 코드를 사용해보십시오.
function getExts2($filename)
{
list(,,$type) = getimagesize($filename);
return $type;
}
그러나 그것은 단지 2 번만 반환합니다 ...
(나는 또한 exif_imagetype를 사용해 보았지만 PHP 오류 : 정의되지 않은 함수로 호출합니다.)
해결책
Regexp로 filename을 확인하십시오. Mimetype에 대한 정보를 사용하십시오. MD5 이름으로 서버에 파일을 저장합니다. DB에 실제 파일 이름을 저장하십시오.
다른 팁
pathinfo () 파일 이름과 확장자를 얻을 수 있습니다. 그러나 파일 이름 검사를 통해 파일의 확장 테스트에 의존 할 수 없다고 경고합니다. 파일의 이진 내용을 실제로 검사하는 함수를 사용하려고합니다. finfo_file () 이것을 달성 할 수 있습니다. 아, 그리고 사용하는 것은 결코 아프지 않습니다 베이스 이름 () 경로 트래버스 공격을 방지하기 위해 사용자가 제공 한 파일 경로에서.
나중에 다운로드 파일 이름으로 사용하기 위해 파일 이름을 확인하고 있다고 가정합니다.
기술적 인 관점에서 사용자를 위해 파일 이름을 보존하는 것이 좋지만 접근 방식은 소리가 들립니다.
URL의 모습에 관심이 있고 앞으로 국제적인 청중을 대상으로 할 수 있다면 Umlauts를 기본 캐릭터로 변환하거나 변환해야합니다. 독일 사용자 (Umlauts ä Ö ü ß)는 전환을 기대할 것입니다.
Ä = ae
Ö = oe
Ü = ue
스칸디나비아 사람들은 편안한 것 같습니다
Ä => a
Ö => o
Ø => o
등등.
그런 다음 다양한 악센트 캐릭터가 있습니다 é Á Ó ...
그것들을 모두 떨어 뜨리면 외관이있는 URL로 이어집니다 진짜 BWSR 주소 BR의 BD 및 LOK STRNG.
이것은 당신이 원하는 모든 것을해야합니다.
$filename = preg_replace('/[^[a-z0-9_-]/', '', str_replace(' ', '_', strtolower(pathinfo($filename, PATHINFO_FILENAME)))) . pathinfo($filename, PATHINFO_EXTENSION);
Pekka가 설명했듯이 파일 이름으로 모든 강조를 대체하려면 다음 기능을 사용할 수 있습니다.
function Unaccent($string)
{
return preg_replace('~&([a-z]{1,2})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', htmlentities($string, ENT_QUOTES, 'UTF-8'));
}
나는 당신이 파일 이름을 "검증"해야한다고 생각하지 않으며, 원하는 형식이 아닌 경우 "수정"해야합니다. 누군가가 파일의 이름을 지정하는 데 짜증을 내거나 특이한 캐릭터가 있기 때문에 파일을 거부하는 이유는 무엇입니까? 또한 이미지로 작업하는 경우 사용할 수 있습니다. getimagesize
실제로 업로드 된 이미지인지 확인하기 위해 언급했듯이 (이미지가 아닌 경우 실패해야합니다).