Google reCaptcha를 확인하는 방법


10

문의 양식에 Google recaptcha를 추가했지만 값은 보안 문자없이 제출됩니다. 연락처 페이지에서 보안 문자 코드를 사용했습니다.

 <div class="g-recaptcha" data-sitekey="XXXXXXXXXX"></div> 
 <script src='https://www.google.com/recaptcha/api.js'></script>

내가 사용한이 두 코드. 보안 문자를 확인하는 방법을 알려주세요.



이것은 보안 문자를 확인합니다
Raghu

답변:


9

이 코드를 시도해야합니다 : 내 사이트 에서이 코드를 사용하고 있습니다.

<script>
window.onload = function() {
  var recaptcha = document.forms["contactForm"]["g-recaptcha-response"];
  recaptcha.required = true;
  recaptcha.oninvalid = function(e) {

    alert("Please complete the captcha");
   }
}
</script> 

테마의 내장 된 연락처 페이지에서 작동합니까?
Manish Gaur

네 .. 그것이 작동하는지 알려주세요
NID

2
그런 다음 form-validate를 contactForm으로 대체하십시오
NID

1
Google 웹 로그 분석 용 확장 프로그램을 설치하면됩니다. magentocommerce.com/magento-connect/... . 구글은 이미이 모든 것을 추적하는 훌륭한 일을한다. 나중에 더 강력한 것을 원한다면 더 많은 유료 확장 프로그램이 있습니다.
NID

1
이것은 도움이 될 것입니다 .. magento.stackexchange.com/questions/37363/…
NID

7

이 스크립트는 magento의 기본 유효성 검사와 같은 Google reCaptcha 유효성 검사에 사용됩니다. 사용해주세요.

<form name="freeeventForm" id="freeeventForm">
    <div id="RecaptchaField"></div>
    <input type="hidden" class="validate-reCAPTCHA">
</form>
        <script src="https://www.google.com/recaptcha/api.js?onload=CaptchaCallback&render=explicit" async defer></script>
    <script type="text/javascript">
        //< ![CDATA[
            var CaptchaCallback = function() {  
            grecaptcha.render('RecaptchaField', {'sitekey' : '6LeuiDwUAAAAALByt-xxxxxxxxxxx-xUsZHFkeEP'});
        };
        var customForm = new VarienForm('freeeventForm');
        Validation.add('validate-reCAPTCHA','reCAPTCHA is mandatory',function(){
            var response = grecaptcha.getResponse();
            if (response.length === 0) {
                    return false;
            }
            return true;
    });
        //]]>
    </script>

감사합니다. 이것은 prototype / validate.js를 사용하여 magento에서 reCaptcha를 검증하는 정답입니다. 매력처럼 일하는!
Waleed Asender

이것은 제 대답에 맞는 대답이어야합니다.
ajmedway

여기에서도 마찬가지입니다. 감사합니다
biplab rout

내 billing.phtml 파일에서 이것을 사용하고 싶습니다.이 코드를 사용하고 있지만 recaptcha의 유효성을 검사하지 않는 것이 좋습니다. `<script> window.onload = function () {// var recaptcha = document.forms [ "co-billing-form"] [ "g-recaptcha-response"]; var recaptcha = jQuery ( '. g- 요점-응답') .val (); recaptcha.required = true; recaptcha.oninvalid = function (e) {alert ( "보안 문자를 작성하십시오"); 거짓을 반환; }} </ script>`
Abi Sharma

7

위의 승인 된 JavaScript 솔루션은 분명히 내 의견으로는 갈 수 없습니다. JS를 사용하지 않는 봇 (대부분)은 단순히 검증을 우회하여 차단하려는 모든 스팸을 얻게됩니다. 항상 서버에서 항상 유효성을 검사하십시오. JS 유효성 검사는 UX 첫 단계입니다.

어쨌든 여러 솔루션이 있지만 여러 시간의 연구 끝에 Magento 1.9에서 저에게 효과적이었습니다. 이것은 원래 위의 Mike의 대답을 기반으로하지만 이전 함수는 일반적으로 서버 구성에 따라 http 래퍼 오류를 제공하므로 cURL에 대해 file_get_contents를 스왑합니다.

/ app / code / local / YourVendorName / ValidateCaptcha / 폴더를 만들어 자신의 모듈을 만듭니다.

