[React.js] 來點capcha吧!

更新於 發佈於 閱讀時間約 10 分鐘

有一天早上,我悠哉地端著咖啡打開YT,正享受著每周四早上用「老高與小茉」配早餐的美好時光時,突然收到一封敝公司資安團隊警告信,內容大概是說村莊沒有失火,但我們的系統遭遇自動化機器人攻擊,可能需要增加一點capcha功能。


喔對了,早上10點收到信,中午12點前就要做好上線,主管說前端就簡單拉一下就好很快啦 。


正好之前沒做過,趁這次來記錄一下。


何謂 CAPTCHA?

raw-image


CAPTCHA 一字,是「全自動區分電腦和人類的公開圖靈測試」的縮寫。

Completely Automated Public Turing test to tell Computers and Humans Apart 

會在網頁上出現奇怪的文字或是圖案要你輸入,也就是俗稱的「驗證碼」。

人類何苦為難人類?

CAPTCHA 的主要目的之一是確保登錄或註冊行為是由真實的人類執行,而不是機器人或其他自動化程式。為了實現這一目的,最簡單的方式就是在登錄或註冊頁面上添加 CAPTCHA 控件,並對其進行調整,增加圖像辨識的難度,從而提高自動化程式通過驗證的難度。

raw-image


p.s. 近年AI發展快速,已經有相當多研究指出這些AI判斷精準度幾乎超越人類


恩,上面說要做capcha你就做capcha,囉嗦啥呢


這次紀錄的是用React.js做一個capcha 元件,整體邏輯步驟如下:

  1. 後端會給你一字串
  2. 前端把文字畫出來
  3. 做一個輸入框往後面丟

我們開始囉~

首先準備一個react function component,先轉一轉,再泡泡牛奶。

我們畫圖預計使用canvas套件,無論你是裝NPM套件,還是直接用瀏覽器原生的都可以。

但是,可能是我平時沒有燒香拜佛的關係,我選了好幾套npm canvas套件安裝使用都失敗,於是我接下來只能用瀏覽器原生的canvas功能來demo。🤷‍♂️

Level0Capcha

import React, { useEffect, useRef } from "react";
export default function Level0Capcha() {
// 瀏覽器原生canvas需使用ref去關聯渲染
const canvasRef = useRef(null);

  useEffect(() => {
    const canvas = canvasRef.current;
    const ctx = canvas.getContext("2d");
    ctx.font = "48px serif";
    ctx.fillText("5566", 10, 50);
  }, []);

// 使用 canvas tag
  return <canvas ref={canvasRef} width={200} height={100} />;
}
  • 注意 Line:4 瀏覽器原生canvas需使用ref去關聯渲染

成果大概是這樣

raw-image


雖然看起來跟文字顯示沒什麼兩樣,但其實是張貨真價實的圖,很多年以前比較笨的自動化程式遇到圖片就會不知道如何辨識了。


但是,後來的圖像辨識能力顯著進步,於是我們要對圖片做一點加工,我們要幫它加上一點扭曲與噪點的效果


BasicCapcha

import React, { useEffect, useRef } from "react";
export default function BasicCapcha() {
const canvasRef = useRef(null);

  useEffect(() => {
    const canvas = canvasRef.current;
    const ctx = canvas.getContext("2d");
    ctx.font = "48px serif";
    ctx.fillText("5566", 10, 50);
// 圖片扭曲效果
distort(ctx, canvas);
// 圖片噪點效果
addNoise(ctx, canvas);

  }, []);


  return <canvas ref={canvasRef} width={200} height={100} />;
}

主要是在繪製canvas的時候去呼叫兩個改變效果的function分別是:
distort 圖片扭曲效果

function distort(ctx, canvas) {
const distortionCanvas = document.createElement("canvas");
distortionCanvas.width = canvas.width;
distortionCanvas.height = canvas.height;
const distortionCtx = distortionCanvas.getContext("2d");

const displacement = 5; // 這裡控制扭曲程度
for (let y = 0; y < canvas.height; y++) {
for (let x = 0; x < canvas.width; x++) {
const offsetX = Math.round(Math.sin(y / 10) * displacement);
const offsetY = Math.round(Math.cos(x / 10) * displacement);
distortionCtx.drawImage(
canvas,
x,
y,
1,
1,
x + offsetX,
y + offsetY,
1,
1
);
}
}

ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.drawImage(distortionCanvas, 0, 0);
}

