/** * 判断变量的净化情况 * 返回: * (1)如果没有有效的净化,返回false * (2)如果进行了有效的净化,返回true * (3)如果净化数组为null,返回false * @param symbol $var 判断的变量 * @param array $saniArr 判断的净化数组 * @return bool true说明净化正确 false说明没有净化 */ private function check_sanitization($var, $saniArr) { //CMS的编码 global $encoding; //如果数组为空,说明没有进行任何净化 if (count($saniArr) == 0) { return false; } //判断宽字节注入 //encoding为GBK,并且调用顺序为addslashes => iconv $flag = false; foreach ($saniArr as $value) { if ($value->funcName == 'iconv') { $flag = true; } } if ($flag && $encoding == 'GBK') { $iconv_pos = array_search('iconv', $saniArr); $slashes_list = array('addslashes', 'mysql_escape_string'); $position = SecureUtils::findFirstPosition($saniArr, $slashes_list); if ($position !== false && $iconv_pos > $position) { return true; } } //插件式判别,如果判别为真,则说明有效净化过 if (SecureUtils::checkSanitiByArr("SQLI", $saniArr)) { return true; } //数值型注入,转义无效 if ($var->getType() == "valueInt" && in_array("addslashes", $saniArr)) { return false; } return false; }
/** * 判断变量的净化情况 * 返回: * (1)如果没有有效的净化,返回false * (2)如果进行了有效的净化,返回true * (3)如果净化数组为null,返回false * @param symbol $var 判断的变量 * @param array $saniArr 判断的净化数组 * @return bool true */ private function check_sanitization($var, $saniArr) { //如果数组为空,说明没有进行任何净化 if (count($saniArr) == 0) { return false; } else { if (SecureUtils::checkSanitiByArr("INCLUDE", $saniArr)) { //如果判别为真,则说明有效净化过 return true; } else { return false; } } }
/** * 将回溯中获取的用户定义sink函数传入 * key为函数名,value为参数的位置 * @param Array $item array(PDF,array(0,1)) * @param string $type=>() */ public function addByTagName($item, $type) { if (!in_array($type, array('XSS', 'SQLI', 'HTTP', 'CODE', 'EXEC', 'LDAP', 'INCLUDE', 'FILE', 'XPATH', 'FILEAFFECT'))) { return; } $securings = SecureUtils::getSecureListByType($type); switch ($type) { case 'XSS': //这个函数已经存在,则增加函数的危险位置 if (array_key_exists($item[0], $this->F_XSS)) { $this->F_XSS[$item[0]] = array(array_merge($this->F_XSS[$item[0]], $item[1])); } else { $this->F_XSS[$item[0]] = array($item[1]); } array_push($this->F_XSS[$item[0]], $securings); break; case 'SQLI': if (array_key_exists($item[0], $this->F_DATABASE)) { $this->F_DATABASE[$item[0]] = array(array_merge($this->F_DATABASE[$item[0]], $item[1])); } else { $this->F_DATABASE[$item[0]] = array($item[1]); } array_push($this->F_DATABASE[$item[0]], $securings); break; case 'HTTP': if (array_key_exists($item[0], $this->F_HTTP_HEADER)) { $this->F_HTTP_HEADER[$item[0]] = array(array_merge($this->F_HTTP_HEADER[$item[0]], $item[1])); } else { $this->F_HTTP_HEADER[$item[0]] = array($item[1]); } array_push($this->F_HTTP_HEADER[$item[0]], $securings); break; case 'CODE': if (array_key_exists($item[0], $this->F_CODE)) { $this->F_CODE[$item[0]] = array(array_merge($this->F_CODE[$item[0]], $item[1])); } else { $this->F_CODE[$item[0]] = array($item[1]); } array_push($this->F_CODE[$item[0]], $securings); break; case 'EXEC': if (array_key_exists($item[0], $this->F_EXEC)) { $this->F_EXEC[$item[0]] = array(array_merge($this->F_EXEC[$item[0]], $item[1])); } else { $this->F_EXEC[$item[0]] = array($item[1]); } array_push($this->F_EXEC[$item[0]], $securings); break; case 'LDAP': if (array_key_exists($item[0], $this->F_LDAP)) { $this->F_LDAP[$item[0]] = array(array_merge($this->F_LDAP[$item[0]], $item[1])); } else { $this->F_LDAP[$item[0]] = array($item[1]); } array_push($this->F_LDAP[$item[0]], $securings); break; case 'INCLUDE': if (array_key_exists($item[0], $this->F_FILE_INCLUDE)) { $this->F_FILE_INCLUDE[$item[0]] = array(array_merge($this->F_FILE_INCLUDE[$item[0]], $item[1])); } else { $this->F_FILE_INCLUDE[$item[0]] = array($item[1]); } array_push($this->F_FILE_INCLUDE[$item[0]], $securings); break; case 'FILE': if (array_key_exists($item[0], $this->F_FILE_READ)) { $this->F_FILE_READ[$item[0]] = array(array_merge($this->F_FILE_READ[$item[0]], $item[1])); } else { $this->F_FILE_READ[$item[0]] = array($item[1]); } array_push($this->F_FILE_READ[$item[0]], $securings); break; case 'XPATH': if (array_key_exists($item[0], $this->F_XPATH)) { $this->F_XPATH[$item[0]] = array(array_merge($this->F_XPATH[$item[0]], $item[1])); } else { $this->F_XPATH[$item[0]] = array($item[1]); } array_push($this->F_XPATH[$item[0]], $securings); break; case 'FILEAFFECT': if (array_key_exists($item[0], $this->F_FILE_AFFECT)) { $this->F_FILE_AFFECT[$item[0]] = array(array_merge($this->F_FILE_AFFECT[$item[0]], $item[1])); } else { $this->F_FILE_AFFECT[$item[0]] = array($item[1]); } array_push($this->F_FILE_AFFECT[$item[0]], $securings); break; } }