2010-11-27 2 views
35

사용자가 파일을 업로드 할 수있는 양식이 있는데이 파일의 이름을 [id]_[lastname]_[firstname].pdf 줄에 지정하고 싶습니다. 이름은 사용자에 의해 입력되며, 나는 그 안에 슬래시가있는 무언가를 입력하는 것을 두려워합니다. 첫 번째 이름이 john/hahaimajerk이면 $path = $dir.$filename과 같은 문자가 $path = 'uploads/2_smith_john/hahaimajerk.pdf'이 될 수 있습니다.파일 이름에 PHP가 이스케이프하는 사용자 입력

나는 사용자가 이름을 다른 것으로 제한하도록 강요하고 싶지 않습니다. 나는 원래 이름을 말할 수있는 한 파일 이름에서 약간의 이름을 변경해도 괜찮습니다. 탈출을 위해 어떤 인물이 필요합니까? 아니면 이것을 할 수있는 다른 방법이 있습니까? 또는 ... 그냥 mysql_real_escape_string을 사용합니까?

+0

는 escapeshellarg 당신을 위해 무엇을 찾고있는,하지만 난 강력하게 사용자 친화적 인 파일 이름에 잠재적으로 안전한 파일 이름으로 알려져 할당하고 데이터베이스를 통해 매핑 고려할 것 . –

+1

악화 : "/../../../etc/passwd"의 첫 번째 이름을 상상하십시오. – Greg

+0

일반적으로 "." 및 ".."도 고려하는 것이 중요합니다. – asmecher

답변

13

mysql_real_escape_stringstr_replace("/","",$filename)를 사용하여 문제를 방지 할 수 있습니다. 심지어 escapeshellarg도 그렇게하지 않을 것입니다. str_replace을 사용해야합니다 :

$path = str_replace('/', '_', $path); 
+1

나는 위험 할 수있는 다른 상징들이 있다고 걱정 했었습니다. - 바라건대/유일한 문제입니다. – munchybunch

+5

'escapeshellarg' 등은 셸 명령 삽입을 방지하기 위해 (';','&& '또는 backticks와 같은) 다른 연산자가 이스케이프되도록하기 위해 셸 명령 (shell_exec, exec 등 사용)을 보낼 때만 유용합니다 SQL 인젝션과 비슷하지만 셸에서는 더 위험합니다). PHP의 파일 시스템 기능 ('fopen','file_put_contents' 등)은 파일 이름을 벗어날 필요가 없습니다. 상황에 가장 나쁜 시나리오 (예 : str_replace가없는 경우) PHP는 "No such file or directory"오류로 파일을 쓰지 못합니다. – netcoder

+1

OS는 또한 파일 이름 내에 특정 문자를 허용하지 않을 수도 있습니다 (예 : Windows에서는 콜론': '및 다양한 다른 문자를 사용할 수 없음).이 대답으로 해결할 수없는 문제입니다. 코드가 실행될 서버 환경을 잘 모르는 경우 Tommy Lacroix의 대답은 훨씬 뛰어납니다. – JMTyler

3

파일 이름에서 유일하게 "안전하지 않은"문자는 /입니다 - 그래서 당신은 쉽게 슬래시를 이스케이프하지 않습니다

+6

"." ".."도 문제를 일으킬 수 있습니다. – asmecher

+4

'.'과'..'는'/'없이 무해합니다. –

+1

... 아직 예약 된 이름이며 IMO를 고려해야합니다. – asmecher

64

나는 보통 이것을 위해 정규식을 사용합니다. 그리고 특정 문자 (예 : 슬래시, 점 등)를 제거하는 대신 특정 문자 (예 : 영숫자) 만 허용하는 것이 좋습니다

예를 들어 문자, 숫자, 대시 또는 밑줄 밑줄 :

$escaped = preg_replace('/[^A-Za-z0-9_\-]/', '_', $raw); 

대시 대시 달리 (예 : AZ로) 문자 범위를 지정하는 데 사용됩니다로서, 정규 표현식에서 대시를 탈출하는 것입니다 전에 백 슬래시.

+5

끝에 (또는 시작) 대시가 범위 표시기로 간주되지 않습니다. – luxcem

+4

이 방법을 사용하면 파일 이름과 파일 확장자 사이의 점이 이스케이프됩니다. – SAMPro

+1

@SAMPro true,하지만 우리가 말하고있는 파일 이름입니다. MIME-TYPE을 신뢰할 수있는 방법으로 확인한 후에는 항상 자신의 확장명을 사용해야합니다 (예 : [Fileinfo module] (http://php.net/manual/en/ ref.fileinfo.php)) –

-1

escapeshellcmd도 도움이 될 수 있습니다.

http://php.net/manual/en/function.escapeshellcmd.php

알렉스 N. 적혀
echo escapeshellcmd("\/()_") -> will display \\/\(\)_ 
+1

왜 downvote? – memical

+1

'echo escapeshellcmd ("../../ foo.txt");'는'../../ foo.txt'를 표시합니다. – miken32

+0

escapeshellcmd는 다음을 허용합니다. Windows 파일 이름에 잘못된 문자가 있습니다. –

관련 문제