새 ValidateCaptcha 폴더에서 Customer.php 파일이있는 Model 폴더를 추가하십시오. Magento에서 제공하는 핵심 Customer.php 파일을 덮어 쓰는 데 사용됩니다.

이 코드를 복사하여 붙여 넣기 :

<?php
class YourVendorName_ValidateCaptcha_Model_Customer extends Mage_Customer_Model_Customer {

    /**
     * Validate customer attribute values.
     *
     * @return bool
     */
    public function validate()
    {
        // This section is from the core file
        $errors = array();
        if (!Zend_Validate::is( trim($this->getFirstname()) , 'NotEmpty')) {
            $errors[] = Mage::helper('customer')->__('The first name cannot be empty.');
        }

        if (!Zend_Validate::is( trim($this->getLastname()) , 'NotEmpty')) {
            $errors[] = Mage::helper('customer')->__('The last name cannot be empty.');
        }

        if (!Zend_Validate::is($this->getEmail(), 'EmailAddress')) {
            $errors[] = Mage::helper('customer')->__('Invalid email address "%s".', $this->getEmail());
        }

        $password = $this->getPassword();
        if (!$this->getId() && !Zend_Validate::is($password , 'NotEmpty')) {
            $errors[] = Mage::helper('customer')->__('The password cannot be empty.');
        }
        if (strlen($password) && !Zend_Validate::is($password, 'StringLength', array(6))) {
            $errors[] = Mage::helper('customer')->__('The minimum password length is %s', 6);
        }
        $confirmation = $this->getPasswordConfirmation();
        if ($password != $confirmation) {
            $errors[] = Mage::helper('customer')->__('Please make sure your passwords match.');
        }

        $entityType = Mage::getSingleton('eav/config')->getEntityType('customer');
        $attribute = Mage::getModel('customer/attribute')->loadByCode($entityType, 'dob');
        if ($attribute->getIsRequired() && '' == trim($this->getDob())) {
            $errors[] = Mage::helper('customer')->__('The Date of Birth is required.');
        }
        $attribute = Mage::getModel('customer/attribute')->loadByCode($entityType, 'taxvat');
        if ($attribute->getIsRequired() && '' == trim($this->getTaxvat())) {
            $errors[] = Mage::helper('customer')->__('The TAX/VAT number is required.');
        }
        $attribute = Mage::getModel('customer/attribute')->loadByCode($entityType, 'gender');
        if ($attribute->getIsRequired() && '' == trim($this->getGender())) {
            $errors[] = Mage::helper('customer')->__('Gender is required.');
        }

        // additional reCAPTCHA validation
        // this should actually be in it's own function, but I've added 
        // it here for simplicity

        // Magento uses this method for a few different requests, so make
        // sure it's limited only to the 'createpost' action
        $action = Mage::app()->getRequest()->getActionName();
        if ( $action == 'createpost' ) { // restrict to the registration page only
            $captcha = Mage::app()->getRequest()->getPost('g-recaptcha-response', 1);
            if ( $captcha == '' ) {
                // if the field is empty, add an error which will be
                // displayed at the top of the page
                $errors[] = Mage::helper('customer')->__('Please check the reCAPTCHA field to continue.');
            } else {
                $secret = 'your-secret-key-goes-here';
                $url = 'https://www.google.com/recaptcha/api/siteverify?secret=' . $secret . '&response=' . $captcha . '&remoteip=' . $_SERVER["REMOTE_ADDR"];

                $ch = curl_init();
                // if you're testing this locally, you'll likely need to 
                // add your own CURLOPT_CAINFO parameter or you'll get
                // SSL errors
                curl_setopt( $ch, CURLOPT_URL, $url );
                curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1);
                $response = curl_exec( $ch );

                $result = json_decode( $response, true );
                if ( trim( $result['success'] ) != true ) {
                    // Add reCAPTCHA error
                    // This will be shown at the top of the registration page
                    $errors[] = Mage::helper('customer')->__('reCAPTCHA unable to verify.');
                }
            }
        }

        // now return the errors with your reCAPTCHA validation as well
        if (empty($errors)) {
            return true;
        }
        return $errors;
    }


}

이제 모듈에 etc 폴더를 추가하고 다음을 사용하여 config.xml을 작성하십시오.

