DbHelp.ru
Маленький Yii блог
Комментарии
Гость: wh0cd2594827 [url=http://pyridium911.us.com/]Pyridium[/url] [url=http://clozaril911.us.org/]clozaril...
Гость: order Retrovir in USA delivery NO PRESCRIPTION ; low prices Retrovir in Canada pharmacy without ...
Гость: wh0cd3078423 [url=http://sildenafil04.us.org/]sildenafil citrate generic[/url] [url=http://xenical02...
Гость: wh0cd2594827 [url=http://dapoxetine911.us.com/]dapoxetine[/url] [url=http://lisinopril03.us.com/]40 ...
Гость: buy essays essay buying order essay now https://buyessay.us.com - college essay helper



Сервер Ultima Online - Forest Wars (от создателя данного блога)

Подключаем yii капчу к сайту на другом движке

Рубрика: Работаем с капчей (captcha)

Оцените эту статью:

Рейтинг: 0.00 (0)
6 Апр. 2010
Опубликовать в Twitter Написать в Facebook Опубликовать в своем блоге livejournal.com

Сегодня мы разберем как подключать мою «математическую капчу» на обычный движок php магазина. Название движка я не знаю, да и это не важно, мы просто разберем как вырвать кусок yii и подключать к совершенно не зависимому сайту...

---

Я уже писал подобную статью, но из-за некоторых проблем - решил её написать еще раз.

Раньше форма связи на сайте выглядела следующим образом:

Yii Framework Blog img http://dbhelp.ruccc1

  1. капча с минимальным шумом
  2. размер шрифта постоянно одинаковый
  3. кол-ву символов постоянно одинаково

Заказчик попросил сделать что то другое, т.к. спам боты иногда эту капчу всё таки ломали. Недолго думая я решил присобачить «математическую капчу» которую я писал на Yii. Осталось найти классы которые отвечают за её вывод и выдрать их. (согласитесь, что будет лишним переносить весь фреймворка ради вывода капчи на другом движке, проще пару классов забрать с фреймворка)

Всем известно что именно класс CCaptchaAction отвечает за отображение капчи на экране. Именно в нем генерируется число в капче. Вот так класс выглядит в чистом, не тронутом виде:

<?php
/**
 * CCaptchaAction class file.
 *
 * @author Qiang Xue <[email protected]>
 * @link http://www.yiiframework.com/
 * @copyright Copyright &copy; 2008-2009 Yii Software LLC
 * @license http://www.yiiframework.com/license/
 */

/**
 * CCaptchaAction renders a CAPTCHA image.
 *
 * CCaptchaAction is used together with {@link CCaptcha} and {@link CCaptchaValidator}
 * to provide the {@link http://en.wikipedia.org/wiki/Captcha CAPTCHA} feature.
 *
 * You must configure properties of CCaptchaAction to customize the appearance of
 * the generated image.
 *
 * Note, CCaptchaAction requires PHP GD2 extension.
 *
 * Using CAPTCHA involves the following steps:
 * <ol>
 * <li>Override {@link CController::actions()} and register an action of class CCaptchaAction with ID 'captcha'.</li>
 * <li>In the form model, declare an attribute to store user-entered verification code, and declare the attribute
 * to be validated by the 'captcha' validator.</li>
 * <li>In the controller view, insert a {@link CCaptcha} widget in the form.</li>
 * </ol>
 *
 * @author Qiang Xue <[email protected]>
 * @version $Id: CCaptchaAction.php 726 2009-02-23 02:20:59Z qiang.xue $
 * @package system.web.widgets.captcha
 * @since 1.0
 */
class CCaptchaAction extends CAction
{
    /**
     * The name of the GET parameter indicating whether the CAPTCHA image should be regenerated.
     */
    const REFRESH_GET_VAR='refresh';
    /**
     * Prefix to the session variable name used by the action.
     */
    const SESSION_VAR_PREFIX='Yii.CCaptchaAction.';
    /**
     * @var integer how many times should the same CAPTCHA be displayed. Defaults to 3.
     */
    public $testLimit=3;
    /**
     * @var integer the width of the generated CAPTCHA image. Defaults to 120.
     */
    public $width=120;
    /**
     * @var integer the height of the generated CAPTCHA image. Defaults to 50.
     */
    public $height=50;
    /**
     * @var integer padding around the text. Defaults to 2.
     */
    public $padding=2;
    /**
     * @var integer the background color. For example, 0x55FF00.
     * Defaults to 0xFFFFFF, meaning white color.
     */
    public $backColor=0xFFFFFF;
    /**
     * @var integer the font color. For example, 0x55FF00. Defaults to 0x2040A0 (blue color).
     */
    public $foreColor=0x2040A0;
    /**
     * @var integer the minimum length for randomly generated word. Defaults to 6.
     */
    public $minLength=6;
    /**
     * @var integer the maximum length for randomly generated word. Defaults to 7.
     */
    public $maxLength=7;
    /**
     * @var string the TrueType font file. Defaults to Duality.ttf which is provided
     * with the Yii release.
     */
    public $fontFile;

    /**
     * Runs the action.
     * If the GET parameter {@link wsdlVar} exists, the action will serve WSDL content;
     * If not, the action will handle the remote method invocation.
     */
    public function run()
    {
        if(isset($_GET[self::REFRESH_GET_VAR]))  // AJAX request for regenerating code
        {
            $code=$this->getVerifyCode(true);
            // we add a random 'v' parameter so that FireFox can refresh the image
            // when src attribute of image tag is changed
            echo $this->getController()->createUrl($this->getId(),array('v'=>rand(0,10000)));
        }
        else
        {
            $session=Yii::app()->session;
            $session->open();
            $name=$this->getSessionKey().'count';
            if($session[$name]===null || $session[$name]>=$this->testLimit)
                $regenerate=true;
            else
            {
                $session[$name]=$session[$name]+1;
                $regenerate=false;
            }

            $this->renderImage($this->getVerifyCode($regenerate));
            Yii::app()->end();
        }
    }

    /**
     * Gets the verification code.
     * @param string whether the verification code should be regenerated.
     * @return string the verification code.
     */
    public function getVerifyCode($regenerate=false)
    {
        $session=Yii::app()->session;
        $session->open();
        $name=$this->getSessionKey();
        if($session[$name]===null || $regenerate)
        {
            $session[$name]=$this->generateVerifyCode();
            $session[$name.'count']=1;
        }
        return $session[$name];
    }

    /**
     * Validates the input to see if it matches the generated code.
     * @param string user input
     * @param boolean whether the comparison should be case-sensitive
     * @return whether the input is valid
     */
    public function validate($input,$caseSensitive)
    {
        $code=$this->getVerifyCode();
        return $caseSensitive?($input===$code):!strcasecmp($input,$code);
    }

    /**
     * Generates a new verification code.
     * @return string the generated verification code
     */
    protected function generateVerifyCode()
    {
        if($this->minLength<3)
            $this->minLength=3;
        if($this->maxLength>20)
            $this->maxLength=20;
        if($this->minLength>$this->maxLength)
            $this->maxLength=$this->minLength;
        $length=rand($this->minLength,$this->maxLength);

        $letters='bcdfghjklmnpqrstvwxyz';
        $vowels='aeiou';
        $code='';
        for($i=0;$i<$length;++$i)
        {
            if($i%2 && rand(0,10)>2 || !($i%2) && rand(0,10)>9)
                $code.=$vowels[rand(0,4)];
            else
                $code.=$letters[rand(0,20)];
        }

        return $code;
    }

    /**
     * Returns the session variable name used to store verification code.
     * @return string the session variable name
     */
    protected function getSessionKey()
    {
        return self::SESSION_VAR_PREFIX.Yii::app()->getId().'.'.$this->getController()->getUniqueId().'.'.$this->getId();
    }

    /**
     * Renders the CAPTCHA image based on the code.
     * @param string the verification code
     * @return string image content
     */
    protected function renderImage($code)
    {
        $image=imagecreatetruecolor($this->width,$this->height);
        $backColor=imagecolorallocate($image,
            (int)($this->backColor%0x1000000/0x10000),
            (int)($this->backColor%0x10000/0x100),
            $this->backColor%0x100);
        imagefilledrectangle($image,0,0,$this->width,$this->height,$backColor);
        imagecolordeallocate($image,$backColor);

        $foreColor=imagecolorallocate($image,
            (int)($this->foreColor%0x1000000/0x10000),
            (int)($this->foreColor%0x10000/0x100),
            $this->foreColor%0x100);

        if($this->fontFile===null)
            $this->fontFile=dirname(__FILE__).'/Duality.ttf';

        $offset=2;
        $length=strlen($code);
        $box=imagettfbbox(30,0,$this->fontFile,$code);
        $w=$box[4]-$box[0]-$offset*($length-1);
        $h=$box[1]-$box[5];
        $scale=min(($this->width-$this->padding*2)/$w,($this->height-$this->padding*2)/$h);
        $x=10;
        $y=round($this->height*27/40);
        for($i=0;$i<$length;++$i)
        {
            $fontSize=(int)(rand(26,32)*$scale*0.8);
            $angle=rand(-10,10);
            $letter=$code[$i];
            $box=imagettftext($image,$fontSize,$angle,$x,$y,$foreColor,$this->fontFile,$letter);
            $x=$box[2]-$offset;
        }

        imagecolordeallocate($image,$foreColor);

        header('Pragma: public');
        header('Expires: 0');
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Content-Transfer-Encoding: binary');
        header("Content-type: image/png");
        imagepng($image);
        imagedestroy($image);
    }
}

Как видите там есть много всего ненужного. Я не собераюсь переносить весь yii функционал на этот движок, просто хочу иметь возможность:

  1. Через minLength и maxLength изменять сложность выражения.
  2. Через backColor и foreColor изменять цвет фона и букв
  3. Через fontFile изменять шрифт для капчи

Я убрал наследование от CAction и несколько ненужных (на мой взгляд) методов. Получилось достаточно компактно

<?php
/**
 * CCaptchaAction class file.
 *
 * @author Qiang Xue <[email protected]>
 * @link http://www.yiiframework.com/
 * @copyright Copyright &copy; 2008-2009 Yii Software LLC
 * @license http://www.yiiframework.com/license/
 */

/**
 * CCaptchaAction renders a CAPTCHA image.
 *
 * CCaptchaAction is used together with {@link CCaptcha} and {@link CCaptchaValidator}
 * to provide the {@link http://en.wikipedia.org/wiki/Captcha CAPTCHA} feature.
 *
 * You must configure properties of CCaptchaAction to customize the appearance of
 * the generated image.
 *
 * Note, CCaptchaAction requires PHP GD2 extension.
 *
 * Using CAPTCHA involves the following steps:
 * <ol>
 * <li>Override {@link CController::actions()} and register an action of class CCaptchaAction with ID 'captcha'.</li>
 * <li>In the form model, declare an attribute to store user-entered verification code, and declare the attribute
 * to be validated by the 'captcha' validator.</li>
 * <li>In the controller view, insert a {@link CCaptcha} widget in the form.</li>
 * </ol>
 *
 * @author Qiang Xue <[email protected]>
 * @version $Id: CCaptchaAction.php 726 2009-02-23 02:20:59Z qiang.xue $
 * @package system.web.widgets.captcha
 * @since 1.0
 */
class CCaptchaAction
{
    /**
     * The name of the GET parameter indicating whether the CAPTCHA image should be regenerated.
     */
    const REFRESH_GET_VAR='refresh';
    /**
     * Prefix to the session variable name used by the action.
     */
    const SESSION_VAR_PREFIX='Yii.CCaptchaAction.';
    /**
     * @var integer how many times should the same CAPTCHA be displayed. Defaults to 3.
     */
    public $testLimit=1;
    /**
     * @var integer the width of the generated CAPTCHA image. Defaults to 120.
     */
    public $width=200;
    /**
     * @var integer the height of the generated CAPTCHA image. Defaults to 50.
     */
    public $height=75;
    /**
     * @var integer padding around the text. Defaults to 2.
     */
    public $padding=0;
    /**
     * @var integer the background color. For example, 0x55FF00.
     * Defaults to 0xFFFFFF, meaning white color.
     */
    public $backColor=0xFFFFFF;
    /**
     * @var integer the font color. For example, 0x55FF00. Defaults to 0x2040A0 (blue color).
     */
    public $foreColor=0x2040A0;
    /**
     * @var integer the minimum length for randomly generated word. Defaults to 6.
     */
    public $minLength=6;
    /**
     * @var integer the maximum length for randomly generated word. Defaults to 7.
     */
    public $maxLength=7;
    /**
     * @var string the TrueType font file. Defaults to Duality.ttf which is provided
     * with the Yii release.
     */
    public $fontFile;
    
    public $code;

    /**
     * Renders the CAPTCHA image based on the code.
     * @param string the verification code
     * @return string image content
     */
    function renderImage()
    {
    $this->code = $this->generateVerifyCode();
    $code = $this->showCode($this->code);    
    
        $image=imagecreatetruecolor($this->width,$this->height);
        $backColor=imagecolorallocate($image,
            (int)($this->backColor%0x1000000/0x10000),
            (int)($this->backColor%0x10000/0x100),
            $this->backColor%0x100);
        imagefilledrectangle($image,0,0,$this->width,$this->height,$backColor);
        imagecolordeallocate($image,$backColor);

        $foreColor=imagecolorallocate($image,
            (int)($this->foreColor%0x1000000/0x10000),
            (int)($this->foreColor%0x10000/0x100),
            $this->foreColor%0x100);

        if($this->fontFile===null)
            $this->fontFile=dirname(__FILE__).'/Duality.ttf';

        $offset=2;
        $length=strlen($code);
        $box=imagettfbbox(30,0,$this->fontFile,$code);
        $w=$box[4]-$box[0]-$offset*($length-1);
        $h=$box[1]-$box[5];
        $scale=min(($this->width-$this->padding*2)/$w,($this->height-$this->padding*2)/$h);
        $x=10;
        $y=round($this->height*27/40);
        for($i=0;$i<$length;++$i)
        {
            $fontSize=(int)(rand(26,32)*$scale*0.8);
            $angle=rand(-10,10);
            $letter=$code[$i];
            $box=imagettftext($image,$fontSize,$angle,$x,$y,$foreColor,$this->fontFile,$letter);
            $x=$box[2]-$offset;
        }

        imagecolordeallocate($image,$foreColor);

        header('Pragma: public');
        header('Expires: 0');
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Content-Transfer-Encoding: binary');
        header("Content-type: image/png");
        imagepng($image);
        imagedestroy($image);
    }
    
    function showCode($code) {
        $rand = rand(1, (int)$code-1);
        return (rand(0, 1)) ? (int)$code-$rand."+".(int)$rand : (int)$code+$rand."-".(int)$rand;
    }
    
    function generateVerifyCode()
    {
        return rand((int)$this->minLength, (int)$this->maxLength);
    }    
    
}

Этот класс я перенес на хост к движку магазина.

Как вы понимаете в самом магазине уже была капча, поэтому механизм валидации и тп — мне писать не пришлось. Старая капча запоминала код в сессию:

$_SESSION['captcha']

после чего уже сверяла введенный в поле код с тем что сохранен. Поэтому в конце своего класса я добавил что б капча сразу рендерилась на экран и сохраняла значение в сессию:

$abc = new CCaptchaAction();
$abc->renderImage();
session_start();
$_SESSION['captcha'] = $abc->code;

В сумме получился вот такой не большой CCaptchaAction:

<?php
/**
 * CCaptchaAction class file.
 *
 * @author Qiang Xue <[email protected]>
 * @link http://www.yiiframework.com/
 * @copyright Copyright &copy; 2008-2009 Yii Software LLC
 * @license http://www.yiiframework.com/license/
 */

/**
 * CCaptchaAction renders a CAPTCHA image.
 *
 * CCaptchaAction is used together with {@link CCaptcha} and {@link CCaptchaValidator}
 * to provide the {@link http://en.wikipedia.org/wiki/Captcha CAPTCHA} feature.
 *
 * You must configure properties of CCaptchaAction to customize the appearance of
 * the generated image.
 *
 * Note, CCaptchaAction requires PHP GD2 extension.
 *
 * Using CAPTCHA involves the following steps:
 * <ol>
 * <li>Override {@link CController::actions()} and register an action of class CCaptchaAction with ID 'captcha'.</li>
 * <li>In the form model, declare an attribute to store user-entered verification code, and declare the attribute
 * to be validated by the 'captcha' validator.</li>
 * <li>In the controller view, insert a {@link CCaptcha} widget in the form.</li>
 * </ol>
 *
 * @author Qiang Xue <[email protected]>
 * @version $Id: CCaptchaAction.php 726 2009-02-23 02:20:59Z qiang.xue $
 * @package system.web.widgets.captcha
 * @since 1.0
 */
class CCaptchaAction
{
    /**
     * The name of the GET parameter indicating whether the CAPTCHA image should be regenerated.
     */
    const REFRESH_GET_VAR='refresh';
    /**
     * Prefix to the session variable name used by the action.
     */
    const SESSION_VAR_PREFIX='Yii.CCaptchaAction.';
    /**
     * @var integer how many times should the same CAPTCHA be displayed. Defaults to 3.
     */
    public $testLimit=1;
    /**
     * @var integer the width of the generated CAPTCHA image. Defaults to 120.
     */
    public $width=200;
    /**
     * @var integer the height of the generated CAPTCHA image. Defaults to 50.
     */
    public $height=75;
    /**
     * @var integer padding around the text. Defaults to 2.
     */
    public $padding=0;
    /**
     * @var integer the background color. For example, 0x55FF00.
     * Defaults to 0xFFFFFF, meaning white color.
     */
    public $backColor=0xFFFFFF;
    /**
     * @var integer the font color. For example, 0x55FF00. Defaults to 0x2040A0 (blue color).
     */
    public $foreColor=0x2040A0;
    /**
     * @var integer the minimum length for randomly generated word. Defaults to 6.
     */
    public $minLength=6;
    /**
     * @var integer the maximum length for randomly generated word. Defaults to 7.
     */
    public $maxLength=7;
    /**
     * @var string the TrueType font file. Defaults to Duality.ttf which is provided
     * with the Yii release.
     */
    public $fontFile;
    
    public $code;

    /**
     * Renders the CAPTCHA image based on the code.
     * @param string the verification code
     * @return string image content
     */
    function renderImage()
    {
    $this->code = $this->generateVerifyCode();
    $code = $this->showCode($this->code);    
    
        $image=imagecreatetruecolor($this->width,$this->height);
        $backColor=imagecolorallocate($image,
            (int)($this->backColor%0x1000000/0x10000),
            (int)($this->backColor%0x10000/0x100),
            $this->backColor%0x100);
        imagefilledrectangle($image,0,0,$this->width,$this->height,$backColor);
        imagecolordeallocate($image,$backColor);

        $foreColor=imagecolorallocate($image,
            (int)($this->foreColor%0x1000000/0x10000),
            (int)($this->foreColor%0x10000/0x100),
            $this->foreColor%0x100);

        if($this->fontFile===null)
            $this->fontFile=dirname(__FILE__).'/Duality.ttf';

        $offset=2;
        $length=strlen($code);
        $box=imagettfbbox(30,0,$this->fontFile,$code);
        $w=$box[4]-$box[0]-$offset*($length-1);
        $h=$box[1]-$box[5];
        $scale=min(($this->width-$this->padding*2)/$w,($this->height-$this->padding*2)/$h);
        $x=10;
        $y=round($this->height*27/40);
        for($i=0;$i<$length;++$i)
        {
            $fontSize=(int)(rand(26,32)*$scale*0.8);
            $angle=rand(-10,10);
            $letter=$code[$i];
            $box=imagettftext($image,$fontSize,$angle,$x,$y,$foreColor,$this->fontFile,$letter);
            $x=$box[2]-$offset;
        }

        imagecolordeallocate($image,$foreColor);

        header('Pragma: public');
        header('Expires: 0');
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Content-Transfer-Encoding: binary');
        header("Content-type: image/png");
        imagepng($image);
        imagedestroy($image);
    }
    
    function showCode($code) {
        $rand = rand(1, (int)$code-1);
        return (rand(0, 1)) ? (int)$code-$rand."+".(int)$rand : (int)$code+$rand."-".(int)$rand;
    }
    
    function generateVerifyCode()
    {
        return rand((int)$this->minLength, (int)$this->maxLength);
    }    
    
}

$abc = new CCaptchaAction();
$abc->renderImage();

session_start();
$_SESSION['captcha'] = $abc->code;

Выглядит это всё вот так:

Yii Framework Blog img http://dbhelp.ruccc2



Если хотите опубликовать этот материал у себя - пожалуйста, разместите ссылку на страницу откуда вы его взяли.
Другие yii статьи:

  1. В процессе разработки приложения, очень часто требуется следить за запросами которые формирует фреймворк.В этом нам поможет FireBug, незаменимый инструмент ... "Логирование запросов в FireBug"

  2. Снова я к своим читателям обращаюсь с глупым вопросом, но что делать, другой аудитории я не доверяю :) На ... "Вопрос: Закрыть yii через htaccess"

  3. Подсветка php кода на страницах блога — штука невероятно удобная. Давайте в двух словах разберемся как я подкрутил её у ... "Подсветка синтаксиса"

[adm] zolter

Было сказано: Вторник, 06 Апрель 2010

Как и обещал, написал снова статью которая удалилась в день пожара

[guest] snnwolf

Было сказано: Среда, 07 Апрель 2010

Спасибо! Очень полезная штучка... :)

[guest] levik

Было сказано: Пятница, 23 Июль 2010

похоже, в этом блоге именно такая капча стоит :)

