public function actionPost() { if (Yii::app()->user->isGuest || empty($_POST)) { throw new CHttpException(404, 'Страница не найдена'); } echo Yii::app()->user->getState('AnketaFingerprint', 0); if (Yii::app()->user->getState('AnketaFingerprint', 0)) { return; } $af = new AnketaFingerprint(); $af->unsetAttributes(); if (!empty($_POST)) { $af->attributes = $_POST; } $af->accept = $_SERVER['HTTP_ACCEPT']; $af->user_agent = $_SERVER['HTTP_USER_AGENT']; $af->id_anketa = Yii::app()->user->id; $af->user_agent_md5 = md5($af->user_agent); $af->fonts_md5 = md5($af->fonts); $af->plugins_md5 = md5($af->plugins); $dp = $af->search(); if ($dp->totalItemCount == 0) { $af->save(); $anketaFingerprint = $af->id; } else { $d = $dp->getData(); if (is_array($d)) { $d = $d[0]; } $anketaFingerprint = $d->id; } Yii::app()->user->setState('AnketaFingerprint', $anketaFingerprint); }
public function actionFingerprints() { Yii::app()->user->me->checkClone(); $fp = Yii::app()->user->getState('AnketaFingerprint'); $fp = AnketaFingerprint::model()->findByPk($fp); echo $fp->fonts; }
public function checkClone() { if ($this->getAccountType() == Anketa::ACCOUNT_PREMIUM) { return; } // премиум(?) if ($this->status_bad) { return; } // уже клон/бан или снятый клон/бан static $wasHere = 0; if ($this->id == Yii::app()->user->id) { Yii::log($this->id . ' fp=' . Yii::app()->user->getState('AnketaFingerprint') . ' | ' . $_SERVER['REQUEST_URI'], CLogger::LEVEL_INFO, 'checkClone'); } $status_bad = self::BAD_STATUS_NONE; foreach ($this->findClones() as $clone) { /** @var $clone Anketa */ if ($this->first_visit <= $clone->first_visit) { // если анкета зарегистрирована раньше клона continue; } if ($clone->status_bad == self::BAD_STATUS_BAN) { $status_bad = self::BAD_STATUS_BAN; } else { $status_bad = self::BAD_STATUS_CLONE; } Yii::log('bad_status ' . $status_bad . ' ' . $this->id . ' <- ' . $clone->id, CLogger::LEVEL_INFO, 'ban'); } if ($status_bad == self::BAD_STATUS_NONE) { if ($this->findEtagClones()) { foreach ($this->findEtagClones() as $clone) { /** @var $clone Anketa */ if ($this->first_visit <= $clone->first_visit) { // если анкета зарегистрирована раньше клона continue; } if ($clone->status_bad == self::BAD_STATUS_BAN) { $status_bad = self::BAD_STATUS_BAN; } else { $status_bad = self::BAD_STATUS_CLONE; } Yii::log('bad_status ' . $status_bad . ' ' . $this->id . ' <- Etag ' . $clone->id, CLogger::LEVEL_INFO, 'ban'); } } } if ($status_bad == self::BAD_STATUS_NONE) { if ($this->id == Yii::app()->user->id) { $attributes = array(); $attributes[] = array('type' => FingerprintBan::TYPE_IP, 'value' => $_SERVER['REMOTE_ADDR']); if (Yii::app()->user->getState('FingerprintChecked', 0) === false) { $wasHere++; } if ($fp = Yii::app()->user->getState('AnketaFingerprint')) { if ($fp = AnketaFingerprint::model()->findByPk($fp)) { // бан по fingerprints foreach (FingerprintBan::$types as $k => $v) { $attributes[] = array('type' => $v, 'value' => md5($fp->{$k})); } } } foreach ($attributes as $k => $v) { if ($fb = FingerprintBan::model()->findByAttributes($v)) { $status_bad = $fb->status_bad; break; } } if ($status_bad != self::BAD_STATUS_NONE) { Yii::log('bad_status ' . $status_bad . ' ' . $this->id . ' <- ' . FingerprintBan::$typesText[$fb->type] . ' ' . $fb->value . ' ', CLogger::LEVEL_INFO, 'ban'); } if ($fp || !$wasHere) { Yii::app()->user->setState('FingerprintChecked', 1); } else { Yii::app()->user->setState('FingerprintChecked', false); } } } // За клонов до введения оплаты не блокируем. if ($status_bad == self::BAD_STATUS_CLONE) { $status_bad = self::BAD_STATUS_NONE; } // авторазбан при входе if ($status_bad != self::BAD_STATUS_NONE) { if ($this->totalPaid > 0) { $status_bad = self::BAD_STATUS_PAID; } } $this->setBad($status_bad); if ($status_bad & 1) { $this->trialReset(); } }
?> </h2> <?php $prints = array(); $i = 1; foreach ($model->fingerprints as $fingerprint) { if (!in_array($fingerprint->{$attribute}, $prints)) { $prints[] = $fingerprint->{$attribute}; if (in_array($fingerprint->{$attribute}, array('No Flash or Java fonts detected', 'undefined', 'undefined (via Flash)', '(via Flash)'))) { echo "<p class='red'>{$i} Нет</p>"; $i++; continue; } echo $_SERVER['REMOTE_ADDR'] != '89.169.186.440' ? FingerprintBan::drawForm(array('id_anketa' => $model->id, 'type' => FingerprintBan::$types[$attribute], 'value' => md5($fingerprint->{$attribute}))) : '', "<p><b>{$i} ", mb_substr($fingerprint->{$attribute}, 0, 100000, 'utf-8'), " </b></p>"; $i++; if (!($fingerprints = AnketaFingerprint::model()->findAllByAttributes(array($attribute . '_md5' => $fingerprint->{$attribute . '_md5'}), array('condition' => 'id_anketa <> ' . $model->id, 'limit' => 21)))) { //'id_anketa'=>'<>'.$model->id continue; } if (count($fingerprints) > 20) { echo "Больше 20 <span class='pointer blue toggle_sibling'> Показать/скрыть </span> <div style='display:none'>"; } else { echo "<div>"; } echo "<table>"; foreach ($fingerprints as $fpclone) { $zombie = $fpclone->anketa; // echo CHtml::link($zombie->name.", {$zombie->age}, {$zombie->city}",$zombie->link,array('target'=>'_blank')) ; // echo "<tr><td><span ><a class='$class' target='_blank' href='http://www.nic.ru/whois/?query={$ipdata['ip']}'>{$ipdata['ip']}</span></td>"; echo "<td>" . CHtml::link($zombie->name . ", {$zombie->age}, {$zombie->city}", $zombie->link, array('target' => '_blank')) . "</td>"; echo CHtml::tag('td', array(), $zombie->contact_count . ' cnt');