noise 圖片噪點效果

function addNoise(ctx, canvas) {
const noiseDensity = 0.05; // 控制噪點密度
const noiseAmount = 50; // 控制噪點強度

for (let y = 0; y < canvas.height; y++) {
for (let x = 0; x < canvas.width; x++) {
if (Math.random() < noiseDensity) {
const offset = Math.round(
Math.random() * noiseAmount - noiseAmount / 2
);
const pixel = ctx.getImageData(x, y, 1, 1);
const [r, g, b, a] = pixel.data;
ctx.fillStyle = `rgba(${r},${g},${b},${a})`;
ctx.fillRect(x + offset, y + offset, 1, 1);
}
}
}
}

成果大概是這樣

raw-image


反正我交上去之後,資安團隊跟我說這樣好普通,可不可以再難一點點的? 不要太難,要有點獨特性的。


好吧,我只好用我最喜歡的女團成員做一個...

K-POP Capcha

export default function KPOPCapcha() {
const canvasRef = useRef(null);

useEffect(() => {
const canvas = canvasRef.current;
const ctx = canvas.getContext("2d");

const img = new Image();
img.crossOrigin = "anonymous"; // 這是為了處理跨域圖片
img.onload = () => {
ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
distort(ctx, canvas);
addNoise(ctx, canvas);
};
img.src =
"https://upload.wikimedia.org/wikipedia/commons/1/12/230601_Karina_%28aespa%29.jpg";
}, []);

return (
<div
style={{ display: "flex", flexDirection: "column", alignItems: "center" }}
>
<h1>Login</h1>
<canvas ref={canvasRef} width={200} height={100} />
<h2>{"Please enter the K-POP Singer's name."}</h2>
<TextField />
</div>
);
}


來啊,猜看看這誰啊

raw-image