[guest] Гость

Было сказано: Четверг, 12 Январь 2012

<script>alert('');</script>

[guest] Гость

Было сказано: Четверг, 12 Январь 2012

&lt;script&gt;alert('');&lt;\/script&gt;

[guest] zolter

Было сказано: Четверг, 12 Январь 2012

ой ой, какие читеры нашлись :D

[guest] Гость

Было сказано: Среда, 31 Июль 2013

uyiu

[guest] Гость

Было сказано: Вторник, 31 Январь 2017

<a href="http://102hp.ru/bolshie-siski/krasivaya-devushka-na-massazhe-poluchaet-udovolstvie-ot-lask"&gt;Красивая девушка на массаже получает удовольствие от ласк</a>

http://1b1b.ru/%D0%BC%D0%B5%D0%B6%D1%80%D0%B0%D1%81%D1%81%D0%BE%D0%B2%D0%BE%D0%B5/sandra-romain-%D1%80%D0%BE%D1%81%D1%82-%D0%B2%D0%B5%D1%81 - sandra romain рост вес

[guest] Гость

Было сказано: Понедельник, 27 Февраль 2017

<a href="http://utebayuutebayu.trade/buying-in-amazon-with-paypal"&gt;buying in amazon with paypal</a>
<a href="http://yisunodoyisunodo.racing/where-to-buy-self-raising-flour-in-malaysia-movie"&gt;where to buy self raising flour in malaysia movie</a>
<a href="http://vogamevogame.party/monroe-mega-dangler-buy-a-car"&gt;monroe mega dangler buy a car</a>
<a href="http://vogamevogame.party/buy-nike-mercurial-superfly-cheap"&gt;buy nike mercurial superfly cheap</a>
<a href="http://mukezupomukezupo.accountant/de-buyer-non-stick-review"&gt;de buyer non stick review</a>

