Access

Bảo mật tập tin .MDB

06/04/2013 17:09

Có ít nhất 5 cách để bảo mật tập tin .MDB, thêm một cách nữa cho chắc ăn...

Hầu như ai mần một ứng dụng Microsoft Access đều xài một trong những (hoặc tất cả) cách sau để tùy mức độ khác nhau có thể khóa tay, khóa chân những nhân viên tò mò kiểu biết ít mà thích quậy nhiều:

  1. Bảo vệ mã lệnh VBA (Visual Basic for Application) bằng cách chọn mục Properties trên trình đơn Tools của cửa sổ soạn thảo Microsoft Visual Basic, rồi chọn trang Protection trên khung đối thoại Project Properties. Cuối cùng đánh dấu chọn vào ô Lock project for viewing, kèm theo là mật khẩu bảo vệ. Với cách này, cấu trúc và dữ liệu các bảng (table) vẫn có thể được xem và sửa đổi.
  2. Dùng chức năng Make MDE file để ngăn không cho sửa đổi mã lệnh, sửa đổi thiết kế biểu mẫu (form), sửa đổi thiết kế báo biểu (report). Với cách này, cấu trúc và dữ liệu các bảng (table) vẫn có thể được lấy đi để chuyển vào tập tin .MDB khác mà xem và sửa đổi.
  3. Dùng chức năng Encrypt / Decrypt database… để mã hóa không cho một chương trình tiện ích hay một chương trình xử lý văn bản giải mã được, nhưng vẫn dùng Access để mở được.
  4. Dùng chức năng Set database password, và nếu quên mật khẩu thì … khóc luôn chứ sao. Hơi phiền nếu có một bảng trong căn cứ dữ liệu khác liên kết (link) với nó.
  5. Thiết kế một biểu mẫu khởi động, trong đó yêu cầu cho biết tên và mật khẩu theo kiểu dzô mạng in-tẹc-nét. Rồi dùng khung đối thoại Startup để xác định (từ danh sách Display Form/Page) phải mở biểu mẫu này trước tiên mỗi lần mở căn cứ dữ liệu. Nhờ cách này, ta có thể dấu luôn cửa sổ Database, nơi có thể xem và chọn các thành phần của căn cứ dữ liệu để sửa chữa.

Trong các cách trên, cách thứ 5 vẫn có thể bị vượt qua bằng cách nhấn và giữ phím Shift trong lúc mở căn cứ dữ liệu. Bài viết này mạn phép bàn về cách khóa luôn phím Shift.

Theo hướng dẫn của Microsoft, ta có thể dùng Visual Basic thay đổi thuộc tính AllowBypassKey để quy định có bỏ qua phím Shift khi mở căn cứ dữ liệu hay không. Ví dụ, nếu đặt để thuộc tính này bằng trị False sẽ vô hiệu phím Shift như nói trên.

Giả sử có một căn cứ dữ liệu tên dbLock.MDB, mỗi lần người ta mở nó, ta muốn biểu mẫu frmKhoiDong luôn được hiển thị trước tiên bằng cách xác định Display Form/PagefrmKhoiDong. Để thay đổi thuộc tính AllowBypassKey, bắt buộc phải mở căn cứ dữ liệu, đặt để trị mới cho thuộc tính này, đóng căn cứ dữ liệu lại thì lần mở sau mới có ép-phê. Nên nhớ rằng: khóa làm sao để người ta không mở được, mà mình phải mở được, có nghĩa là ta phải có chìa khóa để mở, và chìa ở đây chính là một biểu mẫu khác có tên giả sử là frmChiaKhoa.

Khi đã thay đổi thuộc tính AllowBypassKey được rồi, chắc chắn lúc nào mở căn cứ dữ liệu ra, biểu mẫu frmKhoiDong được hiển thị. Cho nên ta sẽ đặt chìa khóa thông qua biểu mẫu này bằng cách vẽ một ô điều khiển nào đấy (miễn sao nó có thủ tục xử lý tình huống Click là được), ví dụ: ô nhãn lblChiaKhoa, rồi đặt để thuộc tính VisibleNo, và thêm dòng lệnh DoCmd.OpenForm “frmChiaKhoa” vào thủ tục xử lý tình huống Click. Bạn phải nhớ vị trí ô nhãn lblChiaKhoa để lôi chìa khóa ra nhé. Như vậy, vấn đề còn lại nằm ở biểu mẫu frmChiaKhoa.

