因此,我们古老的 Web 应用程序设法通过了年度代码审查,并以最少的危险信号。其中一个可能的安全风险是下面的这个函数,它获取用户的会话信息。
private function getJobTrackerSessionInfo()
{
// Get session data from database
$query ='SELECT `a_session` FROM `sessions` WHERE id = ?';
$a_session = $this->db->getOne($query,null,array(session_id()));
//not logged in returns false
if(empty($a_session)) return array();
//convert session stuff from the database into a php array
$a_session = str_replace("{","array(",$a_session);
$a_session = str_replace("}",")",$a_session);
$a_session = str_replace(";\$D","",$a_session);
@eval($a_session);
return $D;
}
这个私有函数调用是在 CSRF 令牌验证之后完成的。我是 PHP 和 SQL 数据库调用的新手。我可以理解它,但就安全地写作而言,我已经脱离了我的元素。目前这是一个运行在 PHP 5 中的 Web 应用程序,但我们确实计划在夏天将其升级到 7+。
我在这里阅读了这个 Stackoverflow 线程: 如何防止 PHP 中的 SQL 注入?
它可能已经过时了,但下面的用户回复有很多关于折旧和最新的预防方法的有用信息。
是否有一个很好的更新解决方案来防止在此特定查询和评估期间进行任何类型的注入?
编辑:删除eval()
函数调用似乎可以帮助保护这一点,但兔子洞更深。
getOne()
应该被调用并填充 a_session。但是,我似乎无法找到该getOne()
功能所在的位置。我确实发现它属于某种 sql dev api,可以在这里查看:https ://www.php.net/manual/en/mysql-xdevapi-collection.getone.php
编辑 2:从 dumping$a_session
中,我发现它是编写的代码,用于将值数组应用$D
为一个字符串,以在eval()
Okay 中执行,这似乎很明显,但它不仅包含 $_SESSION 信息参数,还包含用户和令牌信息。我猜作者最初的想法是在分配和返回它们时隐藏那些敏感的用户值?
我可以只解析字符串,分配array(a bunch of values)
一个值,然后 $D = $myParsedArray. $myParsedArray 仍然会被解释为字符串,对吧?
我需要考虑这个。我会发布任何进展的更新。