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