Esempio n. 1
0
 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']));
 }
Esempio n. 2
0
 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;
         }
     }
 }
Esempio n. 3
0
 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);
     }
 }