Trang chủĐăng kýĐăng nhập Cộng đồng tin học
Thứ 2, 2024-04-29, 11:51 AM
Khung đăng nhập

Khung tán gẫu
Xóm 'bà Tám'

http://congdongtinhoc.net
CHUYÊN TRANG GAME ONLINE GIẢI TRÍ//lehung-system.ucoz.net/stuff/

Thống kê diễn đàn
Bài viết mới nhất Trang chủ cập nhật Top 10 thành viên tích cực 10 Thành viên mới nhất
  • Quạt Hướng Trục
  • vào ucoz.com thiết kế web không hiểu sao...
  • Sothink DHTMLMenu 9.2 Build 90326
  • cho em quảng cáo cái
  • BIDV triển khai gói 10.000 tỷ đồng cho v...
  • Phượng Đã Nở Ngoài Hiên
  • Ngựa Ô Thương Nhớ
  • Những mẩu chuyện vui
  • 1001 cách biến "sim rác" thành...
  • Windows XP Media Center Edition 2008 - S...
  • Hướng dẫn chỉnh sửa dữ liệu trong form m...
  • 15 điều người dùng máy tính nên biết
  • Choáng vì "sâu" mới phát tán qua email
  • Giấu bớt những thành phần Control Panel ...
  • Thảo luận về IFrame Injection Attacks
  • Miễn phí bản quyền Ashampoo Anti-Malware...
  • Trải nghiệm với Camtasia Studio 7
  • 10 kỹ năng IT ‘hot’ của năm 2011
  • Intel công bố bộ vi xử lý Hệ thống trên ...
  • Kho phần mềm dành cho Android
  • Hung@info
  • thangbom
  • Hung@webmater
  • hebeo
  • giodaingan
  • david15
  • whitecat
  • luutruthongtin
  • systemfan_12
  • sha66b5cates0428
  • amir2x4
  • taiwindows075
  • kholuutru
  • shahmeerolivedigital9
  • ysg06363100
  • hetoxe6474
  • rootanalysisusa
  • memory_gift
  • systemfan_12
  • quatcongnghiep_saigon


  • [ Tổng hợp bài mới · Tổng số thành viên · Nội qui chung · Tìm kiếm bài viết · RSS ]
    • Page 1 of 1
    • 1
    Diễn đàn » Lập Trình » .NET » Ô mật khẩu “tự bảo vệ”
    Ô mật khẩu “tự bảo vệ”
    Hung@webmaterDate: Thứ 6, 2009-09-11, 8:31 AM | Bài viết # 1
    Quản trị viên
    Nhóm: Quản trị viên
    Bài viết: 126
    Uy tín: 1
    Hiện tại: Offline
    Rất nhiều bạn hỏi về cách làm ô mật khẩu bảo vệ trong môi trường .NET, cách chặn message EN_UPDATE của Textbox để lưu mật khẩu sang một thuộc tính khác và biến thuộc tính Text thành những dấu * cùng nhiều câu hỏi khác liên quan tới vấn đề bảo vệ ô mật khẩu.

    Trước hết, xin thông báo với các bạn một tin mừng là trong môi trường .NET việc “subclass” các form, control đã trở nên cực kỳ đơn giản. Thay vì sử dụng các hàm API theo một quy trình lằng nhằng hoặc phải cầu viện tới những công cụ như MsgHook OCX (mà không phải lúc nào cũng có thể kiếm được đồ miễn phí), lập trình viên chỉ cần “override” thủ tục WndProc. Thủ tục này nhận đầu vào là một đối tượng kiểu System.Windows.Forms.Message với các thành phần mô tả message: hWnd (handle của cửa sổ nhận message), Msg (số hiệu message), WParam và LParam (các dữ liệu bổ sung đi kèm với message). Việc tạo một kiểu TextBox đặc biệt trở nên đơn giản hơn bao giờ hết:

    Code
    Public Class SecureTextBox

    Inherits TextBox

    Private Const WM_GETTEXT As Integer = &HD

       Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)

         Select Case m.Msg

           Case WM_GETTEXT

                ‘ Do nothing here to disable the default

           Case Else  

                ‘pass unhandled messages back to the default message handler  

                MyBase.WndProc(m)  

         End Select

       End Sub

    End Class

    Sau đó, chúng ta cần thay thế các tham chiếu tới TextBox chuẩn thành tham chiếu tới lớp SecureTextBox vừa tạo. Ví dụ:

    Code
    ‘ Friend WithEvents TextBox1 As TextBox

    ‘ chuyển thành

    Friend WithEvents TextBox1 As SecureTextBox

    ‘ Me.TextBox1 = New System.Windows.Forms.TextBox()

    ‘ chuyển thành

    Me.TextBox1 = New SecureTextBox()

    Nếu muốn dùng một control kiểu mới để chặn tận gốc mọi mưu đồ đọc trộm thuộc tính Text, bạn có thể vào địa chỉ http://www.codeproject.com/cs/miscctrl/passwordbox.asp xem cách làm và tải chương trình nguồn về tham khảo.

    Với một số bạn sử dụng VB6, sự nhầm lẫn đáng tiếc của tôi khi đề cập tới message EN_UPDATE ở phần cuối bài viết trước đã gây cho họ không ít bối rối. Thực ra, việc chặn message đó thích hợp với VC++ hơn là với VB6. Với VB6, chúng ta có thể xử lý mọi chuyện trong thủ tục ứng với sự kiện Change của Textbox. Để sửa sai, tôi xin gửi tặng các bạn chương trình nguồn của SECURPWD.OCX do tôi phát triển. Chương trình của tôi chưa thật hoàn thiện (tôi chưa nghĩ được cách nào giải quyết dứt điểm vấn đề) vì nó dựa trên giả định mật khẩu do người dùng nhập vào không chứa ký tự nào giống ký tự được chọn làm PasswordChar. Để tránh khả năng đó và tạo hình tròn màu đen trong ô mật khẩu giống Windows XP, tôi sử dụng ký tự số 149 làm PasswordChar, đặt phông chữ Times New Roman cỡ 11 cho Textbox trong chương trình và không để lộ các thuộc tính Font, PasswordChar của SecurPwd. Sau khi hoàn thành chương trình tôi mới biết rằng Microsoft cũng sử dụng ký tự số 149 (nhưng là của phông Tahoma, phông chữ mặc định trong Windows XP) để làm ký tự thay thế trong ô mật khẩu của thư viện Comctl32.dll phiên bản 6. Vì ký tự đó trong các phông khác có thể có hình dạng khác nên nếu người lập trình đặt lại phông chữ thì ký tự thay thế có thể hiển thị không đúng ý định của Microsoft. Do ký tự 149 của phông Times New Roman hiển thị dấu tròn hơi nhỏ nên tôi buộc phải ép cỡ chữ 11 để dấu tròn khỏi biến thành hình vuông.

    Đoạn mã cho sự kiện Change không có gì phức tạp nhưng tôi buộc phải tách làm hai trường hợp vì hàm Mid của VB6 không chấp nhận giá trị âm cho tham số độ dài chuỗi cần lấy.

    Code
    Private Sub Text1_Change()

       Dim text_len, RealText_len, cnt, diff_start, diff_end, SelStart_pos

       text_len = Len(Text1.Text)

       RealText_len = Len(m_RealText)

       SelStart_pos = Text1.SelStart

       Sel_len = Text1.SelLength

       diff_start = 0

       For cnt = 1 To text_len

           If Mid$(Text1.Text, cnt, 1) <> Text1.PasswordChar Then diff_start = cnt: Exit For

       Next  

       If diff_start = 0 Then  

           If text_len <> RealText_len Then  

               m_RealText = Mid$(m_RealText, 1, SelStart_pos) & Mid$(m_RealText, Abs(RealText_len - text_len) + SelStart_pos + 1)  

               Text1.Text = String(text_len, Text1.PasswordChar)  

               Text1.SelStart = SelStart_pos  

           End If  

           Exit Sub  

       End If  

       For cnt = diff_start + 1 To text_len  

           If Mid$(Text1.Text, cnt, 1) = Text1.PasswordChar Then diff_end = cnt: Exit For  

       Next  

       If diff_end = 0 Then diff_end = text_len + 1  

       m_RealText = Mid$(m_RealText, 1, diff_start - 1) & Mid$(Text1.Text, diff_start, diff_end - diff_start) & Mid$(m_RealText, diff_end - (text_len - RealText_len))  

       Text1.Text = String(text_len, Text1.PasswordChar)  

       Text1.SelStart = SelStart_pos

    End Sub

    Tôi đặt thuộc tính RealText thành chỉ đọc trong lúc chạy và không tồn tại khi thiết kế vì hai lý do: rất ít khi lập trình viên có nhu cầu đặt giá trị mật khẩu thay cho người dùng cuối, việc cho phép lập trình viên đặt lại RealText cho ô mật khẩu sẽ dẫn đến việc phải đặt lại thuộc tính Text (và làm đảo lộn hết mọi lôgic trong sự kiện Change của TextBox).

    Code
    Public Property Let RealText(ByVal New_RealText As String)  

       If Ambient.UserMode = False Then Err.Raise 387  

       If Ambient.UserMode Then Err.Raise 382  

       m_RealText = New_RealText  

       PropertyChanged “RealText”

    End Property

    Vấn đề cuối cùng của SecurPwd là việc đặt thuộc tính PasswordChar cho Text1. Việc này dường như không thật sự cần thiết vì có thể dùng một biến chứa ký tự 149 để dùng trong thủ tục Text1_Change. Tuy nhiên, nếu không đặt thuộc tính PasswordChar cho Text1 thì người dùng cuối có thể chép nội dung của ô mật khẩu. Bản thân việc chép nội dung của ô mật khẩu không làm lộ mật khẩu vì chúng ta đã biến tất cả các ký tự trong thuộc tính Text thành các dấu tròn. Nhưng chuyện gì sẽ xảy ra nếu người dùng cuối lại dán những ký tự đó vào ô mật khẩu? Các bạn hãy nhớ lại hạn chế căn bản của SecurPwd là không xử lý được tình huống người dùng nhập ký tự trùng với ký tự thay thế!


     
    Diễn đàn » Lập Trình » .NET » Ô mật khẩu “tự bảo vệ”
    • Page 1 of 1
    • 1
    Search:


      Copyright Cộng đồng tin học © 2024