2016-11-16 13 views
0

ファイルのアップロードを承認しているPHPに問題があります。ユーザーに.xmlファイルのみをアップロードさせたい。しかし、それは動作しません。ここでmime経由でxmlファイルのphpファイルのアップロード制限

は私のHTMLフォームです:

<form action="upload2.php" method="post" enctype="multipart/form-data"> 
    Wähle deine Sprachdatei aus: 
    <input type="file" class="form-control-file" name="upfile"> 
    <br> 
    <input type="submit" class="btn btn-primary" value="Sprachdatei hochladen" name="submit"> 
</form> 

、ここでは、MIMEタイプを経由してファイルを制御するために、私のPHPです:シンプルJPGやPNGと

<?php 
header('Content-Type: text/plain; charset=utf-8'); 
try { 

// Undefined | Multiple Files | $_FILES Corruption Attack 
// If this request falls under any of them, treat it invalid. 
if (
    !isset($_FILES['upfile']['error']) || 
    is_array($_FILES['upfile']['error']) 
) { 
    throw new RuntimeException('Invalid parameters.'); 
} 

// Check $_FILES['upfile']['error'] value. 
switch ($_FILES['upfile']['error']) { 
    case UPLOAD_ERR_OK: 
     break; 
    case UPLOAD_ERR_NO_FILE: 
     throw new RuntimeException('No file sent.'); 
    case UPLOAD_ERR_INI_SIZE: 
    case UPLOAD_ERR_FORM_SIZE: 
     throw new RuntimeException('Exceeded filesize limit.'); 
    default: 
     throw new RuntimeException('Unknown errors.'); 
} 

// You should also check filesize here. 
if ($_FILES['upfile']['size'] > 1000000) { 
    throw new RuntimeException('Exceeded filesize limit.'); 
} 

// DO NOT TRUST $_FILES['upfile']['mime'] VALUE !! 
// Check MIME Type by yourself. 
$finfo = new finfo(FILEINFO_MIME_TYPE); 
if (false === $ext = array_search(
     $finfo->file($_FILES['upfile']['tmp_name']), 
     array(
      'xml' => 'text/xml', 
      'txt' => 'text/plain', 

     ), 
     true 
    )) { 
    throw new RuntimeException('Invalid file format.'); 
} 

// You should name it uniquely. 
// DO NOT USE $_FILES['upfile']['name'] WITHOUT ANY VALIDATION !! 
// On this example, obtain safe unique name from its binary data. 
if (!move_uploaded_file(
    $_FILES['upfile']['tmp_name'], 
    sprintf('./uploads/%s.%s', 
     sha1_file($_FILES['upfile']['tmp_name']), 
     $ext 
    ) 
)) { 
    throw new RuntimeException('Failed to move uploaded file.'); 
} 

echo 'File is uploaded successfully.'; 
} catch (RuntimeException $e) { 
echo $e->getMessage(); 
} 
?> 

それがXMLで動作しますが、ではありません。 私はMIMEタイプをチェックし、それはまだ私はPHP

を実行するには、Windows上でXAMPPを使用してい

を働いていないがあなたの助けをいただき、ありがとうございます。

+0

場合'$ finfo->ファイル($ _ FILES ['upfile'] ['tmp_name'])'が実際に返すものをチェックしましたか? –

+0

申し訳ありません。私はPHPのlernerです。どうすれば確認できますか? – Joscha

答えて

0

$finfo->file()は、xmlファイルの場合はtext/xmlの代わりにapplication/xmlを返します。

これに有効なMIMEタイプを使用して、配列を変更し

array(
    'xml' => 'application/xml', 
    'txt' => 'text/plain', 
), 
+0

ありがとうございました:) – Joscha

-1

以下のコードで試してみてください。ファイルの拡張子がコード上で正しく取得されていました。

(ベース名($ _ FILES [ "upfile"] [ "名前"] ) )!move_uploaded_file( $ _FILES [ 'upfile'] [ 'tmp_name']、 'アップロード/')

+0

これは彼の質問にどのように関連していますか? –

+0

ローカルマシンでチェックしたところ、ファイルは拡張子なしでアップロードされていました。 –

+0

それは問題ありません。しかし、それは彼の質問ではありませんでした。彼はMIMEタイプのアップロードを制限したいと思っていました。とにかく、彼は彼のために働く答えを得ました。 –

関連する問題