Skip to content
← Back to Snippets
Code

MIME Policy Enforcement Map

Maps uploaded filenames and detected MIME values to allow, reject, or review decisions.

Purpose

Maps uploaded filenames and detected MIME values to allow, reject, or review decisions.

Snippet details

ContextUploadLevelAdvancedCopy-and-paste statusMarked safe after review.

Categories

  • Security

Code

<?php

/*
 * Copyright (c) 2026 Jeffery L. Paris <jparis@phpog.com>.
 * Free for personal and internal use. Paid project use requires visible credit
 * to Jeffery L. Paris. Corporate use requires a paid license fee unless a
 * separate written license states otherwise.
 */

/**
 * MIME Policy Enforcement Map.
 *
 * Purpose:
 * Maps uploaded filenames and detected MIME values to allow, reject, or review decisions.
 *
 * @param array $upload_rows Upload rows with filename and mime values.
 * @param array $allowed_mime_by_extension MIME allowlist keyed by extension.
 * @return array Enforcement decisions.
 */
function ogSnippetMimePolicyEnforcementMap(array $upload_rows, array $allowed_mime_by_extension): array {
	$decisions = array();
	foreach ($upload_rows as $upload_row) {
		$filename = (string) $upload_row['filename'];
		$mime = strtolower(trim((string) $upload_row['mime']));
		$extension = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
		$decision = 'reject';
		$reason = 'extension_not_allowed';
		if (isset($allowed_mime_by_extension[$extension])) {
			if (in_array($mime, $allowed_mime_by_extension[$extension], true)) {
				$decision = 'allow';
				$reason = 'mime_matches_extension';
			} else {
				$reason = 'mime_mismatch';
			}
		}
		$decisions[] = array('filename' => $filename, 'mime' => $mime, 'decision' => $decision, 'reason' => $reason);
	}
	return $decisions;
}

$uploads = array(array('filename' => 'chevron-map.svg', 'mime' => 'image/svg+xml'));
$policy = array('svg' => array('image/svg+xml'), 'webp' => array('image/webp'));
$mime_map = ogSnippetMimePolicyEnforcementMap($uploads, $policy);
echo $mime_map[0]['decision'];