Web design and hosting, database, cloud and social media solutions that deliver business results
  • ビゞネス゜リュヌション
    • デヌタベヌスサヌビス
      • サヌバヌのアップグレヌドず DBA サヌビス
      • デヌタりェアハりス サヌビス
      • デヌタ統合
      • パワヌBI
    • りェブサむトデザむン
      • Web サむトのセキュリティ
      • Web サむトの最適化
      • ロゎデザむン
      • 支払いゲヌトりェむ
      • テクニカルツヌル
    • ビゞネスサヌビス
      • Google クラりド サヌビス
      • アマゟン りェブ サヌビス
      • マむクロ゜フト アズヌル
    • ゜ヌシャルメディア
    • マむクロ゜フトオフィス
  • å­Šæ ¡
    • テスト環境
    • 孊習デヌタベヌス
      • 基瀎
      • SQL Serverデヌタ
      • SQLServerのメンテナンス
      • SQL Serverの日付の䜿甚
      • SQLServerピボットの䜿甚-ピボット解陀
      • SQLServer関数の䜿甚
      • オヌプンク゚リを取埗
      • ツヌル
    • りェブデザむンを孊ぶ
      • Ousia コンテンツ管理システムの構築
      • ASP-NET の䜿甚
      • CSS の䜿甚
      • JavaScript の䜿甚
    • クラりドず IT サヌビスの孊習
      • タスク スケゞュヌラ ゚ラヌ 2147943645
      • OpenSSL での SSL の芁求ず PFX ファむルの生成の簡単な手順
    • ゜ヌシャル メディアの䜿甚
      • Facebookアカりントを個人甚からビゞネス甚に倉曎する
      • Google レビュヌを䟝頌する
      • ゜ヌシャル メディアの取り組みをどこに集䞭させるかを遞択する
      • ゜ヌシャル メディアの画像サむズ
      • メタ デヌタを䜿甚しお゜ヌシャル メディア画像を蚭定する
  • 私たちに関しおは
    • ブログ
      • Google コア アップデヌト 2020 幎 1 月
      • むンタヌネット䞊のりェブサむトに関する最も厄介なこず
      • りェブサむトの広告リヌフレットのコンテンツを遞択する方法
      • ゚ントリヌレベルのゲヌム機の構築
      • オンラむン詐欺の防止
      • ギグ゚コノミヌのスキマヌ
      • ホットチリむンタヌネット閉鎖
      • 無料のベクタヌ グラフィックスのトップ 5 Web サむト
    • キャリア
      • 翻蚳者 英日
      • 英語-トルコ語翻蚳者
    • チヌム
      • アむセ・ハヌ
      • アリ アル アミン
      • ギャビン・クレむトン
      • サむガングヌ
      • スヌリダ・ムッカマラ
      • スニヌル・クマヌル
      • チェスタヌコッパヌポット
    • ポヌトフォリオ
English (EN-US)English (EN-GB)à€¹à€¿à€‚à€Šà¥€ (HI)italiano (IT)日本語 (JA)Português (PT)

.NET での CAPTCHA むメヌゞの䜜成

チュヌトリアル: SQL デヌタベヌスを䜿甚しお ASP.NET でキャプチャ むメヌゞを䜜成し、芁求を凊理しお䞍芁なゲストを締め出す
If you want to run through this walkthrough, please follow the guide on setting up our test environment.

Experience Level - Intermediate

Captcha Image

Web サむトが倧量の䞍芁なゲストやボットによっおアクセスされおいないこずを確認するために Captcha が必芁ですか?

これは、自分で簡単なものを䜜成する方法です。最も耇雑ではないかもしれたせんが、少なくずも远加のセキュリティ局を提䟛し、垞に倉化する結果セットを提䟛したす。

これは、VB.NET ず MVC ペヌゞ ルヌティングを䜿甚しお SQL で構築されおいたす。

たず、すべおの結果を栌玍する SQL テヌブルを䜜成する必芁がありたす。䜿甚頻床の高いシステムでは、GUID にむンデックスを䜜成する必芁がありたす。

Create Table

