이 기사에서는 주로 PHP의 file_put_contents 함수에 대한 자세한 설명을 공유합니다. 저는 최근 EIS에서 파일 업로드 질문을 접했고 < 필터링 후에 많은 제스처가 유효하지 않다는 것을 알게 되었습니다. 나는 이 질문을 해결하지 못했습니다. 그제서야 나는 그것을 우회하기 위해 배열을 사용하고 있다는 것을 깨달았습니다. 여기서는 더 이상 고민하지 않고 자세한 소개를 살펴보겠습니다.
file_put_contents 함수의 두 번째 매개변수 데이터에 대한 공식 웹사이트 정의를 살펴보겠습니다.
data 要写入的数据。类型可以是 string,array 或者是 stream 资源(如上面所说的那样)。 如果 data 指定为 stream 资源,这里 stream 中所保存的缓存数据将被写入到指定文件中,这种用法就相似于使用 stream_copy_to_stream() 函数。 参数 data 可以是数组(但不能为多维数组),这就相当于 file_put_contents($filename, join('', $array))。
보시다시피, 데이터 매개변수는 배열이 될 수 있으며, 이는 Join('',$array)
에 의해 자동으로 문자열로 변환됩니다. 이 함수가 파일에 액세스할 때 다음 규칙을 따릅니다.
FILE_USE_INCLUDE_PATH가 설정되면 *filename* 복사본의 내장 경로가 확인됩니다
파일이 없으면 파일이 생성됩니다
파일 열기
LOCK_EX를 설정하면 파일이 잠깁니다
FILE_APPEND가 설정된 경우 파일의 끝으로 이동합니다. 그렇지 않으면 파일 내용이 삭제됩니다
파일에 데이터 쓰기
파일을 닫고 모든 파일 잠금 해제
성공하면 함수는 파일에 쓰여진 문자 수를 반환합니다. 실패하면 False가 반환됩니다.
그러나 문자열 필터링 기능은 일반적으로 다음과 같이 preg_match 기능을 사용하여 필터링합니다. 문자열을 처리하는 많은 함수(예: strcmp, strlen, md5 등)가 배열이 전달되면 NULL을 반환한다는 것을 알고 있습니다. 그러나 오류가 발생하면 preg_match 함수는 false를 반환합니다. 여기서는 var_dump(preg_match('/<)를 전달할 수 있습니다. ;/',$data )); 이 경우 preg_match의 일반 필터링이 유효하지 않음을 확인합니다
그래서 파일업로드 코드는 이렇게 쓴거 같네요
if(preg_match('/\</',$data)){ die('hack'); }
그래서 우리는
를 우회하기 위해 content[]=&ext=php를 전달할 수 있습니다. 해결 방법
해결 방법은 fwrite 함수를 사용하여 위험한 file_put_contents 함수를 대체하는 것입니다. fwrite 함수는 문자열만 전달할 수 있습니다. 배열인 경우 오류가 반환됩니다.
<?php if(isset($_POST['content']) && isset($_POST['ext'])){ $data = $_POST['content']; $ext = $_POST['ext']; //var_dump(preg_match('/\</',$data)); if(preg_match('/\</',$data)){ die('hack'); } $filename = time(); file_put_contents($filename.$ext, $data); } ?>
관련 권장 사항:
위 내용은 PHP의 file_put_contents 함수에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!