public function index() { $this->load->helper(array('security', 'form', 'captcha')); $this->load->library(array('form_validation', 'punycode', 'email', 'session')); $data = array('title' => 'Проверка URL', 'error' => '', 'output' => ''); $this->form_validation->set_rules(array(array('field' => 'url', 'label' => 'URL', 'rules' => 'required|trim|xss_clean|max_length[2083]|check_url'), array('field' => 'email', 'label' => 'E-mail', 'rules' => 'trim|xss_clean|max_length[254]|valid_email'), array('field' => 'captcha', 'label' => 'Проверочный код', 'rules' => 'required|trim|xss_clean|max_length[8]|check_captcha'))); if ($this->form_validation->run() == FALSE) { $data['output'] = $this->load->view('home/home', array('captcha' => _captcha_activate()), TRUE); } else { _captcha_destroy(); $this->load->model('home_model'); $cleaned_url = _make_clean_url($this->input->post('url')); $cleaned_url_hash = md5($cleaned_url . $this->config->item('secret_url')); $already_checked = $this->home_model->_already_checked(array('url' => $cleaned_url)); if ($already_checked) { if ($this->session->flashdata('last_check') && $this->session->flashdata('last_check') === $cleaned_url) { $this->session->keep_flashdata('last_check'); } else { if ($this->input->post('email')) { _send_mail_url($this->input->post('email'), $cleaned_url_hash, $cleaned_url); $this->session->set_flashdata('last_check', $cleaned_url); } } redirect('check/' . $cleaned_url_hash); /*if(is_object($already_checked)) { $already_checked_row = $already_checked->row(); $data['title'] .= ': '.$cleaned_url; $data['error'] = 'Ссылка на результаты проверки будет выслана на e-mail: '._mask_email($this->input->post('email')); if($this->session->flashdata('last_check') && $this->session->flashdata('last_check') === $cleaned_url) { $this->session->keep_flashdata('last_check'); } else { _send_mail_url($this->input->post('email'),$cleaned_url_hash,$cleaned_url); $this->session->set_flashdata('last_check',$cleaned_url); } $already_checked = NULL; $already_checked_row = NULL; } else { $data['error'] = 'Ошибка отправки данных. (#1)'; }*/ } else { if (!_is_url_exist($cleaned_url)) { $data['error'] = 'URL недоступен, не существует, либо слишком большой объём данных. (#2)'; $data['output'] = $this->load->view('home/home', array('captcha' => _captcha_activate()), TRUE); } else { $add_queue = $this->home_model->_add_queue(array('url' => $cleaned_url, 'ip' => $this->input->ip_address(), 'email' => $this->input->post('email') ? $this->input->post('email') : '')); $add_queue = NULL; $this->session->set_flashdata('last_check', $cleaned_url); redirect('check/' . $cleaned_url_hash); /*$result = $this->home_model->_get_result(array( 'hash' => $cleaned_url_hash, )); if($result) { $result_row = $result->row(); $rumonth = $this->config->item('rumonth'); if(isset($result_row->domain)) { $data['title'] .= ': '.$cleaned_url; $data['error'] = 'Ссылка на результаты проверки будет выслана на e-mail: '._mask_email($this->input->post('email')); $this->session->set_flashdata('last_check',$cleaned_url); } else { foreach($result->result() as $row) { if($row->hash === $cleaned_url_hash) { $data['title'] .= ': '.$row->url; $data['error'] = $row->url." в очереди на проверку (".$row->qorder." из ".$result->num_rows().").<br>\n". "Добавлен в базу ".date("j ".$rumonth[date("n",strtotime($row->date))]." Y г. в H:i",strtotime($row->date))." (прошло "._relative_time($row->date).").<br>\n". "Ссылка на результаты проверки будет выслана на e-mail: "._mask_email($row->email); $this->session->set_flashdata('last_check',$row->url); break; } } if(empty($data['error'])) { $data['error'] = 'Ошибка отправки данных. (#3)'; } } $result_row = NULL; } else { $data['error'] = 'Ошибка отправки данных. (#4)'; $data['output'] = $this->load->view('home/home','',TRUE); } $result = NULL;*/ } } unset($cleaned_url, $cleaned_url_hash, $already_checked); } _no_cache(); $this->load->view('home/index', array('auto_version_js' => _auto_version('js/app.js'), 'auto_version_css' => _auto_version('css/app.css'), 'title' => $data['title'], 'output' => $data['output'], 'error' => $data['error'])); }
function _parse_external_js($url) { $url = _make_clean_url($url); if (filter_var($url, FILTER_VALIDATE_URL) === FALSE) { return FALSE; } else { $url_header = _is_url_exist($url); if ($url_header) { /*_request_timeout(3); $html = @file_get_contents($url);*/ $html = @file_get_html($url_header, false, stream_context_create(array('http' => array('timeout' => 3)))); if ($html) { $external_js = array(); $external_js_count = 0; $external_js_count_max = 20; foreach ($html->find('script') as $script) { $src = $script->src; if ($src != null) { if (strpos($src, '//') === FALSE) { /*if($src[0] === '/') { $src = $url.$src; } elseif($src[0] != '.') { $src = $url.'/'.$src; } else { $src = null; }*/ if (isset($url_header[strlen($url_header) - 1]) && $url_header[strlen($url_header) - 1] !== '/') { $url_header .= '/'; } $src = url_to_absolute($url_header, $src); } if (_is_url_exist($src)) { $external_js[] = $src; } } $external_js_count++; if ($external_js_count === $external_js_count_max) { unset($external_js_count, $external_js_count_max); break; } } $html = NULL; unset($url_header); if (!empty($external_js)) { return $external_js; } else { unset($external_js); return FALSE; } } else { $html = NULL; unset($url_header); return FALSE; } } else { unset($url_header); return FALSE; } } }
public function index() { /*if($this->input->is_cli_request()) { return FALSE; }*/ if ($this->input->is_cli_request() && !isset($_SERVER['REMOTE_ADDR'])) { ignore_user_abort(true); set_time_limit(0); $this->load->helper('virus'); define('LOCK_FILE', $this->config->item('lockdir') . 'worker.lock'); if (!_trylock()) { die; } register_shutdown_function('unlink', LOCK_FILE); $this->load->model('home_model'); /*$virustotal_requests = 0;*/ $get_queue = $this->home_model->_get_queue(); if ($get_queue) { $this->load->helper('simple_html_dom'); $this->load->library(array('punycode', 'email')); /*$this->load->library('virustotal',array( 'key' => $this->config->item('virustotal_key'), ));*/ foreach ($get_queue->result() as $queue) { if (isset($save_result)) { unset($save_result); } if (!$queue->scanned) { if (!_is_url_exist($queue->url)) { $get_domain = split_url($queue->url); if (isset($get_domain['host'])) { $this->home_model->_delete_from_queue(array('id' => $queue->id, 'host' => $get_domain['host'])); } else { $this->home_model->_delete_from_queue(array('id' => $queue->id)); } unset($get_domain); continue; } $get_domain = split_url($queue->url); if (isset($get_domain['host'])) { $get_domain_host = $get_domain['host']; $get_domain = $this->home_model->_get_result_domain(array('domain' => $get_domain_host)); if ($get_domain) { $get_domain_row = $get_domain->row(); if (date_diff(date_create($get_domain_row->date), date_create(date('Y-m-d H:i:s', time())))->days > 0) { $get_domain_data = _avdetect($get_domain_host, 'domain'); usleep(500000); if ($get_domain_data === FALSE) { $this->home_model->_delete_from_queue(array('id' => $queue->id, 'host' => $get_domain_host)); /*unset($get_domain,$get_domain_row,$get_domain_data,$get_domain_host);*/ $get_domain = NULL; $get_domain_row = NULL; unset($get_domain_data, $get_domain_host); time_nanosleep(0, 10000000); continue; } $this->home_model->_save_result_domain(array('domain' => $get_domain_host, 'result' => $get_domain_data)); /*unset($get_domain_data);*/ $get_domain_data = NULL; } } else { $get_domain_data = _avdetect($get_domain_host, 'domain'); usleep(500000); if ($get_domain_data === FALSE) { $this->home_model->_delete_from_queue(array('id' => $queue->id, 'host' => $get_domain_host)); /*unset($get_domain,$get_domain_data,$get_domain_host);*/ $get_domain = NULL; unset($get_domain_data, $get_domain_host); time_nanosleep(0, 10000000); continue; } $this->home_model->_save_result_domain(array('domain' => $get_domain_host, 'result' => $get_domain_data)); unset($get_domain_data); $get_domain = $this->home_model->_get_result_domain(array('domain' => $get_domain_host)); $get_domain_row = $get_domain->row(); } $get_domain = NULL; } else { unset($get_domain); $this->home_model->_delete_from_queue(array('id' => $queue->id)); time_nanosleep(0, 10000000); continue; } /*if($virustotal_requests < (int)$this->config->item('virustotal_limit')) {*/ _request_timeout(10); /*$report = $this->virustotal->getURLReport($queue->url); $virustotal_requests++; if($report && is_object($report)) { if((int)$report->response_code === 0) { $this->virustotal->scanURL($queue->url); $virustotal_requests++; } elseif((int)$report->response_code === 1) { if(date_diff(date_create($this->virustotal->getSubmissionDate($report)),date_create(date('Y-m-d H:i:s',time())))->days === 0) { $save_result = $this->home_model->_save_result($queue->id,$report); } else { $this->virustotal->scanURL($queue->url); $virustotal_requests++; } } else { continue; } }*/ $report = _avdetect($queue->url); usleep(500000); if ($report) { $save_result = $this->home_model->_save_result(array('id' => $queue->id, 'result' => $report, 'domain' => $get_domain_row->id)); } else { if (isset($get_domain_host)) { $this->home_model->_delete_from_queue(array('id' => $queue->id, 'host' => $get_domain_host)); unset($get_domain_host); } else { $this->home_model->_delete_from_queue(array('id' => $queue->id)); } /*unset($get_domain_row,$save_result,$report);*/ $get_domain_row = NULL; unset($save_result, $report); time_nanosleep(0, 10000000); continue; } /*unset($report);*/ $report = NULL; /*if($virustotal_requests >= (int)$this->config->item('virustotal_limit')) { die(); } }*/ } $get_queue_js = $this->home_model->_get_queue_js(array('id' => $queue->id)); if (!$get_queue_js) { $external_js = _parse_external_js($queue->url); if ($external_js) { /*foreach($external_js as $url) { $this->home_model->_add_queue_js(array( 'parent' => $queue->id, 'url' => $url, )); }*/ $this->home_model->_add_queue_js(array('urls' => $external_js, 'parent' => $queue->id)); $get_queue_js = $this->home_model->_get_queue_js(array('id' => $queue->id)); } unset($external_js); } if ($get_queue_js) { foreach ($get_queue_js->result() as $queue_js) { if ((int) $queue_js->status === 0) { if (!_is_url_exist($queue_js->url)) { $this->home_model->_delete_from_queue_js(array('id' => $queue_js->id)); continue; } /*if($virustotal_requests < (int)$this->config->item('virustotal_limit')) {*/ /*$report_js = $this->virustotal->getURLReport($queue_js->url); $virustotal_requests++; if($report_js && is_object($report_js)) { if((int)$report_js->response_code === 0) { $this->virustotal->scanURL($queue_js->url); $virustotal_requests++; } elseif((int)$report_js->response_code === 1) { if(date_diff(date_create($this->virustotal->getSubmissionDate($report_js)),date_create(date('Y-m-d H:i:s',time())))->days === 0) { $this->home_model->_save_result_js($queue_js->id,$report_js); } else { $this->virustotal->scanURL($queue_js->url); $virustotal_requests++; } } else { continue; } }*/ $report_js = _avdetect($queue_js->url); usleep(500000); if ($report_js) { $this->home_model->_save_result_js(array('id' => $queue_js->id, 'result' => $report_js)); } else { $this->home_model->_delete_from_queue_js(array('id' => $queue_js->id)); unset($report_js); continue; } unset($report_js); /*if($virustotal_requests >= (int)$this->config->item('virustotal_limit')) { die(); } }*/ } } /*unset($get_queue_js);*/ $get_queue_js = NULL; } if ($queue->scanned || isset($save_result) && $save_result === TRUE) { $this->home_model->_queue_completed(array('id' => $queue->id)); _send_mail_url($queue->email, $queue->hash, $queue->url); } time_nanosleep(0, 10000000); } } /*unset($get_queue);*/ $get_queue = NULL; time_nanosleep(0, 10000000); $get_old_queue = $this->home_model->_get_old_queue(); if ($get_old_queue) { foreach ($get_old_queue->result() as $old_queue) { $this->home_model->_delete_from_queue(array('id' => $old_queue->id, 'host' => $old_queue->domain)); } } $get_old_queue = NULL; exit(0); } }