CREATE TABLE [dbo].[captcha]([captchaGUID] [varchar](36) NOT NULL,[captchaValue] [varchar](10) NULL,[captchaDateAdded] [datetime] NULL,[captchaDateGuessed] [datetime] NULL)

サヌビスペヌゞを远加

次に、ランダムな文字を生成する関数を䜜成したす。䞋郚をよく芋るず、コヌドはいく぀かの数倀に察しお空の文字列を返したす。このようにしお、生成される倀は垞にさたざたな長さになりたす。

倀ずしお 40 を䜿甚する理由は、文字列 (長さ 32) が空癜倀を返す確率を 5 分の 1 にするためです。

Random Letter Function

CREATE FUNCTION [dbo].[GetLetter](@MyInt INT) RETURNS VARCHAR(1) AS BEGINRETURN (SELECT REPLACE(SUBSTRING('ABCDEFGHJKMNPQRTUVQXYZ0123456789', @MyInt,1),'_',''))ENDGOSELECT dbo.GetLetter(ROUND(RAND()*40,0))

サヌビスペヌゞを远加

ここで、レコヌドを Web サむトに送り返すためのストアド プロシヌゞャを䜜成したす。これは、掚枬されたキャプチャが生成され、削陀される堎所でもありたす。このコヌドでは、30 分埌に削陀されたす。

関数を 10 回以䞊呌び出しお倀を連結し、叀い掚枬倀を削陀したす。

Stored Procedure

CREATE PROC [dbo].[NewCaptchaValue] AS BEGINWHILE (SELECT COUNT(*) FROM captcha WHERE captchaDateGuessed IS NULL)<150BEGIN
INSERT INTO captcha(captchaGUID,captchaValue,captchaDateAdded)SELECT NEWID(),dbo.GetLetter(ROUND(RAND()*40,0))+dbo.GetLetter(ROUND(RAND()*40,0))+dbo.GetLetter(ROUND(RAND()*40,0))+dbo.GetLetter(ROUND(RAND()*40,0))+dbo.GetLetter(ROUND(RAND()*40,0))+dbo.GetLetter(ROUND(RAND()*40,0))+dbo.GetLetter(ROUND(RAND()*40,0))+dbo.GetLetter(ROUND(RAND()*40,0))+dbo.GetLetter(ROUND(RAND()*40,0))+dbo.GetLetter(ROUND(RAND()*40,0)),GETDATE()ENDDELETE FROM captcha WHERE captchaDateGuessed<DATEADD(MINUTE,-30,GETDATE())DECLARE @Newcaptcha VARCHAR(36)=(SELECT TOP 1 captchaGUID FROM captcha WHERE captchaDateGuessed IS NULL)SELECT @NewcaptchaEND

サヌビスペヌゞを远加

ここで、提䟛された倀を返すストアド プロシヌゞャを䜜成し、倀が正しいかどうかを確認する必芁がありたす。

Pass/Fail の文字列を送り返すこずにしたした。

Stored Procedure

CREATE PROC [dbo].[CaptchaValue](@captchaGUID VARCHAR(36),@captchaValue VARCHAR(10)) AS BEGINDECLARE @CaptchaValueDB VARCHAR(10)=(SELECT captchaValue FROM captcha WHERE captchaGUID=@captchaGUID)DECLARE @Newcaptcha VARCHAR(36)UPDATE captcha SET captchaDateGuessed=GETDATE() WHERE captchaGUID=@captchaGUIDIF @captchaValue=@CaptchaValueDBBEGINSET @Newcaptcha='Pass'ENDIF @captchaValue<>@CaptchaValueDB OR @CaptchaValueDB IS NULLBEGINSET @Newcaptcha='Fail'ENDSELECT @NewcaptchaEND

Visual Studio でアカデミヌ プロゞェクトに切り替える

CS_1_Add_AppCode.png

ここに埓うべきいく぀かのステップ

  • プロゞェクトにただない堎合は、スクリヌンショットに埓っお App_Code フォルダヌを远加したす。
  • App_Code フォルダヌでマりスの右ボタンを抌し、[远加] > [クラス] を遞択したす。
  • ポップアップが衚瀺されたす。このクラスを Captcha.vb ず呌びたす。

この新しい項目を右クリックし、プロパティを遞択したす。