[guest] Гость

Было сказано: Вторник, 05 Сентябрь 2017

taking cialis when young

<a href="http://cialisxrm.com/">cialis without a doctor prescription</a>

cialis paid by insurance

<a href=http://cialisxrm.com/>cialisgsa.ru</a>

[guest] Гость

Было сказано: Среда, 20 Сентябрь 2017

buying drugs canada
<a href="http://canadianpharmacyrxbsl.com/">Jerryamofe</a>
canada drugs online
<a href=http://canadianpharmacyrxbsl.com/?ciproflox>ciproflox</a>
best online international pharmacies
<a href="http://canadianpharmacyrxbsl.com/?prednisolon-5mg">prednisolon 5mg</a>

[guest] Гость

Было сказано: Четверг, 21 Сентябрь 2017

best online canadian pharcharmy
<a href="http://canadianpharmacyrxbsl.com/">canadian pharmacy</a>
prescription drug price comparison
<a href=http://canadianpharmacyrxbsl.com/?amoxicillin-for-dogs>amoxicillin for dogs</a>
best canadian online pharmacy
<a href="http://canadianpharmacyrxbsl.com/?viagra-ohne-rezept-aus-deutschland">viagra ohne rezept aus deutschland</a>

[guest] Гость

Было сказано: Четверг, 21 Сентябрь 2017

