[php]剛寫完的上載,望各師兄能給意見改善

始終功能不深,擔心安全性等問題,望各師兄看看如何改進。
不過關鍵就是改名的動作連副檔名也改了,有點頭痛
只能加個 jpg , 因為不想保留原有檔名的名字
但如果別人上載 text 也強行改成了 jpg

雖說可以換成 if 一個個測,但好像有點笨的做法呢
看看各師兄有無什麼方法建議...

<?        
        /* 讀取 ACTION */
        $ufile = $_POST['action'];
        $action = $_GET['action'];
       
        /* 如果 POST 和 GET 都取得 ACTION 則執行上載動作 */
        if( $action == "upload" && $ufile == "upload" ){
        $target_path = "uploads/"; // 上載位置
       
        /* 讀取上載檔案資訊 */
        $up_name = $_FILES["uploadedfile"]["name"];
        $up_size = $_FILES["uploadedfile"]["size"] / 1024 / 1024 . " MB";
        $up_type = $_FILES["uploadedfile"]["type"];
       
        /* 將檔案改名 */
        $random_chars = '1234567890abcdefghijklmnopqrstuvwxyz';
        for($i = 0; $i < 18; $i++){
        $random_num .= $random_chars[rand(0, 35)];
        }
        $new_up_name = $random_num . ".jpg";       
       
        if( move_uploaded_file( $_FILES["uploadedfile"]["tmp_name"],$target_path . $new_up_name ) ){
        /* 上載成功 */
        echo '<img width="200" src="uploads/' . $new_up_name . ' />';
}
        else{
        /* 上載失敗 */
        echo "Upload Fail!";
}
}
        else{
        /* 上載表單 */
?>
        <form enctype="multipart/form-data" action="upload.php?action=upload" method="POST">
        Choose a file to upload: <input name="uploadedfile" type="file" /><br />
        <input name="action" type="hidden" value="upload" />
        <input type="submit" value="Upload File" />
        </form>
<?
}
?>

原帖由 LikPan 於 2010-1-10 16:46 發表
始終功能不深,擔心安全性等問題,望各師兄看看如何改進。
不過關鍵就是改名的動作連副檔名也改了,有點頭痛
只能加個 jpg , 因為不想保留原有檔名的名字
但如果別人上載 text 也強行改成了 jpg

雖說可以換成 if 一個個測,但好像有點笨的做法呢
看看各師兄有無什麼方法建議...



