当先锋百科网

首页 1 2 3 4 5 6 7

在PHP编程中,stristr是一个非常常用的函数,用于在字符串中查找指定的文本,可以不区分大小写。但是,在某些情况下,stristr函数也可能被黑客用于攻击,进行一些不匹配的字符串匹配攻击。本文将讲解stristr函数如何被绕过,并提供避免被攻击的方法。

stristr函数可以检索字符串中的指定文本,并返回以该文本结尾的所有文本。因此,在不严格要求字符串的精确匹配的情况下,它是一个非常便利的函数。下面是一个例子,用于查找一个字符串中是否包括某个文本:

$fruit = "apple,pear,orange";
if(stristr($fruit,"pear")){
echo "找到了!";
}else{
echo "没有找到。";
}

使用上面的代码,当字符串$fruit中包含单词"pear"时,它将会输出“找到了!”;否则,将输出“没有找到。”。

然而,stristr函数也有一些漏洞,它可能被一些恶意用户用于攻击。比如,当它用于对系统文件进行保护时,就可能引发安全性问题。

举个例子,如果我们想防止用户访问某个文件夹中的所有文件,可以使用如下代码:

if(stristr($_REQUEST['folder'],'/../../')){
die("非法访问!");
}

虽然这样的代码看起来十分安全,但是,问题在于每个访问该页面的用户都可以通过在URL中添加"/../../"来实现直接访问受限文件夹中的文件。因为,当用户访问页面时,其请求数据会被解释成字符串,而如果这个字符串中包含"/../../",stristr函数将会返回该文本并被if语句视为“存在”,这样便可以让不受限制的请求通过访问了。

为了避免这样的攻击,我们应该避免使用stristr函数。相反,我们可以使用路径检查函数,如realpath(),以确定文件是否在网站的根目录中。

$folder = $_REQUEST['folder'];
$absPath = realpath($folder);
if(strpos($absPath,$_SERVER['DOCUMENT_ROOT']) === 0){
// 存在于根目录中
}else{
// 不在根目录中无法访问
}

使用realpath函数,我们可以获得绝对路径,并使用strpos函数检查绝对路径是否包含DOCUMENT_ROOT,如果DOCUMENT_ROOT是该字符串的开始,就说明该文件存在于网站根目录中。

总之,虽然stristr函数非常方便,但如果在关键位置中使用,就可能被攻击者用于绕过系统的安全检查。因此,我们应该选择更安全的替代方案,以确保网站和系统的安全。