<?xml version="1.0"?>
<config>
    <modules>
        <YourVendorName_ValidateCaptcha>
            <version>1.0</version>
        </YourVendorName_ValidateCaptcha>
    </modules>

    <global>
       <models>
          <customer>
              <rewrite>
                  <customer>YourVendorName_ValidateCaptcha_Model_Customer</customer>
              </rewrite>
          </customer>
       </models>
    </global>
</config>

다음으로 테마 헤드에 JS를 추가해야합니다. app / design / frontend / default / YOURTHEME / template / page / html / head.phtml 아래에 이것을 바로 추가하십시오. 이 파일이 없으면 기본 파일에서 복사하십시오. 그러나 기본 파일을 덮어 쓰지 마십시오. 항상 자신을 만드십시오!

<?php
/* reCAPTCHA */
if ( strpos( Mage::helper('core/url')->getCurrentUrl(), 'account/create') != false ) { ?>   
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
<?php } ?>

이제 app / design / frontend / default / YOURTHEME / template / persistent / customer / form / register.phtml에서 하단 근처의 버튼 세트 div 바로 앞에 이것을 추가하십시오.

    <div class="g-recaptcha" data-sitekey="your-site-key-goes-here"></div>
    <span id="captcha-required" style='display:none; color:#ff0000'><?php echo $this->__('Please Fill Recaptcha To Continue'); ?></span>

거의 끝났어! 이제 다음과 같이 app / etc / modules / YourVendorName / ValidateCaptcha.xml을 생성하여 새 모듈을 등록하십시오.

<?xml version="1.0"?>
<config>
    <modules>
        <YourVendorName_ValidateCaptcha>
            <active>true</active>
            <codePool>local</codePool>
        </YourVendorName_ValidateCaptcha>
    </modules>
</config>

YourVendorName을 원하는대로 바꾸십시오. 최종 구조는 다음과 같아야합니다.

- app
  - code
    - local
      - YourVendorName
        - ValidateCaptcha
          - etc
            config.xml
          - Model
            Customer.php
- design
  - frontend
    - default
      - YOURTHEME
        - template
          - customer
            - form
              register.phtml
          - page
            - html
              head.phtml
          - persistent
            - customer
              - form
                register.phtml
- etc
  - modules
    YourVendorName_ValidateCaptcha.xml

6

연락 양식으로 recaptcha를 사용했습니다 ..

<form action="<?php echo Mage::getUrl('mcrecaptcha/index/save'); ?>" id="contactForm" method="post" onSubmit="return checkcaptcha() ;">
    <ul class="form-list">
            <li class="fields">
                <div class="field">
                    <div class="input-box">
                        <input placeholder="Name" name="name" id="name" title="<?php echo Mage::helper('contacts')->__('Name') ?>" value="<?php echo $this->escapeHtml($this->helper('contacts')->getUserName()) ?>" class="input-text required-entry" type="text" />
                    </div>
                </div>
                <div class="field">
                    <div class="input-box">
                        <input placeholder="Email" name="email" id="email" title="<?php echo Mage::helper('contacts')->__('Email') ?>" value="<?php echo $this->escapeHtml($this->helper('contacts')->getUserEmail()) ?>" class="input-text required-entry validate-email contact_us_margin_top" type="text" />
                    </div>
                </div>
            </li>
            <li>
                <div class="input-box">
                    <input placeholder="Telephone" name="telephone" id="telephone" title="<?php echo Mage::helper('contacts')->__('Telephone') ?>" value="" class="input-text contact_us_margin_top" type="text" />
                </div>
            </li>
            <li class="wide">
                <div class="input-box">
                    <textarea placeholder="Comment" name="comment" id="comment" title="<?php echo Mage::helper('contacts')->__('Comment') ?>" class="required-entry input-text contact_us_margin_top" cols="5" rows="3" style="width:100%;"></textarea>
                </div>
            </li>
               <li id="rcode">  
                        <div class="captcha">
                                <div class="g-recaptcha contact_us_margin_top" data-sitekey="6Ldi8xsUAAAAAHsK15YxKsdhIn6lGk-RUIk222-f"> </div>
                        </div>
                        <div class="buttons-set contact_us_margin_top">
                            <input type="text" name="hideit" id="hideit" value="" style="display:none !important;" />
                            <button type="submit" title="<?php echo Mage::helper('contacts')->__('Submit') ?>" class="button" onClick="_gaq.push(['_trackEvent', 'Submit', 'contacts click','Contact Us'])"><span><span><?php echo Mage::helper('contacts')->__('Submit') ?></span></span></button>
                        </div>
                        <span class='captcha-error'><?php echo Mage::helper('contacts')->__('Please check the the captcha form.') ?></span>
                </li>      
        </ul>
