清理字符串以使它们的URL和文件名安全吗?

我正在尝试提出一个功能,该功能可以很好地清理某些字符串,以使它们可以安全地在URL中使用(如post slug),也可以安全地用作文件名。例如,当有人上传文件时,我要确保我从名称中删除所有危险字符。


到目前为止,我已经提出了以下功能,希望该功能可以解决此问题,并允许外来UTF-8数据。


/**

 * Convert a string to the file/URL safe "slug" form

 *

 * @param string $string the string to clean

 * @param bool $is_filename TRUE will allow additional filename characters

 * @return string

 */

function sanitize($string = '', $is_filename = FALSE)

{

 // Replace all weird characters with dashes

 $string = preg_replace('/[^\w\-'. ($is_filename ? '~_\.' : ''). ']+/u', '-', $string);


 // Only allow one dash separator at a time (and make string lowercase)

 return mb_strtolower(preg_replace('/--+/u', '-', $string), 'UTF-8');

}

有没有人可以针对此运行任何棘手的示例数据-或知道一种更好的方法来保护我们的应用程序免受不良影响?


$ is-filename允许一些其他字符,例如temp vim文件


更新:删除了星号,因为我无法想到有效的用法


犯罪嫌疑人X
浏览 439回答 3
3回答

小怪兽爱吃肉

这应该使您的文件名安全...$string = preg_replace(array('/\s/', '/\.[\.]+/', '/[^\w_\.\-]/'), array('_', '.', ''), $string);一个更深层的解决方案是:// Remove special accented characters - ie. sí.$clean_name = strtr($string, array('Š' => 'S','Ž' => 'Z','š' => 's','ž' => 'z','Ÿ' => 'Y','À' => 'A','Á' => 'A','Â' => 'A','Ã' => 'A','Ä' => 'A','Å' => 'A','Ç' => 'C','È' => 'E','É' => 'E','Ê' => 'E','Ë' => 'E','Ì' => 'I','Í' => 'I','Î' => 'I','Ï' => 'I','Ñ' => 'N','Ò' => 'O','Ó' => 'O','Ô' => 'O','Õ' => 'O','Ö' => 'O','Ø' => 'O','Ù' => 'U','Ú' => 'U','Û' => 'U','Ü' => 'U','Ý' => 'Y','à' => 'a','á' => 'a','â' => 'a','ã' => 'a','ä' => 'a','å' => 'a','ç' => 'c','è' => 'e','é' => 'e','ê' => 'e','ë' => 'e','ì' => 'i','í' => 'i','î' => 'i','ï' => 'i','ñ' => 'n','ò' => 'o','ó' => 'o','ô' => 'o','õ' => 'o','ö' => 'o','ø' => 'o','ù' => 'u','ú' => 'u','û' => 'u','ü' => 'u','ý' => 'y','ÿ' => 'y'));$clean_name = strtr($clean_name, array('Þ' => 'TH', 'þ' => 'th', 'Ð' => 'DH', 'ð' => 'dh', 'ß' => 'ss', 'Œ' => 'OE', 'œ' => 'oe', 'Æ' => 'AE', 'æ' => 'ae', 'µ' => 'u'));$clean_name = preg_replace(array('/\s/', '/\.[\.]+/', '/[^\w_\.\-]/'), array('_', '.', ''), $clean_name);假设您要在文件名中添加一个点。如果您希望将其转换为小写字母,只需使用$clean_name = strtolower($clean_name);最后一行。
打开App,查看更多内容
随时随地看视频慕课网APP