Public Class 宣蚀の䞊に、次の参照を远加したす。

Imports System.Drawing

Visual Studio でアカデミヌ プロゞェクトに切り替える

最初に䜜成するコヌドは、画像ボックスの端から線が匕く距離を生成する 2 ぀の関数です。これをクラス内に远加したす。
    Private Shared Function GenerateLineNumberY() As Integer        Dim ret As New Integer        ret = (6 * Right((Rnd() * Rnd() * Rnd()), 1)) + 2        Return ret    End Function    Private Shared Function GenerateLineNumberX() As Integer        Dim ret As New Integer        ret = (6 * Right((Rnd() * Rnd() * Rnd()), 1)) + 2        Return ret    End Function

Visual Studio でアカデミヌ プロゞェクトに切り替える

テキスト甚の 2 ぀の関数がありたす。1 ぀目は文字間の間隔を蚭定し、2 ぀目は文字が描画される䞊端からの高さを蚭定したす。
    Private Shared Function GenerateLineNumberSpace() As Integer        Dim ret As New Integer        ret = (Right(Rnd(), 1)) + 13        Return ret    End Function    Private Shared Function GenerateLineNumberHeight() As Integer        Dim ret As New Integer        ret = (2 * Right((Rnd() * Rnd() * Rnd()), 1)) + 1        Return ret    End Function

Visual Studio でアカデミヌ プロゞェクトに切り替える

次に、ランダムなペンずブラシの色を生成する 2 ぀の関数ず、応答に画像を返す最埌の関数を䜜成したす。
    Private Shared Function GenerateRandomPenColor() As System.Drawing.Pen        Dim mypen As New Pen(Brushes.Cyan)        Dim ret As New Integer        ret = Right((Rnd() * Rnd() * Rnd()), 1)        Select Case ret            Case 5, 0, 1                mypen.Color = Color.DarkGray            Case 6, 2                mypen.Color = Color.DarkRed            Case 7, 3, 9                mypen.Color = Color.DarkOliveGreen            Case 8, 4                mypen.Color = Color.DarkOrange        End Select        Return mypen    End Function    Private Shared Function GenerateRandomBrushColor() As System.Drawing.SolidBrush        Dim myBrush As New SolidBrush(Color.Aqua)        Dim ret As New Integer        ret = Right((Rnd() * Rnd() * Rnd()), 1)        Select Case ret            Case 5, 0, 1                myBrush.Color = Color.DarkGray            Case 6, 2                myBrush.Color = Color.DarkRed            Case 7, 3, 9                myBrush.Color = Color.DarkOliveGreen            Case 8, 4                myBrush.Color = Color.DarkOrange        End Select        Return myBrush    End Function    Public Shared Function GenerateCaptcha(CaptchaString As String) As Bitmap        Dim Height As Integer = 60        Dim Width As Integer = 300        Dim objBitmap As Bitmap        Dim objGraphics As Graphics
        Dim oPoint As New PointF        objBitmap = New Bitmap(Width, Height)        objGraphics = Graphics.FromImage(objBitmap)        'Draw Background        objGraphics.FillRectangle(Brushes.White, 0, 0, Width, Height)        objGraphics.DrawRectangle(Pens.Black, 0, 0, Width - 2, Height - 2)        'Draw Text        Dim oFont As New Font("Arial", 20)        Dim spac As Integer = 5        Dim stringInt As Integer = 1        While stringInt <= CaptchaString.Length            spac = spac + GenerateLineNumberSpace()            oPoint = New PointF(spac, GenerateLineNumberHeight)            objGraphics.DrawString(Mid(CaptchaString, stringInt, 1), oFont, GenerateRandomBrushColor, oPoint)            stringInt = stringInt + 1        End While        'White Lines        objGraphics.DrawLine(Pens.White, GenerateLineNumberX, GenerateLineNumberY, Width - GenerateLineNumberX(), Height - GenerateLineNumberY())        objGraphics.DrawLine(Pens.White, GenerateLineNumberX, GenerateLineNumberY, Width - GenerateLineNumberX(), Height - GenerateLineNumberY())        objGraphics.DrawLine(Pens.White, GenerateLineNumberX, GenerateLineNumberY, Width - GenerateLineNumberX(), Height - GenerateLineNumberY())        objGraphics.DrawLine(Pens.White, GenerateLineNumberX, GenerateLineNumberY, Width - GenerateLineNumberX(), Height - GenerateLineNumberY())        objGraphics.DrawLine(Pens.White, GenerateLineNumberX, GenerateLineNumberY, Width - GenerateLineNumberX(), Height - GenerateLineNumberY())        objGraphics.DrawLine(Pens.White, GenerateLineNumberX, GenerateLineNumberY, Width - GenerateLineNumberX(), Height - GenerateLineNumberY())        objGraphics.DrawLine(Pens.White, GenerateLineNumberX, GenerateLineNumberY, Width - GenerateLineNumberX(), Height - GenerateLineNumberY())        objGraphics.DrawLine(Pens.White, GenerateLineNumberX, GenerateLineNumberY, Width - GenerateLineNumberX(), Height - GenerateLineNumberY())        objGraphics.DrawLine(Pens.White, GenerateLineNumberX, GenerateLineNumberY, Width - GenerateLineNumberX(), Height - GenerateLineNumberY())        'Draw Lines        objGraphics.DrawLine(GenerateRandomPenColor, GenerateLineNumberX, GenerateLineNumberY, Width - GenerateLineNumberX(), Height - GenerateLineNumberY())        objGraphics.DrawLine(GenerateRandomPenColor, GenerateLineNumberX, GenerateLineNumberY, Width - GenerateLineNumberX(), Height - GenerateLineNumberY())
        objGraphics.DrawRectangle(Pens.Black, 0, 0, Width - 2, Height - 2)
        Return objBitmap    End Function
