Skip to content
← Back to Functions
Code

File Name Sanitizer

Creates safe storage filenames from uploads while preserving useful extension metadata.

Function signature

ogSanitizeStorageFileName(original_filename, allowed_extensions = array(), prefix = 'file')

Categories

  • Security

Parameters

original_filenameOriginal client filename.allowed_extensionsAllowed lowercase file extensions.prefixOptional filename prefix.

Return value

Short public-safe status message.

  • filename
  • extension
  • original_basename

Compatibility

Existing function name and call order preserved; metadata signature corrected to source.

Minimum PHP version: 7.4

Security notes

Validate request method, identity, permissions, and caller-owned allowlists before use; keep secrets and internal paths out of public output.

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.
 */

/**
 * Creates a safe randomized storage filename from an original uploaded filename.
 *
 * @param string $original_filename Original client filename.
 * @param array $allowed_extensions Allowed lowercase file extensions.
 * @param string $prefix Optional filename prefix.
 * @return array Safe filename result.
 */
function ogSanitizeStorageFileName($original_filename, $allowed_extensions = array(), $prefix = 'file') {
	$result = array(
		'success' => false,
		'message' => '',
		'data' => array()
	);

	$original_filename = trim((string)$original_filename);
	$prefix = strtolower(trim((string)$prefix));
	$prefix = preg_replace('/[^a-z0-9_\-]+/', '-', $prefix);
	$prefix = trim($prefix, '-');

	if (empty($prefix)) {
		$prefix = 'file';
	}

	if (!is_array($allowed_extensions)) {
		$allowed_extensions = array();
	}

	if (empty($original_filename)) {
		$result['message'] = 'Missing original filename.';
		return $result;
	}

	$basename = basename(str_replace('\\', '/', $original_filename));
	$extension = strtolower(pathinfo($basename, PATHINFO_EXTENSION));

	if (empty($extension)) {
		$result['message'] = 'Filename extension is required.';
		return $result;
	}

	if (!preg_match('/^[a-z0-9]{1,12}$/', $extension)) {
		$result['message'] = 'Filename extension is invalid.';
		return $result;
	}

	if (!empty($allowed_extensions) && !in_array($extension, $allowed_extensions, true)) {
		$result['message'] = 'Filename extension is not allowed.';
		return $result;
	}

	$random = bin2hex(random_bytes(16));
	$safe_filename = $prefix . '-' . date('YmdHis') . '-' . $random . '.' . $extension;

	$result['success'] = true;
	$result['message'] = 'Storage filename created.';
	$result['data'] = array(
		'filename' => $safe_filename,
		'extension' => $extension,
		'original_basename' => $basename
	);

	return $result;
}