internet pharmacy
<a href="http://canadianpharmacyrxbsl.com/">canadian drugs</a>
best canadian pharmacies
<a href=http://canadianpharmacyrxbsl.com/?what-is-valtrex-used-for>what is valtrex used for</a>
medication costs
<a href="http://canadianpharmacyrxbsl.com/?lasix-diuretic">lasix diuretic</a>

[guest] Гость

Было сказано: Четверг, 21 Сентябрь 2017

most reliable canadian pharmacies
<a href="http://canadianpharmacyrxbsl.com/">canadian pharmacy</a>
canada pharmacies online pharmacy
<a href=http://canadianpharmacyrxbsl.com/?valtrex-side-effects>valtrex side effects</a>
24 hour pharmacy
<a href="http://canadianpharmacyrxbsl.com/?xanax-addiction">xanax addiction</a>

[guest] Гость

Было сказано: Пятница, 22 Сентябрь 2017

mail order pharmacy
<a href="http://canadianpharmacyrxbsl.com/">canadian pharmacy</a>
medical information online
<a href=http://canadianpharmacyrxbsl.com/?cialis-canadian-pharmacy>cialis canadian pharmacy</a>
canadian drugstore reviews
<a href="http://canadianpharmacyrxbsl.com/?sildenafil-dosage">sildenafil dosage</a>

