2024年3月27日 星期三

[研究]ASP.NET, WebForm, 試用 Google reCAPTCHA v3 人機驗證

[研究]ASP.NET, WebForm, 試用 Google reCAPTCHA v3 人機驗證

2024-03-23

環境:Visual Studio 2022 + ASP.NET + WebForm + Web Application + C# + SQL Server 2019 + SQL Server Management Studio (SSMS) 19

********************************************************************************

第一次嘗試使用,要自己去註冊帳號,設定哪個網站或 IP 使用,設定使用 v2 或 v3 版。

reCAPTCHA v3
https://developers.google.com/recaptcha/docs/v3?hl=zh-tw

Google Recaptcha v3 example demo
https://stackoverflow.com/questions/51507695/google-recaptcha-v3-example-demo

環境:Visual Studio 2022 + ASP.NET + WebForm + Web Application + C# + SQL Server 2019 + SQL Server Management Studio (SSMS) 19

********************************************************************************

Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1.Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
    <script type="text/javascript" src="https://www.google.com/recaptcha/api.js?render=YOUR_SITE_KEY"></script>
<script type="text/javascript"> grecaptcha.ready(function () { grecaptcha.execute('YOUR_SITE_KEY', { action: 'submit' }).then(function (token) {
document.getElementById('<%= recaptchaToken.ClientID %>').value = token; }); }); </script> </head> <body> <form id="form1" runat="server"> <asp:HiddenField ID="recaptchaToken" runat="server" /> <asp:Button ID="Button_Login" runat="server" Text="Google reCAPTCHA v3驗證 vs 登入" OnClick="Button_Login_Click" /><br /> <asp:Label ID="Label_MSG1" runat="server"></asp:Label> </form> </body> </html>

Default.aspx.cs

using Newtonsoft.Json.Linq;
using System;
using System.Net;

namespace WebApplication1
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Button_Login_Click(object sender, EventArgs e)
        {
            string secretKey = "YOUR_SECRET_KEY"; // 替換為您自己的reCAPTCHA v3秘鑰 YOUR_SECRET_KEY
string token = recaptchaToken.Value; // 取得令牌(token)值 using (var client = new WebClient()) { var response = client.DownloadString($"https://www.google.com/recaptcha/api/siteverify?secret={secretKey}&response={token}"); var result = JObject.Parse(response); // 需要 NuGet 安裝 Newtonsoft.Json bool success = (bool)result["success"]; if (success) { Label_MSG1.Text = "Google reCAPTCHA v3 驗證通過!"; } else { Label_MSG1.Text = "Google reCAPTCHA v3 驗證失敗,請重試!"; } } } } }


(下圖) 網站金鑰 (Site Key) 和 秘鑰 (Security Key) 請換成自己的


【實際測試】

(下圖)驗證通過

(下圖)快速連續狂點按鈕,被懷疑不是人,驗證失敗。

********************************************************************************

2024-03-28補



//不使用 Newtonsoft.Json.Linq,而是使用 .NET Framework 內建的 JavaScriptSerializer 來解析 JSON 字串。
protected void Button_Login_Click(object sender, EventArgs e)
{
    string secretKey = "YOUR_SECRET_KEY"; // 替換為您自己的reCAPTCHA v3秘鑰 YOUR_SECRET_KEY
    string token = recaptchaToken.Value; // 取得令牌(token)值

    using (var client = new WebClient())
    {
        var response = client.DownloadString($"https://www.google.com/recaptcha/api/siteverify?secret={secretKey}&response={token}");

        // 將回應轉換成字串
        string responseString = Encoding.UTF8.GetString(Encoding.Default.GetBytes(response));

        // 將 JSON 字串轉換成動態物件
        dynamic result = new JavaScriptSerializer().DeserializeObject(responseString);

        // 取得 success 屬性值
        bool success = result["success"];

        if (success)
        {
            Label_MSG1.Text = "Google reCAPTCHA v3 驗證通過!";
        }
        else
        {
            Label_MSG1.Text = "Google reCAPTCHA v3 驗證失敗,請重試!";
        }
    }
}

實際測試可用。

(完)

相關

沒有留言:

張貼留言