プロゞェクトの初期段階で Global.asax ファむルに䜜成したルヌト テヌブルにこのサヌビスを远加しお、以䞋のように新しいルヌトを远加したす。

サブ RegisterRoutes を芋぀けお、内郚に新しいルヌト (Routes.MapPageRoute) を远加したす。

    Sub RegisterRoutes(ByVal Routes As RouteCollection)        Routes.MapPageRoute("Captcha", "Captcha/{GUID}", "~/Data/Images/CaptchaService.aspx")    End Sub

サヌビスペヌゞを远加

次に、返された画像をナヌザヌに出力する関数を䜜成したしょう。デヌタずペヌゞを分離するためにいく぀かのフォルダヌを䜜成するこずから始めたしょう。

デヌタ フォルダヌを远加するには、次のオプションを䜿甚したす。

  • ClaytabaseAcademy を右クリックし、[远加] > [新しいフォルダヌ] オプションを䜿甚しお、フォルダヌに Data ずいう名前を付けたす。
  • ここで、Images ずいう名前の別のフォルダヌをデヌタ フォルダヌに远加したす。
  • 次に、CaptchaService.aspx ずいう Web フォヌムを Images フォルダヌに远加したす。

このペヌゞは、先ほど䜜成したルヌト ハンドラによっお呌び出されたす。

Replace Code

Imports System.Data.SqlClientImports ClaytabaseAcademy.GlobalVariablesImports ClaytabaseAcademy.CaptchaImports System.DrawingImports System.Drawing.ImagingPublic Class CaptchaService    Inherits System.Web.UI.Page    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load        Dim captchaguid As String = RouteData.Values("GUID").ToString        Dim con As New SqlConnection(ConStr)        Dim com As New SqlCommand("SELECT captchaValue FROM captcha WHERE captchaGUID='" + captchaguid + "'", con)        con.Open()        Dim CaptchaBitmap As Bitmap = GenerateCaptcha(com.ExecuteScalar)        con.Close()        Response.ClearContent()        Response.ContentType = "image/bmp"        CaptchaBitmap.Save(Response.OutputStream, ImageFormat.Gif)    End SubEnd Class

サヌビスペヌゞを远加

Claytabase Academy を右クリックしお [远加] > [新しいフォルダヌ] を遞択し、プロゞェクトのルヌトに Pages ずいう名前の新しいフォルダヌを䜜成したす。

CaptchaView ずいう新しい Web フォヌムを远加したす。

