<?php
/**
*Class Agent - P.W.S.M.
*Author Roman Shneer romanshneer@gmail.com
*1.02.2012
*changed 01.11.2015
*/
Class Agent
{
var $db,$db_type,$object,$templates;
function Agent()
{
$dir=$this->find_agent_library();
$this->include_agent_library($dir);
$this->register_agent();
$this->load_templates();
$this->chk_request();
$this->kill_agent();
}
function db_unloaded()
{
$this->legalprocess=false;
return false;
}
function kill_agent()
{
if($this->db_type=='mysql')
{
mysqli_close($this->db);
}elseif($this->db_type=='postgresql')
{
pg_close($this->db);
}
unset($this);
}
function chrH($vars){
$vars_after=$this->chk_variables_via_pattern($vars);
if($vars_after!=$vars)
{
$this->reg_bad_request($vars,$vars_after);
$vars=$vars_after;
}elseif(!$this->object->stoped_only){
$this->reg_request($vars);
}
return $vars;
}
function chk_request()
{
switch($_SERVER['REQUEST_METHOD'])
{
case 'GET':
if($this->object->GET)
{
if(count($_GET)){
$_GET=$this->chrH($_GET);
}
elseif(!$this->object->stoped_only)$this->reg_request($_GET);
}
break;
case 'POST':
if($this->object->POST)
{
if(count($_POST)) $_POST=$this->chrH($_POST);
elseif(!$this->object->stoped_only)$this->reg_request($_POST);
}
break;
case 'COOKIE':
if($this->object->COOKIE)
{
if(count($_COOKIE))$_COOKIE=$this->chrH($_COOKIE);
elseif(!$this->object->stoped_only)$this->reg_request($_COOKIE);
}
break;
}
}
function reg_bad_request($value,$new_value)
{
#$pattern=$template->code;
$reason="Request <b>".$this->Q($_SERVER['REQUEST_URI'])."</b>
Blocked value <b>".htmlspecialchars(print_r($value,1))."</b>
Changed to <b>".htmlspecialchars(print_r($new_value,1))."</b>";
$qs="http://".$_SERVER['SERVER_NAME'].$_SERVER['SCRIPT_NAME']."?".$_SERVER['QUERY_STRING'];
$url="http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
$vars=($_SERVER['REQUEST_METHOD']=='POST')?$_POST:$_GET;
$vars=mysql_real_escape_string(serialize($vars));
$sql="INSERT INTO pwsm_requests (url,method,query_string,reason,status,object_id,created,remote_addr,vars) "
. "VALUES ('".$this->Q($url)."','".$this->Q($_SERVER['REQUEST_METHOD'])."','".$this->Q($qs)."','".$this->Q($reason)."',1,".$this->object->id.",".time().",'".$this->Q($_SERVER['REMOTE_ADDR'])."','".$vars."')";
$idd=$this->QUERY($sql);
}
function reg_request($variables=array())
{
$names=array_keys($variables);
$reason="Request Accepted";
if(count($variables))$reason.="<br>variables accepted:<br>";
foreach($names as $name){$reason.="<br><font color='red'>".$name."</font>";}
#print_r($_SERVER);
$qs="http://".$_SERVER['SERVER_NAME'].$_SERVER['SCRIPT_NAME']."?".$_SERVER['QUERY_STRING'];
$url="http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
$vars=($_SERVER['REQUEST_METHOD']=='POST')?$_POST:$_GET;
$vars=mysql_real_escape_string(serialize($vars));
$sql="INSERT INTO pwsm_requests (url,method,query_string,reason,status,object_id,created,remote_addr,vars) "
. "VALUES ('".$this->Q($url)."','".$this->Q($_SERVER['REQUEST_METHOD'])."','".$this->Q($qs)."','".$this->Q($reason)."',0,".$this->object->id.",".time().",'".$this->Q($_SERVER['REMOTE_ADDR'])."','".$vars."')";
#die($sql);
$this->QUERY($sql);
}
function chk_variables_via_pattern($variables)
{
if(count($variables))
{
foreach($variables as $name=>$value)
{
$vars[$name]=$value;
if($this->templates)
{
foreach($this->templates as $template)
{
$pattern=$template->code;
if(stristr($value,$pattern)||stristr($value,"%".bin2hex($pattern)))
{
$new_value=substr($value,0,strpos($value,$pattern)).substr($value,strpos($value,$pattern)+strlen($pattern),strlen($value)-strpos($value,$pattern)+strlen($pattern));
$vars[$name]=$new_value;
$value=$new_value;
}
}
}
}
}
if(isset($new_value))
{
return $this->chk_variables_via_pattern($vars);
}else return $vars;
}
function load_templates()
{
$sql="SELECT *
FROM pwsm_templates
WHERE status=1";
$this->templates=$this->LIST_Q($sql);
}
function register_agent()
{
$this->object=$this->chk_agent_object_registration($_SERVER['SCRIPT_FILENAME']);
}
function chk_agent_object_registration($source)
{
return $this->ROW_Q("SELECT * FROM pwsm_objects WHERE object_source='".$this->Q($source)."'");
}
function find_agent_library()
{
$files=get_included_files();
foreach($files as $file)
{
if(strstr($file,"agent.php"))
{
return substr($file,0,strrpos($file,"agent.php"));
}
}
}
function include_agent_library($dir)
{
include_once $dir."conf/config.php";
$this->db=$this->db_load($db_type,$db_host,$db_name,$db_user,$db_pass);
}
function db_load($db_type,$db_host,$db_name,$db_user,$db_password)
{
$this->dbtype=$db_type;
if($db_type=='mysql')
{
if($conn=mysqli_connect($db_host,$db_user,$db_password,$db_name))
{
#mysql_select_db($db_name,$conn);
return $conn;
}else{
return $this->db_unloaded();
}
}elseif($db_type=='postgresql')
{
$dbstring="host=".$db_host." port=5432 dbname=".$db_name." user=".$db_user." password=".$db_password;
if($conn=@pg_connect($dbstring))
{
return $conn;
}else{
return $this->db_unloaded();
}
}
}
function ROW_Q($sql)
{
$result=$this->QUERY($sql);
if(!$result)return false;
if($this->dbtype=='mysql')
{
$ob=mysqli_fetch_object($result);
}elseif($this->dbtype=='postgresql')
{
$ob=pg_fetch_object($result);
}
return $ob;
}
function LIST_Q($sql)
{
$result=$this->QUERY($sql);
if(!$result)return false;
if($this->dbtype=='mysql')
{
while($ob=mysqli_fetch_object($result))
$objects[]=$ob;
}elseif($this->dbtype=='postgresql')
{
while($ob=pg_fetch_object($result))
$objects[]=$ob;
}
return (isset($objects)?$objects:false);
}
function QUERY($sql)
{
# echo $sql;
if($this->dbtype=='mysql')
{
$result=mysqli_query($this->db,$sql);
if($result==false)print "<div style='color:red;font-weight:bold;'>".mysql_error().'</div>';
return $result;
}elseif($this->dbtype=='postgresql')
{
return pg_query($this->db, $sql);
}
}
function Q($sql)
{
if($this->dbtype=='mysql')
{
return mysqli_real_escape_string($this->db,$sql);
}elseif($this->dbtype=='postgresql')
{
return pg_escape_string($sql);
}
}
}
$a=new Agent;
?>
|