<?php
if( isset( $_POST[ 'Upload' ] ) ) {
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
//验证用户提交的的token(令牌)是否与服务器端session存储的token相匹配,以确保请求的有效性和安全性
// File information
$uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
//$uploaded_name: 获取上传文件的原始名称,包括扩展名。
$uploaded_ext = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1);
//$uploaded_ext: 通过截取文件名来获取上传文件的扩展名(不包括点“.”)。
$uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];
//$uploaded_size: 获取上传文件的大小
$uploaded_type = $_FILES[ 'uploaded' ][ 'type' ];
//$uploaded_type: 获取上传文件的MIME类型,例如 "image/jpeg" 等
$uploaded_tmp = $_FILES[ 'uploaded' ][ 'tmp_name' ];
//$uploaded_tmp: 获取上传文件被临时存储在服务器上的位置(自动生成)
// Where are we going to be writing to?
$target_path = DVWA_WEB_PAGE_TO_ROOT . 'hackable/uploads/';
//将目标上传路径设置为 DVWA 应用程序的根目录下 hackable/uploads/ 文件夹(保存到指定目录)
//$target_file = basename( $uploaded_name, '.' . $uploaded_ext ) . '-';
$target_file = md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;
// 生成的唯一ID与上传文件的原始名称(不含扩展名)拼接后进行MD5哈希运算加上扩展名生成一个新的文件名。(这样可以确保在同一个目录下多次上传相同名称文件时不会发生覆盖)
$temp_file = ( ( ini_get( 'upload_tmp_dir' ) == '' ) ? ( sys_get_temp_dir() ) : ( ini_get( 'upload_tmp_dir' ) ) );
//获取PHP配置中的临时文件上传目录(ini_get('upload_tmp_dir')),如果该配置为空,则使用系统默认临时目录(sys_get_temp_dir())。
$temp_file .= DIRECTORY_SEPARATOR . md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;
// 变量保存的是上传文件在服务器上的临时存储位置,
// Is it an image?
if( ( strtolower( $uploaded_ext ) == 'jpg' || strtolower( $uploaded_ext ) == 'jpeg' || strtolower( $uploaded_ext ) == 'png' ) &&
//检查上传文件的扩展名否为 'jpg'、'jpeg' 或 'png'。
( $uploaded_size < 100000 ) &&
//文件大小
( $uploaded_type == 'image/jpeg' || $uploaded_type == 'image/png' ) &&
//文件类型,是否为 'image/jpeg' 或 'image/png',以验证文件内容与扩展名相符,确为 JPEG 或 PNG 图像。
getimagesize( $uploaded_tmp ) ) {
//查看文件是否是有效的图像文件。
// Strip any metadata, by re-encoding image (Note, using php-Imagick is recommended over php-GD)
if( $uploaded_type == 'image/jpeg' ) {
$img = imagecreatefromjpeg( $uploaded_tmp );
imagejpeg( $img, $temp_file, 100);
}
//判断上传文件类型是否是image/jpeg,是的话创建。一个基于上传JPEG文件的gd图像资源保存为100新的JPEG文件。保存路径为¥temp_file.
else {
$img = imagecreatefrompng( $uploaded_tmp );
imagepng( $img, $temp_file, 9);
}
imagedestroy( $img );
// Can we move the file to the web root from the temp folder?
if( rename( $temp_file, ( getcwd() . DIRECTORY_SEPARATOR . $target_path . $target_file ) ) ) {
// Yes!
echo "<pre><a href='${target_path}${target_file}'>${target_file}</a> succesfully uploaded!</pre>";
}
else {
// No
echo '<pre>Your image was not uploaded.</pre>';
}
// Delete any temp files
if( file_exists( $temp_file ) )
unlink( $temp_file );
}
else {
// Invalid file
//否则输出:Your image was not uploaded. We can only accept JPEG or PNG images.
echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
}
}
// Generate Anti-CSRF token
generateSessionToken();
?>
1. checkToken():
checkToken()
函数:这是一个自定义的函数,其目的是比较传入的两个token是否一致。如果$_REQUEST['user_token']
与$_SESSION['session_token']
相匹配,则说明这次请求来自一个合法的、已验证身份的用户;如果不匹配,则可能表示请求无效或已被篡改,此时服务器可能会拒绝该请求,或者重定向至指定的URL,这里是指向'index.php'
页面。
?2. uniqid():
生成一个基于当前时间戳(精确到微秒)的唯一标识符。这个标识符通常用于创建临时文件名、会话ID或其他需要唯一性的场景
?实例:
测试场景:
3. ini_get():
ini_get
函数在PHP中用于获取PHP配置选项当前的值
示例:
测试场景:
4. strtolower():
用于将一个字符串中的所有字符转换为小写。
示例:
测试场景:
原始字符串 $str
是 "Hello WoRLd",通过调用 strtolower($str)
函数后,所有大写字母被转换为相应的小写字母,因此变量 $lowercaseStr
的值变为 "hello world"。
5. getimagesize():
?
getimagesize()
函数在PHP中用于获取图像文件的尺寸、类型等信息。
实例:
测试场景:
后续待更~
?