2014-03-04 2 views
0

내 PHP 웹 응용 프로그램은 들어오는 전자 메일 메시지를 구문 분석하고이를 MySQL 테이블에 저장합니다. 전자 메일 컨텐츠가 구문 분석 된 후에 나는 "To", "From", "Subject", "Body"등과 같은 다른 전자 메일 파트를 저장하기 위해 MySQL 준비 문을 사용하여 코드 삽입을 방지합니다.파일 이름에 코드를 삽입 할 수 있습니까

전자 메일에 첨부 파일이있는 경우이 파일을 폴더에 저장하고 PGP로 암호화되어 PGP EXEC 기능을 통해 gpg 외부 명령을 실행해야합니다.

"mydoc.doc의 mysqldump_to_www_root의 and_format_all_partitions"

어쩌면 내가 틀렸다 :이 파일은 처리

사람이 같은 attahcment 뭔가를 호출하는 경우 코드 주사, 즉 것으로 보인다.

//Here I save the file to a folder 
$filename = $attachment->filename; 
if ($fp = fopen($save_dir.$filename, 'w')) { 
    while($bytes = $attachment->read()) { 
     fwrite($fp, $bytes); 
    } 
    fclose($fp); 
} 

//Here I check for injection 
If(!is_file($attach_dir.'/'.$filename)) { 
    // something wrong, do not proceed 
} 

내 OS는 EXT4 파일 시스템으로 우분투입니다 : 파일이 바로 그런 식으로 생성 한 후이있는 경우 내가 확인하기로 결정 방지합니다. 저 shceme는 전자 우편 첨부 파일에있는 가능한 부호 주입에서 저를 제외하고하고자 했는가? 즉

$cmd = "gpg --passphrase *** '$attachedir/$filename'"; 
exec($cmd, $output); 

가 디스크 살균에 파일을 저장/파일 이름을 필터링 않거나 예외가있을 수 있습니다 : 결국 내가 예를 들어 때라도을 수행하려는 경우 내가 처음에 걱정해야합니까 ?

+2

파일의 이름을 임의의 문자열로 변경하고 원래 이름과 임의의 문자열을 모두 데이터베이스에 저장하지 않는 이유는 무엇입니까? –

+2

@ChrisForrence 원래 이름에 원치 않는 코드가 있으면 어떨까요? – user164863

+0

그런 다음 원하지 않는 코드가 데이터베이스 테이블의 "원래 파일 이름"열에 문자열로 무해하게 저장됩니다. 당신은 SQL 삽입을 피하기 위해 준비된 문장을 사용한다고 말했고, 그것은 올바른 일입니다. – Wyzard

답변

1

PHP는 escapeshellarg() 함수를 사용하여 문자열의 쉘 메타 문자를 이스케이프 처리하여 인수 또는 개별 명령 그룹이 아닌 단일 인수로 처리되도록합니다. exec()에 전달하는 명령 문자열을 작성할 때이 이름을 파일 이름에 사용하십시오.

+0

$ cmd = "gpg --passphrase *** escapeshellarg ('$ attachedir/$ filename')"; $ exec ($ cmd, $ output)이 escapeshellarg가 gpg bash 커맨드 라인에 들어가면 오류가 발생합니다 : ( – user164863

+0

그건 함수를 호출하지 않기 때문에 문자열 리터럴에 "escapeshellarg"라는 단어를 쓰는 것입니다. – Wyzard

+0

고맙습니다, 당신 말이 맞아요. 그러나 ASCII 문자가 아닌 문자를 사용합니다. 즉, 파일 이름에 러시아 문자가 있으면 그 문자를 사용하지 않습니다. 건너 뛰었습니다. – user164863

관련 문제