function encryptDecrypt($key, $string, $decrypt) {
if ($decrypt) {
return rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($string), MCRYPT_MODE_CBC, md5(md5($key))), "\0");
} else {
return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key))));
}
}
// 使用
$enc = encryptDecrypt('pwd', 'Hello世界', 0);
$dec = encryptDecrypt('pwd', $enc, 1);
⚠️mcrypt已棄用(PHP 7.2+ 移除),新專案請改用openssl_encrypt(AES-256-GCM)。
function generateRandomString($len = 10) {
$chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$str = '';
for ($i = 0; $i < $len; $i++) $str .= $chars[random_int(0, strlen($chars)-1)];
return $str;
}
function getExtension($fn) { return pathinfo($fn, PATHINFO_EXTENSION); }
function formatSize($bytes) {
$units = ['B','KB','MB','GB','TB','PB'];
for ($i=0; $bytes>=1024 && $i
function stringParser($tpl, $map) {
return str_replace(array_keys($map), array_values($map), $tpl);
}
function listDirFiles($dir) {
foreach (new DirectoryIterator($dir) as $f) if (!$f->isDot() && !$f->isDir()) echo $f->getFilename().'<br>';
}
function curPageURL() {
$proto = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS']!=='off') ? 'https' : 'http';
$port = ($_SERVER['SERVER_PORT']=='80') ? '' : ':'.$_SERVER['SERVER_PORT'];
return $proto.'://'.$_SERVER['HTTP_HOST'].$port.$_SERVER['REQUEST_URI'];
}
function download($file) {
if (!file_exists($file)) return false;
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.basename($file).'"');
header('Content-Length: '.filesize($file));
readfile($file);
exit;
}
function msubstr($str, $start=0, $len=15, $charset='utf-8', $suffix=true) {
if (function_exists('mb_substr')) return mb_substr($str,$start,$len,$charset).($suffix?'…':'');
if (function_exists('iconv_substr')) return iconv_substr($str,$start,$len,$charset).($suffix?'…':'');
// 兜底簡易實作略
}
function getClientIp() {
$keys = ['HTTP_X_FORWARDED_FOR','HTTP_CLIENT_IP','REMOTE_ADDR'];
foreach ($keys as $k) {
if (!empty($_SERVER[$k])) {
$ips = explode(',', $_SERVER[$k]);
foreach ($ips as $ip) {
$ip = trim($ip);
if ($ip!=='unknown' && filter_var($ip, FILTER_VALIDATE_IP)) return $ip;
}
}
}
return '0.0.0.0';
}
function injCheck($sql) {
return preg_match('/(select|insert|update|delete|union|into|load_file|outfile)/i', $sql) ? false : $sql;
}
function message($title, $msg, $url) {
echo "<meta charset='utf-8'><script>alert('$msg'); location.href='$url';</script>";
}
function sec2hms($s) {
$h = floor($s/3600); $m = floor(($s%3600)/60); $sec = $s%60;
return sprintf('%02d:%02d:%02d', $h, $m, $sec);
}
illuminate/support (Str, Arr, Collection)nesbot/carbonleague/flysystemrespect/validationdefuse/php-encryption (AES-256-GCM)geoip2/geoip2建議新專案直接引入成熟庫,避免重複造輪子並享受持續維護。