Mở cửa sổ soạn thảo Microsoft Visual Basic, chọn mục References… để bảo đảm Microsoft DAO xx.xx Object Library (trong đó, phiên bản xx.xx có thể là: 2.5, hoặc 3.51, hoặc 3.6 tùy theo phiên bản Access, nên chọn phiên bản mới nhất) đã được chọn trong danh sách Available References.

Hình trên là biểu mẫu frmChiaKhoa cần thiết kế, trong đó: một ô văn bản txtPassword để nhận mật khẩu mà người cần mở khóa phải gõ vào; một nút lệnh cmdLock thực hiện việc khóa căn cứ dữ liệu; một nút lệnh cmdUnlock thực hiện việc mở khóa căn cứ dữ liệu. Xong, bạn gõ các thủ tục xử lý như sau:

Hàm ChangeProperty thay đổi các thuộc tính của căn cứ dữ liệu:

Function ChangeProperty(strPropName, varPropType, _

varPropValue)

Dim dbs As Database, prp As Property

Const conPropNotFoundError = 3270

Set dbs = CurrentDb

On Error GoTo Change_Err

dbs.Properties(strPropName) = varPropValue

ChangeProperty = True

Change_Bye:

Exit Function

Change_Err:

If Err = conPropNotFoundError Then 'Thuộc tính không có

Set prp = dbs.CreateProperty(strPropName, _

varPropType, varPropValue)

dbs.Properties.Append prp

Resume Next

Else

' Không biết lỗi gì.

ChangeProperty = False

Resume Change_Bye

End If

End Function

Xử lý tình huống chọn nút [Khóa database]:

Private Sub cmdLock_Click()

ChangeProperty "StartupForm", dbText, "Main"

ChangeProperty "StartupShowDBWindow", dbBoolean, False

ChangeProperty "StartupShowStatusBar", dbBoolean, False

ChangeProperty "AllowBuiltinToolbars", dbBoolean, False

ChangeProperty "AllowFullMenus", dbBoolean, False

ChangeProperty "AllowBreakIntoCode", dbBoolean, False

ChangeProperty "AllowSpecialKeys", dbBoolean, False

ChangeProperty "AllowBypassKey", dbBoolean, False

MsgBox "Đã khóa! Đóng rồi mở lại mới có ép-phê.", _

vbOKOnly, "eChip Security"

cmdExit.SetFocus

cmdUnlock.Visible = True

cmdLock.Visible = False

End Sub

Xử lý tình huống chọn nút [Mở database]:

Private Sub cmdUnlock_Click()

ChangeProperty "StartupForm", dbText, ""

ChangeProperty "StartupShowDBWindow", dbBoolean, True

ChangeProperty "StartupShowStatusBar", dbBoolean, True

ChangeProperty "AllowBuiltinToolbars", dbBoolean, True

ChangeProperty "AllowFullMenus", dbBoolean, True

ChangeProperty "AllowBreakIntoCode", dbBoolean, True

ChangeProperty "AllowSpecialKeys", dbBoolean, True

ChangeProperty "AllowBypassKey", dbBoolean, True

MsgBox "Khóa đã được mở! Đóng rồi mở lại mới ép-phê.",_

vbOKOnly, "eChip Security"

cmdExit.SetFocus

txtPassword = ""

cmdLock.Visible = True

cmdUnlock.Visible = False

txtPassword.Visible = False

End Sub

Xử lý tình huống khi mở biểu mẫu:

Private Sub Form_Open(Cancel As Integer)

Dim dbs As Database

Set dbs = CurrentDb

On Error GoTo KhongCoThuocTinh_Err

If dbs.Properties("AllowBypassKey") Then

cmdLock.Visible = True

txtPassword.Visible = False

Else

cmdLock.Visible = False

txtPassword.Visible = True

End If

Exit Sub

KhongCoThuocTinh_Err:

cmdLock.Visible = True

txtPassword.Visible = False

End Sub

Khi người ta gõ mật khẩu và nhấn phím Enter:

Private Sub txtPassword_LostFocus()

If txtPassword = "echip" Then

cmdUnlock.Visible = True

End If

End Sub

CHƯƠNG CAN CHÍP

Ý kiến bạn đọc (0)
Tên   Email

Lên đầu trang