代码:
- <?php
 - if(($_FILES[“file”][“type”]==“image/gif”)||($_FILES[“file”][“type”] == “image/jpeg”)|| ($_FILES[“file”][“type”] == “image/pjpeg”)&&($_FILES[“file”][“size”] < 200000)){
 - $type=".jpg";
 - if($_FILES[“file”][“type”]==“image/gif”){
 - $type=".gif";
 - }else{
 - $type=".jpg";
 - }
 - $name=$_FILES[“file”][“name”];
 - //echo “##name:” . $name . “<br>”;
 - if(strpos($name,";")){
 - die();
 - }
 - //echo “##wait:” . $wait . “<br />”;
 - $wait=explode(".",$name);
 - $okname=$wait[0];
 - echo “##name[0]:” . $wait[0] . “<br />”;
 - $okname=$okname . $type;
 - mkdir("./upload");
 - echo “##type:” . $type . “<br />”;
 - echo “##okname:” . $okname . “<br />”;
 - echo “Upload: " . $_FILES[“file”][“name”] . “<br />”;
 - echo “Type: " . $_FILES[“file”][“type”] . “<br />”;
 - echo “Size: " . ($_FILES[“file”][“size”] / 1024) . " Kb<br />”;
 - echo “Stored in: " . $_FILES[“file”][“tmp_name”];
 - move_uploaded_file($_FILES[“file”][“tmp_name”],”./upload/” . $okname);
 - }
 - ?>
 - <form action=”" method=“post” enctype=“multipart/form-data”>
 - <input type=“file” name=“file”><input type=“submit”>
 - </form>
 
使用的方法是将整个文件的扩展名改成 JPG 或 GIF。
其中 if(strpos($name,";")){ die(); } 是为了防止 IIS6 的解析漏洞,IIS6 在解析文件时如果遇到 hello.php;112233.jpg 这样的文件,会默认解析为 hello.php
为什么不直接在整个文件后面加上一个扩展名,像 hello.php.rar.mp4.jpg ? Apache 服务器解析时会将如 hello.php.avi.jpg 这样的文件取第一个“.”,解析成 hello.php,所以上面使用了 explode 方法