[guest] Гость

Было сказано: Суббота, 30 Сентябрь 2017

Где купить Сиалис и его дженерики в Российской Федерации

Даже если мужик старается придерживаться здорового образа жизни, регулярно проходит все медицинские обследования и бегает по утрам, позже или раньше его все-равно будут ждать неприятности с потенцией: такова беспощадная сущность старости. К большой радости передовая наука создала Дженерик Сиалис, которые смогут продлить нормальную интимную жизнь на десять лет, не вредя при этом здоровью иных органов и систем.

Речь идет о Сиалис дженерике что вы можете заказать на этом http://via-sexgra.ru/cialis-kupit-moskva сайте.

Тут вас ждёт каталог из пары десятков препаратов <a href=http://via-sexgra.ru/viagra-kupit-moskva>дженерик виагра заказать</a> , что десятки лет продаются в ЕС и прошли все установленные этапы клинических испытаний.

В отличии от банальных аптек, в этом онлайн магазине все лекарства продаются по минимальным ценам и высылаются заказчику в самой обычной посылке, что обеспечивает анонимность приобретения.

Все предлагаемые препараты изготавливаются на легальных европейских фармацевтических линиях и сопровождаются всеми легализованными сертификатами.

А низкая стоимость дженериков определяется отсутствием лишней цепочки посредников, как в ситуации с обычной аптекой.