</form>

<script>
function checkcaptcha()
{
    if((jQuery('#g-recaptcha-response').val())=='')
    {
        jQuery('.captcha-error').css('display','block');
        return false;
    }
    else
    {
        jQuery('.captcha-error').css('display','none');
    }

}
</script>

테마의 내장 연락처 형식으로 보안 문자 코드를 구현했습니다 .... 내 테마에 따라 알려주십시오. 나는 magento의 초보자이므로 도와주세요
Manish Gaur

이 코드는 내장 된 연락처 형식으로 구현합니다.
Jigs Parmar

당신은 당신의 형태 로이 코드를 구현하고 데이터 사이트 키 만 변경해야합니다
Jigs Parmar

답변을 받으시면 저의 대답을 받아들이십시오
Jigs Parmar

네 .....이 질문에 대한 답변을 찾으 시겠습니까
Manish Gaur

3

보안 문자를 유효성 검증하려면 양식 값 및 유효성 검증을 저장하기위한 저장 컨트롤러를 작성하십시오.

namespace Mike\SampleModule\Controller;

class Save extends \Magento\Framework\App\Action\Action
{
/**
* @var Google reCaptcha Options
*/
private static $_siteVerifyUrl = "https://www.google.com/recaptcha/api/siteverify?";
private $_secret;
private static $_version = "php_1.0";
/**
* Save Form Data
*
* @return array
*/
public function execute()
{
$captcha = $this->getRequest()->getParam('g-recaptcha-response');
$secret = "<--your secret key-->"; //Replace with your secret key
$response = null;
$path = self::$_siteVerifyUrl;
$dataC = array (
'secret' => $secret,
'remoteip' => $_SERVER["REMOTE_ADDR"],
'v' => self::$_version,
'response' => $captcha
);
$req = "";
foreach ($dataC as $key => $value) {
     $req .= $key . '=' . urlencode(stripslashes($value)) . '&';
}
// Cut the last '&'
$req = substr($req, 0, strlen($req)-1);
$response = file_get_contents($path . $req);
$answers = json_decode($response, true);
if(trim($answers ['success']) == true) {
    // Captcha Validated
    // Save Form Data
}else{
    // Display Captcha Error
}
}
}

위의 샘플 코드에서 사이트 키와 비밀 키를 교체했는지 확인하십시오.


양식을이 파일에 어떻게 연결합니까? 양식은 POST 메소드를 사용하여 action = "<? php echo $ this-> getPostActionUrl ()?>"로 이동합니다.
땅콩

1

NID,

reCaptcha 스크립트 스 니핏은 작동하는 것처럼 보이지만 Magento의 소스 head.phtml에 입력되었는지는 명확합니까? (또는 form.phtml?)는 마 젠토 기본 프리 PHP의 바로 아래에 녹색 형식으로 배치됩니다.

특히 PHP를 입력 할 때의 질문 Magento가 아래 예제와 같이 대부분의 템플릿 소스 페이지에서 맨 위에 배치하는 즉시 PHP 주석 섹션 뒤에 입력하는 것이 정기적입니까?

PHP 태그의 마 젠토 면책 조항. 여기에 스캐 피트 스크립트가 있습니까?

또한 아래 동영상에서이 reCaptcha 응답 확인 코드가 Magento의 메소드 구조에 더 적합하게 만드는 이유는 무엇 입니까?

마지막 질문 대안 : PHP 버전을 사용 하여이 reCaptcha 응답 확인을 수행하면 PHP 코드 스 니핏이 PHP의 최상위 마 젠토 기본 템플릿 녹색 주석 섹션 다음에 입력됩니다.

일부 코드는 기본 contactForm이 이미 각 필드 아래에 말할 모든 정보를 입력하지 않으면 reCaptcha 가이 contactForm에 대해 작동하도록하고 싶습니다. 그러나 나중에 사용하기 위해 이해할 수있는 방식으로. 당신의 길은 개발자 나 프로그래머로서 당신 스스로 창조 되었습니까?

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.