/**
  * 判断变量的净化情况
  * 返回:
  * 		(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;
     }
 }