[guest] Гость

Было сказано: Понедельник, 23 Октябрь 2017


Самые эффективные заменители Виагры Проблемы с потенцией в среднем и старшем возрасте испытывает огромное количество мужчин, но прогрессивная медицина давно борется с указанной проблемой с помощью Виагры. Виагра по сути своей — отличный препарат с небольшим количеством побочек, но ее значительным недостатком считается большая рыночная цена. В этой статье мы расскажем о некоторых, наиболее действенных заменителях простой Виагры:

Сиалис — это самый старый заменитель патентованного лекарственного средства для усиления потенции на отечественном рынке. Купить указанное лекарство а ещё <a href=http://via-sexgra.ru/viagra-kupit-moskva>дженерик виагра как действует</a> по наиболее низкой стоимости вы можете на страничке via-sexgra.ru

Используется и дозируется данный сиалис точно так же, как и простая Виагра.

Почти все знают, что после Виагры было разработано множество препаратов с синергичным влиянием на организм. Наиболее продвинутым лекарством является Левитра, что действует на эррекцию намного эффективнее, при этом меньше влияя на сердечную систему мужчины. Западные доктора, по результатам последних опросов, начинают все чаще прописывать Левитру вместо обычной Виагры.

Шпанская мушка сегодня является лучшим природным афродизиаком со сходным с Сиалисом эффектом, который подходит и мужчинам и женщинам. Наиболее привлекательной стороной экстракта шпанской мушки является минимум побочных эффектов, однако стоит он больше чем иные препараты. Все представленные в материале дженерики вы сможете купить через интернет и заказать доставку почтой прямой в руки. Посылка будет на абсолютно анонимной, все данные покупателей удаляются сразу после подтверждения доставки.