留言
avatar-img
留言分享你的想法!
avatar-img
alex.d9的沙龍
20會員
11內容數
這邊應該會放軟體開發、 讀書心得和自我成長的內容。
你可能也想看
Thumbnail
孩子寫功課時瞇眼?小心近視!這款喜光全光譜TIONE⁺光健康智慧檯燈,獲眼科院長推薦,網路好評不斷!全光譜LED、180cm大照明範圍、5段亮度及色溫調整、350度萬向旋轉,讓孩子學習更舒適、保護眼睛!
Thumbnail
孩子寫功課時瞇眼?小心近視!這款喜光全光譜TIONE⁺光健康智慧檯燈,獲眼科院長推薦,網路好評不斷!全光譜LED、180cm大照明範圍、5段亮度及色溫調整、350度萬向旋轉,讓孩子學習更舒適、保護眼睛!
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
想發簡訊給自己經營的電商會員時,可以直接用大量簡訊平台一次發送。 但目前因為詐騙簡訊"盛行"的關係,申請這類平台的規則也變嚴格了,連自己的個資也要上繳給這些平台做身份驗證,所以還是找一些安全、有信譽的廠商,免得把自己的個資賣掉外,自己會員的個資也賣了。
Thumbnail
想發簡訊給自己經營的電商會員時,可以直接用大量簡訊平台一次發送。 但目前因為詐騙簡訊"盛行"的關係,申請這類平台的規則也變嚴格了,連自己的個資也要上繳給這些平台做身份驗證,所以還是找一些安全、有信譽的廠商,免得把自己的個資賣掉外,自己會員的個資也賣了。
Thumbnail
本文介紹如何對 Telegram 憑證監控機器人的代碼進行優化,包括新增指令、讀取變數、提高可讀性和可維護性。
Thumbnail
本文介紹如何對 Telegram 憑證監控機器人的代碼進行優化,包括新增指令、讀取變數、提高可讀性和可維護性。
Thumbnail
戰男女性別!! 好啦,其實我也不知道辣XDDD 但就是最近很夯的Threads,原本剛申請的時候,純粹只是拿來發發一些廢短文,抒發性質居多,也沒想太多。 但可能是最近脆的用戶暴增,不小心隨便發一則小廢短句,都會有陌生人來響應,真的是嚇死寶寶了~~ 然後捏,一不小心就掌握到了流量密碼,當然我的
Thumbnail
戰男女性別!! 好啦,其實我也不知道辣XDDD 但就是最近很夯的Threads,原本剛申請的時候,純粹只是拿來發發一些廢短文,抒發性質居多,也沒想太多。 但可能是最近脆的用戶暴增,不小心隨便發一則小廢短句,都會有陌生人來響應,真的是嚇死寶寶了~~ 然後捏,一不小心就掌握到了流量密碼,當然我的
Thumbnail
【駭入別人銷售漏斗,模仿驗證有效流程】
Thumbnail
【駭入別人銷售漏斗,模仿驗證有效流程】
Thumbnail
為什麼要登出使用者? 安全性:防止未經授權的人,在使用者暫離時使用系統,這在公用或共享電腦的環境中尤其重要。 資料保護:只要使用者處於登入狀態,就會暴露在個人資料被他人操縱或利用的風險中,因此登出閒置使用者對資安也很重要。 如何在 Vue 3 專案中實作此功能?
Thumbnail
為什麼要登出使用者? 安全性:防止未經授權的人,在使用者暫離時使用系統,這在公用或共享電腦的環境中尤其重要。 資料保護:只要使用者處於登入狀態,就會暴露在個人資料被他人操縱或利用的風險中,因此登出閒置使用者對資安也很重要。 如何在 Vue 3 專案中實作此功能?
Thumbnail
1. 如何分辨詐騙、避免被詐騙 2. 掃毒、增強帳號安全、多段驗證、安全金鑰 3.快速取回帳號
Thumbnail
1. 如何分辨詐騙、避免被詐騙 2. 掃毒、增強帳號安全、多段驗證、安全金鑰 3.快速取回帳號
Thumbnail
👨‍💻簡介 最近因為憑證越來越多,需要監控什麼時候到期,當到期時發送到期通知,因此撰寫一個簡單的小程式來完成。 這次使用Python和Telegram Bot來監控SSL證書的到期時間並發送通知。並使用GCP工具,如CloudFunction和CloudScheduler做部署平台。
Thumbnail
👨‍💻簡介 最近因為憑證越來越多,需要監控什麼時候到期,當到期時發送到期通知,因此撰寫一個簡單的小程式來完成。 這次使用Python和Telegram Bot來監控SSL證書的到期時間並發送通知。並使用GCP工具,如CloudFunction和CloudScheduler做部署平台。
Thumbnail
使用React.js實作CAPTCHA元件的步驟和技巧
Thumbnail
使用React.js實作CAPTCHA元件的步驟和技巧
Thumbnail
手機及網路已深入日常生活與消費習慣,春節期間不管是出遊派還是在宅派都會使用手機或各種網路服務,例如查詢出遊走春資訊、景點打卡、簡訊拜年、網路購物、線上追劇等等。對此,數位發展部資通安全署指出,使用便利服務的同時,也要注意資安防護,像是不法集團常常利用釣魚網站假連結,騙取民眾輸入個資或信用卡資料。
Thumbnail
手機及網路已深入日常生活與消費習慣,春節期間不管是出遊派還是在宅派都會使用手機或各種網路服務,例如查詢出遊走春資訊、景點打卡、簡訊拜年、網路購物、線上追劇等等。對此,數位發展部資通安全署指出,使用便利服務的同時,也要注意資安防護,像是不法集團常常利用釣魚網站假連結,騙取民眾輸入個資或信用卡資料。
Thumbnail
談了許多網路安全的議題,提醒民眾要注意哪些事情,建構哪些網路安全思維,讓我們可以降低踏入詐騙陷阱的風險。但除了民眾本身要不斷學習、提升防詐意識外,是不是還有其他方面的作法呢? 本文就來聊聊在企業端可以做些什麼。 要打造一個密不可破的防護網,企業端就不能夠缺席。 舉幾個例子讓大家知道。
Thumbnail
談了許多網路安全的議題,提醒民眾要注意哪些事情,建構哪些網路安全思維,讓我們可以降低踏入詐騙陷阱的風險。但除了民眾本身要不斷學習、提升防詐意識外,是不是還有其他方面的作法呢? 本文就來聊聊在企業端可以做些什麼。 要打造一個密不可破的防護網,企業端就不能夠缺席。 舉幾個例子讓大家知道。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News