我试图使我的文件uploades更安全,以便不会破坏任何链接。我试过编写一个代码,首先删除所有坏的url字符,如果存在相同的名称,它应该增加文件名后面的数字。
我的代码可以正常使用重复名称上增加的数字,但字符串如下:嗨这是一个测试 - 不会更改为hithisisatest
我尝试运行的代码如下:
if ($myFile["error"] !== UPLOAD_ERR_OK) {
CUSTOM HEADER
exit;
}
// ensure a safe filename
$name = preg_replace("/[^a-z0-9_\.\-[:space:]]/i", "_", $myFile["name"]);
// don't overwrite an existing file
$i = 0;
$parts = pathinfo($name);
while (file_exists(UPLOAD_DIR . $name)) {
$i++;
$name = $parts["filename"] . "-" . $i . "." . $parts["extension"];
}
// preserve file from temporary directory
$success = move_uploaded_file($myFile["tmp_name"],
UPLOAD_DIR . $name);
if (!$success) {
CUSTOM HEADER
exit;
}
答案 0 :(得分:0)
您在preg_replace
中使用的正则表达式旨在将一些选定的字符(abc等)保留在$name
中,并用下划线替换所有其他(“坏”)字符:
$name = preg_replace("/[^a-z0-9_\.\-[:space:]]/i", "_", $myFile["name"]);
由于[:space:]
列在这些字符中,因此hi this is a test
等名称的空格保持不变应该不足为奇。
删除[:space:]
,您将获得hi_this_is_a_test
文件名hi this is a test
。
$name = preg_replace("/[^a-z0-9_\.\-]/i", "_", $myFile["name"]);
// hi_this_is_a_test
如果您真的想明确删除问题中暗示的“不良”字符,您还应该在""
调用中将替换字符串设置为"_"
而不是reg_replace
$name = preg_replace("/[^a-z0-9_\.\-]/i", "", $myFile["name"]);
// hithisisatest