我读过关于空字节\ 0并且读到有关file_exists不安全的信息......有人可以告诉我这个代码是否安全:或者我该如何解决?
if (file_exists('controllers/' . $controller . '.php'))
这是_action(“controller”)变量,基本上这就是$ controller被验证的内容:
$_action = ( (isset($_GET['r']) && ctype_alnum($_GET['r'])) ? $_GET['r'] : $_default );
答案 0 :(得分:2)
php > $a = "abc\0def";
php > echo strlen($a);
7
PHP基于libc,但也比libc更聪明,并且知道它的字符串有多长,并且不会受到可注入空值的影响。话虽如此,并非所有的PHP扩展都是相同的,有些可能会遇到问题,所以问题的答案是......“这取决于”。
至于文件存在,它和你想要的一样安全。如果你用来生成一个临时文件,比如:
$tmp_name = "some random value";
if (!file_exists($tmp_name)) {
file_put_contents($tmp_name, "something very critical");
}
非常不安全。在file_exists返回时间的一小部分时间内,“nope,文件不存在”,并且每当file_put_contents开始执行时,恶意用户都可以操纵事物,以便输出完全不同。
答案 1 :(得分:0)
是的,这非常安全,因为它不能包含/
或.
等特殊字符