getFormName() === 'webmaster-firewall') { // Checking the page state switch ($this->getState()) { case 'change_recent_blocks_period': $this->period = filter_var($this->App->getHTTPParameter('period', 'POST'), FILTER_SANITIZE_STRING); break; case 'insert_block': $this->_insertBlock(); break; case 'delete_block': $this->_deleteBlock(); break; case 'search_block': $this->getSearchResults(); break; } } } /** * This function gets the recent blocks * * @return array * */ public function getRecentBlocks() { if (is_null($this->recent_blocks)) { $this->recent_blocks = $this->_fetchBlocks($this->period); } return $this->recent_blocks; } /** * This function gets all the blocks from the Attacks table * * @return array * */ public function getAllBlocks() { if (is_null($this->all_blocks)) { $this->all_blocks = $this->_fetchBlocks(); } return $this->all_blocks; } /** * This function gets all the search results from the Attacks table * * @return array * */ public function getSearchResults() { if (is_null($this->search_results) && $this->getState() === 'search_block') { $this->_searchBlocks(); } return $this->search_results; } /** * This function deletes a blocked row from the Attacks table * */ private function _deleteBlock() { $subnet = filter_var($this->App->getHTTPParameter('subnet_to_delete', 'POST'), FILTER_SANITIZE_STRING); if ($this->_isValidIp($subnet)) { $sql = "DELETE FROM Attacks WHERE Subnet = " . $this->App->returnQuotedString($this->App->sqlSanitize($subnet)); $delete = $this->App->infra_sql($sql); $this->_updateStats($subnet,'0'); $this->App->setSystemMessage('delete_block','You have successfully deleted the blocked subnet: ' . $subnet . '.', 'success'); return TRUE; } $this->App->setSystemMessage('delete_block','There was a problem blocking the subnet: ' . $subnet . '.', 'danger'); return FALSE; } /** * This function updates the Stats table * * @param $subnet contains a string * @param $blocking contains a string of either 1 or 0 * */ private function _updateStats($subnet, $blocking_option) { if ($this->_isValidIp($subnet)) { // By default we assume we're inserting a block $blocking_where = "0"; $count = ""; // But if we're deleting a block if ($blocking_option === "0") { $blocking_where = "1"; $count = ", Count = (Count-1)"; } $sql = "UPDATE Stats SET Blocking = ". $this->App->sqlSanitize($blocking_option) . $this->App->sqlSanitize($count) . " WHERE Blocking = ". $this->App->sqlSanitize($blocking_where) ." AND Subnet = " . $this->App->returnQuotedString($this->App->sqlSanitize($subnet)); $update = $this->App->infra_sql($sql); } } /** * This function fetches recent blocks based on a number of hours * * @param $period * * @return array * */ private function _fetchBlocks($period = "") { if (empty($period)) { $this->App->setSystemMessage('fetch_blocks','Please select a period of time.', 'danger'); return; } $sql = "SELECT * FROM Attacks"; if ($period != "") { $sql .= " WHERE AttackDateTime > DATE_SUB(NOW(), INTERVAL " . $this->App->sqlSanitize($period) . " HOUR)"; } $sql .= " ORDER BY AttackDateTime DESC"; $result = $this->App->infra_sql($sql); $recent_blocks = array(); while ($row = mysql_fetch_array($result)) { $recent_blocks[] = $row; } if (empty($recent_blocks)) { return "There weren't any blocks whitin the past ". $period ." hours."; } return $recent_blocks; } /** * This function validates an IP addresses or Subnets * * @return bool * */ private function _isValidIp($ip) { if (!empty($ip) && $ip != '0.0.0.0'){ if (preg_match("/^[1-9][0-9]{0,2}(\.[0-9]{1,3}){3}$/",$ip) == 1) { return TRUE; } } $msg = "The IP " . $ip." is not valid."; if (empty($ip)) { $msg = "You need to enter an IP address."; } $this->App->setSystemMessage('validate_ip',$msg,"danger"); return FALSE; } /** * This function inserts or update attacking ip in the attacks table * */ private function _insertBlock() { $ip = filter_var($this->App->getHTTPParameter('insert_block_ip', 'POST'), FILTER_SANITIZE_STRING); $time = strtoupper(str_replace('_', ' ', filter_var($this->App->getHTTPParameter('insert_block_time', 'POST'), FILTER_SANITIZE_STRING))); $port = filter_var($this->App->getHTTPParameter('insert_block_port', 'POST'), FILTER_SANITIZE_STRING); if ($port != "22") { $port = "0"; } if (empty($time) && !filter_var($time, FILTER_SANITIZE_STRING)) { $msg_type = "danger"; $msg = "Please select a valid amount of time for the ip to be blocked."; } // Making sure the ip is valid if ($this->_isValidIp($ip) && !(isset($msg_type) && $msg_type == 'danger')) { // getting the subnet $exploded_ip = explode('.',$ip); $subnet = $exploded_ip[0].".".$exploded_ip[1].".".$exploded_ip[2].".0"; $sql = "INSERT INTO Attacks (AttackingIp,Subnet,Port,AttackDateTime,ExpiryDateTime,UserID,VictimNode) VALUES ( ".$this->App->returnQuotedString($this->App->sqlSanitize($ip)).", ".$this->App->returnQuotedString($this->App->sqlSanitize($subnet)).", " . $this->App->returnQuotedString($this->App->sqlSanitize($port)) .", NOW(), DATE_ADD(NOW(), INTERVAL ". $this->App->sqlSanitize($time) ."), 'Webmaster', 'Portal' ) ON DUPLICATE KEY UPDATE AttackDateTime = NOW(), ExpiryDateTime = DATE_ADD(NOW(), INTERVAL ". $this->App->sqlSanitize($time) .")"; $insert = $this->App->infra_sql($sql); $this->_updateStats($subnet, '1'); $msg_type = "success"; $msg = "You have successfully blocked " . $ip . " for " . $time . "."; } $this->App->setSystemMessage('insert_block', $msg, $msg_type); } /** * This function returns an array of blocked IP addresses or Subnets * * @return array * */ private function _searchBlocks() { $ip = filter_var($this->App->getHTTPParameter('search_block_ip', 'POST'), FILTER_SANITIZE_STRING); $search_results = array(); if ($this->_isValidIp($ip)) { $sql = "SELECT DISTINCT Subnet,Port,UserID,VictimNode,AttackDateTime,ExpiryDateTime FROM Attacks WHERE (Subnet = " . $this->App->returnQuotedString($this->App->sqlSanitize($ip)) . " OR AttackingIp = " . $this->App->returnQuotedString($this->App->sqlSanitize($ip)) . ") ORDER BY AttackDateTime DESC"; $result = $this->App->infra_sql($sql); while ($row = mysql_fetch_array($result)) { $search_results[] = $row; } } $this->search_results = $search_results; return $search_results; } }