[guest] Гость

Было сказано: Суббота, 28 Октябрь 2017

Заказать Левитру в РФ

Даже если взрослый мужик придерживается здорового образа жизни, ежегодно проходит все обследования и бегает по утрам, рано или поздно его всё-равно поджидают проблемы с потенцией: такова неприятная суть старости.

К всеобщей радости прогрессивная наука создала <a href=http://via-sexgra.ru/viagra-kupit-moskva>дженерик виагра действие</a> , что могут продлить нормальную половую жизнь на десять лет, не вредя при этом здоровью иных органов и систем. Речь идет о Левитре дженериках, что вы можете приобрести на этом ресурсе via-sexgra.ru

Тут вас ждёт каталог из десятков препаратов, которые десятки лет производятся в ЕС и прошли все стандартные процедуры клинических испытаний. В отличие от банальных аптек, в представленном онлайн магазине все лекарства продаются по низким расценкам и доставляются клиенту в самой банальной посылке, которая обеспечивает полную конфиденциальность заказа.

Все представленные пилюли производятся на легальных западноевропейских фармацевтических линиях и сопровождаются всеми государственными документами. А низкая стоимость дженериков обуславливается отсутствием длинной цепи посредников, как в ситуации с обычной аптекой.

[guest] Гость

Было сказано: Пятница, 17 Ноябрь 2017

Я считаю, что Вы не правы. Давайте обсудим.


-----
<a href=http://apartamento.agency/save/europe-house-Limassol-kipr-pliazhi-i-more.html>Лимассол кипр пляжи и море</a> | http://apartamento.agency/

[guest] Гость

Было сказано: Пятница, 17 Ноябрь 2017

Есть конечно пару красивых моментов, но я ожидал большего!!!


-----
<a href=http://rf66.ru/teploventilyatory/volcano-new/volcano-mini-new-ac.html>купить volcano VR NEW AC</a> | http://rf66.ru/

[guest] Гость

Было сказано: Суббота, 18 Ноябрь 2017

По-моему это очевидно. Вы не пробовали поискать в google.com?


-----
<a href=http://o-dachnik.ru/>читать советы дачнику</a> | http://o-dachnik.ru/

[guest] Гость

Было сказано: Суббота, 18 Ноябрь 2017

все прям профи такие....


-----
<a href=http://buduemdim.com.ua/>строительный колледж официальный сайт</a> | http://buduemdim.com.ua/

[guest] Гость

Было сказано: Понедельник, 20 Ноябрь 2017

Замечательная мысль

-----
<a href=https://asjust.ru/>новости украины</a> | https://asjust.ru/

[guest] Гость

Было сказано: Понедельник, 20 Ноябрь 2017