- Detect MIME type of a file with FileInfo (http://www.php.net/manual/en/function.finfo-file.php)
- Prepare an associative array to map mime type to file extension, or use /etc/mime.types if your php code is hosted under Unix (http://stackoverflow.com/questio ... -a-mime-type-in-php)

TOP

原帖由 thinkpanda 於 2010-1-10 17:08 發表


- Detect MIME type of a file with FileInfo (http://www.php.net/manual/en/function.finfo-file.php)
- Prepare an associative array to map mime type to file extension, or use /etc/mime.types if your ph ...


我想到方法了   ,用  strrchr

<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Upload</title>
</head>

<body>

<?        
        /* 讀取 ACTION */
        $ufile = $_POST['action'];
        $action = $_GET['action'];
       
        /* 如果 POST 和 GET 都取得 ACTION 則執行上載動作 */
        if( $action == "upload" && $ufile == "upload" ){
        $target_path = "uploads/"; // 上載位置
       
        /* 讀取上載檔案資訊 */
        $up_name = $_FILES["uploadedfile"]["name"];
        $up_size = $_FILES["uploadedfile"]["size"] / 1024 / 1024 . " MB";
        $up_type = $_FILES["uploadedfile"]["type"];
       
        /* 將檔案改名 */
        $random_chars = '1234567890abcdefghijklmnopqrstuvwxyz'; // 隨機檔名
        for($i = 0; $i < 18; $i++){
        $random_num .= $random_chars[rand(0, 35)];
        }
        $up_name = strrchr( $up_name , "." ); // 讀取副檔名
        $new_up_name = $random_num . "$up_name";       
       
        /* 開始上載 */
        if( move_uploaded_file( $_FILES["uploadedfile"]["tmp_name"],$target_path . $new_up_name ) ){
       
        /* 上載成功 */
        echo '<img width="200" src="uploads/' . $new_up_name . ' /><br />';
        echo '檔案大小: ' . $up_size . '<br />';
        echo '檔案類型: ' . $up_type;
}
        else{
        /* 上載失敗 */
        echo "Upload Fail!";
}
}
        else{
        /* 上載表單 */
?>
        <form enctype="multipart/form-data" action="upload.php?action=upload" method="POST">
        Choose a file to upload: <input name="uploadedfile" type="file" /><br />
        <input name="action" type="hidden" value="upload" />
        <input type="submit" value="Upload File" />
        </form>
<?
}
?>

</body>

</html>

[ 本帖最後由 LikPan 於 2010-1-10 17:09 編輯 ]

TOP

不過因為我全部係同一頁執行,忽略左如果防止別人重覆提交表單,因為 cookies 好似只可以放最頂...

TOP

原帖由 LikPan 於 2010-1-10 17:09 發表


我想到方法了   ,用  strrchr


人地將個 file rename 咪 up 到上去囉

TOP

原帖由 hamu278 於 2010-1-10 17:57 發表

人地將個 file rename 咪 up 到上去囉


唔知有無理解錯師兄意思,但我的想法是:

假設原名 123.jpg
我用 rename 就連 jpg 都改埋
可能係 png , 所以我用果個方法先取得副檔名

TOP

最終搞到咁,整埋防上惡意重覆上載
雖然都知唔夠完善

<?       
        /* 讀取 ACTION */
        $ufile = $_POST['action'];
        $action = $_GET['action'];
       
        /* 設定Cookies 用作判斷是否再次上載 */
        if( $action == "upload" && $ufile == "upload" ){
        setcookie ("upload", "file", time()+10);
        }
?>
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Upload</title>
</head>

<body>

<?        

        /* 如果 POST 和 GET 都取得 ACTION 則執行上載動作 */
        if( $action == "upload" && $ufile == "upload" ){
        $target_path = "uploads/"; // 上載位置
       
        /* 讀取寫入資訊 */
        $subject = $_POST['subject'];
        $up_name = $_FILES["uploadedfile"]["name"];
        $up_size = $_FILES["uploadedfile"]["size"] / 1024 / 1024;
        $up_size = number_format( $up_size,2 ); // 只取小數後兩個位
        $up_type = $_FILES["uploadedfile"]["type"];
       
        /* 將檔案改名 */
        $random_chars = md5( uniqid( rand() ) ); // 產生唯一亂數
        $random_num = substr( $random_chars,0,12 ); // 只取頭十二個字串
        $up_name = strrchr( $up_name , "." ); // 讀取副檔名
        $new_up_name = $random_num . date("Ymd") * 2 / 10 . "$up_name"; // 新檔名
       
        /* 禁止檔案大過 2MB */
        if( $up_size >= 2 ){
?>
        <script language="JavaScript">
        alert('對不起,我們只容許 2MB 以下的檔案');
        window.location.href="upload.php";
        </script>
<?
        exit;
        }
       
        /* 使用之前的 Cookies 防止惡意重複上載 */
        elseif( isset( $_COOKIE["upload"]) ){
?>
        <script language="JavaScript">
        alert('對不起,重覆上載時間請不要少於10秒');
        window.location.href="upload.php";
        </script>
<?
        exit;
        }
        else{
                /* 開始上載 */
                if( move_uploaded_file( $_FILES["uploadedfile"]["tmp_name"],$target_path . $new_up_name ) ){
               
                /* 上載成功 */
                echo '<div align="center"><br /><br /><br />';
                echo $subject . "<br />";
                echo '<img width="200" src="uploads/' . $new_up_name . '" /><br /><br />';
                echo '<a href="uploads/' . $new_up_name . ' />觀看原始大小</a><br />';
                echo '檔案名稱: ' . $new_up_name . '<br />';
                echo '檔案大小: ' . $up_size . ' MB<br />';
                echo '檔案類型: ' . $up_type;
                echo '</div>';
                }
                else{
                /* 上載失敗 */
                echo "Upload Fail!";
                        }
                }
        }
        else{
        /* 上載表單 */
?>
        <form enctype="multipart/form-data" action="upload.php?action=upload" method="POST">
        Subject: <input name="subject" type="text" /><br />
        Choose a file : <input name="uploadedfile" type="file" /><br />
        <input name="action" type="hidden" value="upload" />
        <input type="submit" value="Upload File" />
        </form>
<?
}
?>

</body>

</html>

[ 本帖最後由 LikPan 於 2010-1-10 19:32 編輯 ]

TOP

原帖由 LikPan 於 2010-1-10 18:09 發表


唔知有無理解錯師兄意思,但我的想法是:

假設原名 123.jpg
我用 rename 就連 jpg 都改埋
可能係 png , 所以我用果個方法先取得副檔名


人地咪可以 upload 個 .exe file,甚至 .php file…?

TOP

原帖由 hamu278 於 2010-1-10 19:56 發表


人地咪可以 upload 個 .exe file,甚至 .php file…?


其實係我未限制只能上載圖片
呢一 part 晏少少搞埋

TOP

我知.net 裡面有個method, 唔知php有無
string[] splitName = fileNameString.Split('.');
string fileType = splitName[splitName.Length-1];

[ 本帖最後由 darren05 於 2010-1-10 21:08 編輯 ]

TOP