新しい Web ペヌゞを䜜成し、むメヌゞ コントロヌル、テキスト ボックス、ボタン、hiddenfield、およびラベルをドラッグするか、以䞋のコヌドをペヌゞの本文 (HTML 郚分) にコピヌしたす。
<body>    <form id="form1" runat="server" style="margin:100px auto;width:300px;padding:10px;background-color:#fff;box-shadow:0 0 3px 0 #222;border-radius: 8px;">        <div style="text-align:center;">            <asp:Image ID="CaptchaImage" runat="server" />        </div>        <div style="text-align:center;">            <asp:TextBox ID="captchaEntered" runat="server"></asp:TextBox>        </div>        <div style="text-align:center;">            <asp:Button ID="captchaSubmit" runat="server" Text="Submit" style="margin:5px auto"/>            <asp:HiddenField ID="captchaGuid" runat="server" />        </div>        <div style="text-align:center;">            <asp:Label ID="captchaResult" runat="server" Text=""></asp:Label>        </div>    </form></body>

最埌のステップは、コヌドが機胜するこずをテストするこずです。このためには、コヌド ビハむンド (右クリック > ビュヌ コヌド) に移動し、コヌド ビハむンドを以䞋のものに曎新する必芁がありたす。

これにより、ペヌゞの読み蟌み時に実行されるサブず、远加したボタンのクリックを凊理する別のサブが䜜成されたす。

Imports System.Data.SqlClientImports ClaytabaseAcademy.GlobalVariablesPublic Class CaptchaView    Inherits System.Web.UI.Page    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load        If Not IsPostBack Then            Using con As New SqlConnection(ConStr)                Using com As New SqlCommand("EXEC dbo.NewCaptchaValue", con)                    con.Open()                    Dim Captcha As String = com.ExecuteScalar                    captchaGuid.Value = Captcha                    CaptchaImage.ImageUrl = "/Captcha/" + Captcha                End Using            End Using        End If    End Sub    Protected Sub GetCaptcha(sender As Object, e As EventArgs) Handles captchaSubmit.Click        If IsPostBack Then            Using con As New SqlConnection(ConStr)                Dim valStr As String = Replace(captchaEntered.Text, "'", "''")                Dim valGUID As String = Replace(captchaGuid.Value, "'", "''")                Response.Write("valStr: " + valStr + "<br>")                Response.Write("valGUID: " + valGUID + "<br>")                Using com As New SqlCommand("EXEC CaptchaValue '" & valGUID & "','" & valStr & "'", con)                    con.Open()                    Dim res As String = com.ExecuteScalar()                    captchaResult.Text = res                End Using                Response.Write("EXEC CaptchaValue '" & valGUID & "','" & valStr & "'")            End Using        End If    End SubEnd Class

Test that it has worked by select Build > Build Solution from the Top Menu

You should now be able to test this in a number of ways;

  • Click on Debug when on the relevant page
  • Right Mouse button on the item within the project explorer and selecting View in Browser
  • Right Mouse button on the page and select View in Browser

Helpful?

Please note, this commenting system is still in final testing.

Author

Claytabaseによるりェブサむトのデザむン

これは、圓瀟の Web サむト デザむン サヌビスの䞀郚である、垂堎で最も高速で最適化されたシステムの 1 ぀である Ousia コンテンツ管理システム コヌドから倉曎されたコヌドのセクションです。

これらは、玄£500から始たるサむトで利甚できたす.

詳现: レスポンシブで高速。コンテンツ管理システムを䜿甚した Web 開発、蚭蚈、およびホスティング
Copyright Claytabase Ltd 2020

Registered in England and Wales 08985867

RSSLoginLink クッキヌポリシヌサむトマップ

Social Media

facebook.com/Claytabaseinstagram.com/claytabase/twitter.com/Claytabaselinkedin.com/company/claytabase-ltd

Get in Touch

+442392064871info@claytabase.comClaytabase Ltd, Unit 3d, Rink Road Industrial Estate, PO33 2LT, United Kingdom
The settings on this site are set to allow all cookies. These can be changed on our Cookie Policy & Settings page.
By continuing to use this site you agree to the use of cookies.
Ousia Logo
Logout
Ousia CMS Loader