супер пупер


----
<a href=http://cod34.ru/>новости волгограда и волгоградской</a> | http://cod34.ru/

[guest] Гость

Было сказано: Понедельник, 20 Ноябрь 2017

Будьте уверены.


-----
<a href=http://cod48.ru/>город 48 липецк новости</a> | http://cod48.ru/

[guest] Гость

Было сказано: Понедельник, 20 Ноябрь 2017

Какие отличные собеседники :)


-----
<a href=http://cod52.ru/gostinicy-oteli>гостиницы нижнего новгорода официальный сайт</a> | http://cod52.ru/

[guest] Гость

Было сказано: Понедельник, 20 Ноябрь 2017

Поздравляю, какие нужные слова..., великолепная мысль


-----
<a href=http://cod36.ru/>новости воронежа и воронежской</a> | http://cod36.ru/

[guest] Гость

Было сказано: Понедельник, 20 Ноябрь 2017

Думаю, что ничего серьезного.


-----
<a href=http://cod61.ru/puteshestviya-i-turizm>турагентства ростова на дону</a> | http://cod61.ru/

[guest] Гость

Было сказано: Понедельник, 20 Ноябрь 2017

черт,у меня не пойдет блин!(


------
<a href=http://cod63.ru/>самара арена новости</a> | http://cod63.ru/

[guest] Гость

Было сказано: Понедельник, 20 Ноябрь 2017

Это ценное сообщение


-----
<a href=http://cod57.ru/>орловские новости орел</a> | http://cod57.ru/

[guest] Гость

Было сказано: Понедельник, 20 Ноябрь 2017

Все может быть


------
<a href=http://cod31.ru/kafe-restorany-kluby>кафе бар белгород</a> | http://cod31.ru/

[guest] Гость

Было сказано: Понедельник, 20 Ноябрь 2017

радует глаз ..........


-----
<a href=http://cod46.ru/salony-krasoty-kosmetologii>администратор в салон красоты курск</a> | http://cod46.ru/

[guest] Гость

Было сказано: Вторник, 05 Декабрь 2017

С таким успехом как у тебя


_________
<a href=https://www.readanybook.com/ebook/the-mountain-between-us-565908>Charles Martin</a> | https://www.readanybook.com/

[guest] Гость

Было сказано: Вторник, 05 Декабрь 2017

Вместо того чтобы критиковать пишите свои варианты.


-------
<a href=http://opt-flowers.ru/contact.html>оптовые цветочные базы в москве адреса</a> | http://opt-flowers.ru/

[guest] Гость

Было сказано: Вторник, 05 Декабрь 2017

Ждать, имхо


-----------
<a href=http://hi-tech-news.com/>hi-tech-news</a> | http://hi-tech-news.com/

[guest] Гость

Было сказано: Вторник, 05 Декабрь 2017

Извиняюсь, но, по-моему, эта тема уже не актуальна.


--------
<a href=https://ww2awards.info/m/sssr/medali/3.html>https://ww2awards.info/m/sssr/medali/3.html</a> | https://ww2awards.info/

[guest] Гость

Было сказано: Вторник, 05 Декабрь 2017

поверьте мне.


--------
<a href=http://master-climat.com.ua/>бытовые кондиционеры</a> | http://master-climat.com.ua/

[guest] Гость

Было сказано: Вторник, 05 Декабрь 2017

Это очевидно, вы не ошиблись


--------
<a href=http://yamoden.ru/catalog/gornolyzhnye-kostyumy>Женский лыжный костюм</a> | http://yamoden.ru

[guest] Гость

Было сказано: Четверг, 07 Декабрь 2017

Я извиняюсь, но, по-моему, Вы не правы. Могу отстоять свою позицию. Пишите мне в PM, пообщаемся.


--------
<a href=http://seyfy.com.ua/shop/category/gostinichnyye-seyfy>гостиничный сейф цена</a> | http://seyfy.com.ua/

[guest] Гость

Было сказано: Четверг, 07 Декабрь 2017

первая самая лутшая


-------
<a href=http://expertblog.info/sangridok-ot-gribka-na-nogtyah-mozhno-li-doveryat-otzyvam-pokupatelej.html>обо всем детально</a> | http://expertblog.info/

[guest] Гость

Было сказано: Четверг, 07 Декабрь 2017

Браво, мне кажется это замечательная идея


--------
<a href=http://otzyvy-vrachej.com/sredstvo-varanga-dejstvitelno-li-izbavlyaet-ot-gribka-stopy-navsegda.php>больше информации тут</a> | http://otzyvy-vrachej.com/

Оставить комментарий


Код:
Имя: