在PHP中,我需要使用用户的输入作为文件夹的标题。
例如:
$foldername = $_REQUEST["foldername"];
mkdir("./userfolders/".$foldername);
因为,我看到的一个问题是输入可能包含“../”,这会导致文件夹被写入父目录,这是我不想要的。我对此的解决方案是str_replace
远离字符串中的所有正斜杠。
我错过了其他任何漏洞吗?
答案 0 :(得分:1)
理想的方法是不接受所有IMO的用户输入。除了取决于文件系统的其他漏洞(例如Windows的反斜杠?),你可能遇到其他问题的世界,如字符集问题 - 想想♥♥♥♥♥♥♥♥♥♥♥
,例如:它是一个完全有效的UTF- 8弦......
如果您手头有数据库,更安全的方法是在那里存储用户输入,并在数据库记录的唯一ID之后命名目录。
如果这不切实际:我一直喜欢的一个可接受的妥协是urlencode()
用户输入,这将保证您不会在文件系统中遇到有问题的字符。您仍然需要清楚使用哪种编码(否则您之后使用的urldecode()
将显示目录名称将返回损坏的数据),否则,这应该可以正常工作。以这种方式创建的目录也可以通过浏览器访问,因为URL中的特殊字符无论如何都会得到urlencode()
。
答案 1 :(得分:1)
是否有可能在文件夹名称变量上使用urlencode
功能。
向用户显示文件夹后,您可以使用urldecode
。
$foldername = urlencode($_REQUEST["foldername"]);
mkdir("./userfolders/".$foldername);
// Show folder name
echo urldecode($foldername);