Trang checkpassword.asp sử dụng bốn phương pháp đầu tiên để theo
dõi thông tin bảo mật của khách hàng. Thuận lợi của các cookie trình
duyệt là chúng cung cấp một phương pháp lưu trữ thông tin của khách
hàng qua nhiều cuộc viếng thăm đến một Website. Vì thế, nếu một người
dùng nhập vào username và password một lần thì họ sẽ không bao giờ cần
nhập lại những thông tin này. Về mặt lý thuyết, người dùng có thể tự
động được xác thực mỗi lần họ yêu cầu một trang. Bất lợi của các
cookie là không phải tất cả các trình duyệt đều hỗ trợ nó. Vì nhiều lý
do, các cookie thường bị hỏng. Vì thế ta không nên dựa vào cookie để
xác thực một khách hàng qua nhiều trang.
55 trang |
Chia sẻ: lylyngoc | Lượt xem: 2691 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Luận văn Đưa một cửa hàng lên mạng Internet, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ản. Các
cookie được thêm vào bằng một thủ tục addCookie.
Thủ tục addCookie
SUB addCookie(theName, the Value)
Response.Cookie(theName) = theValue
Response.Cookie(theName).Expires = "December 31, 2002"
Response.Cookie(theName).Path = "/"
Response.Cookie(theName).Secure = FALSE
END SUB
Thêm một cookie vào trình duyệt của một khách hàng bằng cách sử
dụng tập hợp Cookie của đối tượng Response. Cookie này được thiết lập
ngày hết hạn là ngày 31 tháng 12 năm 2002. Nếu ta không thiết lập
thuộc tính Expires thì cookie sẽ tự động hết hạn sau khi khách hàng
rời khỏi website hoặc đóng trình duyệt. Thực tế là không có sự đảm bảo
là cookie sẽ tồn tại cho đến ngày 31 tháng 12 năm 2002, một file
cookie có thể chứa chỉ một số lượng thông tin hạn chế, vì thế username
và password có thể bị xoá bỏ khỏi cookie từ trước đó. Nếu các cookie
Đưa một cửa hàng lên mạng Internet
33
bị mất thì vấn đề này cũng không hề gì. Người dùng chỉ cần đăng nhập
lại và các cookie sẽ được tự động thêm lại.
Xử lý các lỗi trong form một cách tế nhị
Thủ tục addUser trong những phần trước đã sử dụng nhiều đến một
thủ tục khác có tên là errorForm. Thủ tục errorForm hiển thị một thông
báo lỗi và yêu cầu người dùng trở về trang trước để xoá lỗi. Trang
errorForm có một đặc điểm khá thú vị khi người dùng nhấn vào nút tên
là Return thì tất cả dữ liệu ban đầu mà người dùng nhập vào trong form
HTML sẽ được truyền ngược về cho form. Bởi vì thông tin được truyền
ngược về cho form nên người dùng không cần phải bắt đầu điền lại các
trường trong form.
Thủ tục errorForm
SUB errorFORM(errorMSG, backpage)
%>
Problem
There was a problem with the information you entered:
">
<%
Reponse.End
END SUB
Thủ tục errorForm chấp nhận hai tham số: errorMSG và backpage.
Tham số errorMSG chứa nội dụng của thông báo lỗi sẽ được hiển thị,
tham số backpage chứa đường dẫn của form ban đầu. Các trường ẩn trong
form được tạo với thủ tục formFields.
Thủ tục formFields
SUB formFields
FOR each item in Request.Form
%>
">
<%
NEXT
END SUB
Thủ tục formFields duyệt qua tất cả các mục được chứa trong tập
hợp Form của đối tượng Request. Mỗi mục trong tập hợp form được làm
thành một trường ẩn. Khi người dùng nhấn vào nút Return thì những
Đưa một cửa hàng lên mạng Internet
34
trường ẩn này được truyền ngược lại cho form HTML ban đầu để chúng có
thể được hiển thị lại.
1.3 Sö DôNG SECURE SOCKETS LAYER
Khi một khách hàng điền vào form đăng ký họ phải nhập vào thông tin
thẻ tín dụng. Khi form đăng ký được đệ trình thì thông tin thẻ tín
dụng được truyền qua Internet dưới dạng văn bản thuần tuý thì điều này
rất nguy hiểm. Bất cứ khi nào thông tin di chuyển đi trên Internet nó
phải trải qua vài kết nối trực tiếp. Về mặt lý thuyết, một cá nhân với
những dự tính không trong sáng có thể trộm thông tin này khi nó trên
đường đến đích. Để bảo vệ thông tin thẻ tín dụng của khách hàng ta
phải sử dụng Secure Sockets Layer (SSL). SSL là một công nghệ được
phát triển đầu tiên bởi Netscape. Nó cho phép ta truyền thông tin qua
Internet một cách an toàn. SSL cung cấp một giải pháp kỹ thuật cho ba
vấn đề bảo mật riêng biệt: mã hoá, xác thực và đồng nhất dữ liệu. Khi
thông tin được truyền sử dụng SSL, thông tin sẽ được mã hoá. Thậm chí
nếu một người nào đó lấy trộm thông tin khi nó di chuyển từ trình
duyệt của một khách hàng đến Web Server của ta thì dữ liệu này cũng
không thể sử dụng được.
SSL mã hoá thông tin khi thông tin này di chuyển qua lại giữa một
Web Server và một trình duyệt Web bằng cách mã hoá thông tin với một
thuật toán mã hoá được biết đến công khai và một khoá mã hoá phiên làm
việc bí mật. Số lượng các bit trong khoá phiên làm việc xác định sức
mạnh của việc mã hoá. Hiện tại có hai loại kích thước khoá chuẩn: 40
bits và 128 bits. Mặc dù có những trường hợp các thông điệp được mã
hoá với khoá 40 bits bị xâm nhập nhưng khoá 128 bits được xem là không
thể giải được với công nghệ hiện đại.
SSL cũng có thể được sử dụng để xác thực một Web Server. Về mặt lý
thuyết, một cá nhân ác tâm nào đó cũng có thể lừa một khách hàng tin
rằng một Website khác là Website của ta. Sau đó cá nhân ác tâm này có
thể trộm số thẻ tín dụng khi các khách hàng đệ trình thông tin đến
Website lừa đảo. Tuy nhiên, khi ta sử dụng SSL trên Web Server của ta
thì ta được yêu cầu cài đặt một server certificate, server certificate
này ngăn chặn những Website khác không cho chúng giả mạo Website của
ta. Một server certificate chứa thông tin về Website của ta, tổ chức
của ta và nơi phát hành certificate.
Cuối cùng, SSL bảo vệ sự đồng nhất của dữ liệu khi nó được truyền
qua Internet. Về mặt lý thuyết, một người với những dự tính đáng ngờ
có thể lục lọi dữ liệu khi nó được truyền qua lại giữa một Web Server
và một trình duyệt Web. SSL bảo vệ sự đồng nhất của dữ liệu bằng cách
đính kèm một mã xác thực thông điệp (MAC) với dữ liệu khi nó được
truyền tải. Nói một cách khác, khi ta sử dụng SSL, ta biết rằng thông
điệp nhận được là giống hệt với thông điệp được gởi đi. Ngoài ra, nếu
ta yêu cầu những thông tin bí mật như số thẻ tín dụng từ khách hàng
của ta thì ta phải có trách nhiệm bảo vệ thông tin này. Giải pháp duy
nhất thường được sử dụng cho vấn đề này là sử dụng SSL.
2. X¢Y DùNG GIá §I CHî
Có hai phương pháp để thêm một giỏ đi chợ vào cửa hàng trực tuyến:
Sử dụng các biến session và sử dụng một bảng trong cơ sở dữ liệu. Có
một khuyết điểm chính đối với phương pháp tạo giỏ đi chợ khi sử dụng
các biến session đó là các biến session phụ thuộc vào cookie mà không
phải tất cả các trình duyệt đều hỗ trợ cookie, mặt khác các biến
session bị mang tiếng là không đáng tin cậy. Khi một vị khách lần đầu
tiên đến tham quan một Website có sử dụng các biến session thì Web
Đưa một cửa hàng lên mạng Internet
35
Server sẽ thêm một cookie vào trình duyệt của vị khách này để theo dõi
vị khách khi người này chuyển từ trang này sang trang khác. Khi một
biến session được tạo, cookie này được sử dụng để kết hợp biến này với
người sử dụng thích hợp. Nếu vì một lý do nào đó mà cookie không thể
được tạo trên trình duyệt của người dùng thì các biến session sẽ không
hoạt động. Một vấn đề quan trọng khác với việc sử dụng các biến
session là chúng sẽ hết hạn sau một khoảng thời gian được định trước.
Theo mặc định, một phiên làm việc (session) của người dùng sẽ kết thúc
sau 20 phút không hoạt động. Sau khi một phiên làm việc đã hết hạn,
tất cả các biến session liên quan đến phiên đó sẽ tự động bị xoá khỏi
bộ nhớ.
Sö dông b¶ng trong c¥ së d÷ liÖu §Ó t¹o giá §i chî
Khi một khách hàng nhấn vào nút Add To Cart trong một trang trình
bày sản phẩm thì sản phẩm mà khách hàng lựa chọn sẽ được thêm vào một
bảng được chứa trong một biến session có tên là cart. Khi khách hàng
tiếp tục tham quan cửa hàng, những mục hàng mới có thể được thêm vào
giỏ đi chợ hoặc những mục hàng hiện có (đã chọn) có thể bị bỏ đi. Khi
khách hàng kết thúc việc mua sắm, khách hàng có thể nhấn vào nút
Checkout để thực sự mua những mặt hàng được chứa trong giỏ đi chợ.
Trang addCart.asp
<%
' Get ProuctID
productID=TRIM(Request("pid"))
' Add Item to cart
IF productID "" THEN
sqlString="SELECT cart_id FROM cart
WHERE cart_userID = '&userID&' AND cart_productID = &productID"
SER RS=Con.Execute(sqlString)
IF RS.EOF THEN
sqlString="INSERT INTO cart(cart_userID,cart_productID,
cart_quantity)
VALUE(userID&,product_ID&,1)"
ELSE
sqlString="UPDATE cart SET cart_quantity = cart_quantity + 1
WHERE cart_ID = &RS("cart_ID")"
END IF
RS.Close
SET RS = Nothing
Con.Execute sqlString
END IF
'Update Shopping Cart Quantities
IF Request("updateQ") "" THEN
SET RS = Server.CreateObject("ADODB.Recordset")
RS.ActiveConnection = Con
RS.CursorType = adOpenDynamic
RS.LockType = adLockOptimistic
sqlString = "SELECT cart_id, cart_quantity FROM cart
WHERE cart_userID = &userID"
RS.Open sqlString
WHITE NOT RS.EOF
newQ = TRIM(Request("qp"&RS("cart_ID")))
deleteProduct = TRIM(Request("pd"&RS("cart_ID")))
IF newQ = "" OR newQ = "0" OR deleteProduct "" THEN
RS.Delete
ELSE
Đưa một cửa hàng lên mạng Internet
36
IF isNumeric(newQ) THEN
RS("cart_quantity") = newQ
END IF
END IF
RS.MoveNext
WEND
%>
Shopping Cart
's shopping cart:
<%
' Get the shopping cart
sqlString = "SELECT cart_id, product_name, product_price, cartquantity
FROM cart, products WHERE cart_userID = '&userID&'
AND cart_productID = product_id
ORDER BY cart_id DESC"
SET = Con.Execute(sqlString)
IF RS.EOF THEN
%>
You do not have any items in your shopping cart
<%
ELSE
orderTotal = 0
%>
">
">
<table bgcolor="lightyellow" border="1" cellpadding="4"
cellspacing="0">
Product
Price
Quantity
<%
WHILE NOT RS.EOF
orderTotal = orderTotal + (RS("product_price")*RS("cart_quantity"))
%>
" type="text" size=4
value="">
" type="checkbox"
value="1">Delete
<%
RS.MoveNext
WEND
%>
Đưa một cửa hàng lên mạng Internet
37
Order Total:
">
">
Trang addCart.asp có ba phần mã chính, phần đầu thêm một mục
hàng mới vào giỏ đi chợ phần này được thực thi sau khi khách hàng nhấp
vào nút Add To Cart trên trang Product.asp. Kế tiếp là cập nhật số
lượng của các sản phẩm trong giỏ đi chợ. Một khách hàng có thể thay
đổi số lượng của mỗi mục hàng được chọn bằng cách nhập vào những giá
trị mới trong form HTML hiển thị giỏ đi chợ và nhấp vào nút Update
Cart. Ngoài ra, một khách hàng có thể loại bỏ hoàn toàn một mục hàng
bằng cách thiết lập số lượng của nó là zero hoặc để trống phần này.
Giá trị của hộp chọn Delete được gọi ra và mục hàng này sẽ bị loại bỏ
khỏi giỏ đi chợ khi trường này có một giá trị. Phần này được thực thi
sau khi khách hàng nhấp vào nút Update Cart trên giỏ đi chợ. Cuối cùng
là phần chính được sử dụng để thực sự hiển thị giỏ đi chợ. Điều này
được thực hiện bằng cách gọi ra tất cả các mẩu tin được chứa trong
bảng Cart có liên quan đến một khách hàng cụ thể. Mỗi mục hàng trong
giỏ đi chợ sẽ được hiển thị từng cái một. Về mặt lý thuyết, giỏ đi chợ
này là thường trực, một khách hàng thêm một số mục hàng vào giỏ đi
chợ, đi nghỉ mát dài hạn ở Cửa Lò, quay trở về cửa hàng trực tuyến này
và các sẽ vẫn còn nằm trong giỏ đi chợ. Hơn nữa, giỏ đi chợ này không
phụ thuộc vào những thuộc tính của trình duyệt của người dùng, không
có một cookie nào được sử dụng.
3. THANH TO¸N
3.1 T×M HIÓU VÒ GIAO DÞCH (TRANSACTION)
Khi một khách hàng nhấn vào nút Checkout trong giỏ đi chợ thì
hai điều phải xảy ra: Đầu tiên, tất cả các mục hàng trong giỏ đi chợ
phải được chuyển đến bảng Orders. Thứ hai, các mục hàng phải được loại
bỏ khỏi giỏ đi chợ. Đây là một ví dụ hoàn hảo về giao dịch.
Đưa một cửa hàng lên mạng Internet
38
Trong một giao dịch, một chuỗi các bước sẽ thành công hay thất
bại toàn bộ. Một ví dụ mẫu về chuyển tiền từ một tài khoản đến một tài
khoản khác (việc chuyển tiền sử dụng một máy rút tiền tự động). Nếu
một khách hàng chuyển tiền từ tài khoản vãng lai của họ đến tài khoản
tiết kiệm của họ thì hai điều phải xảy ra: Tài khoản vãng lai của họ
phải bị ghi nợ một số tiền nào đó và tài khoản tiết kiệm của họ cũng
phải được ghi có cùng số tiền như vậy. Tuy nhiên nếu bước đầu tiên
hoàn thành nhưng bước thứ hai không hoàn thành thì số tiền đó sẽ biến
mất mà không bao giờ được tìm thấy lại.
Việc sử dụng giao dịch sẽ giải quyết được vấn đề này. Nếu bất kỳ
bước nào trong một giao dịch thất bại thì tất cả các bước khác cũng bị
huỷ bỏ (roll back). Vì thế, nếu máy rút tiền của ta bị sự cố vào lúc
sau khi nó ghi nợ cho tài khoản vãng lai của khách hàng thì số tiền
của họ sẽ không bị mất. Tất cả các bước trong giao dịch sẽ bị huỷ bỏ
và số tiền này sẽ được ghi lại trong tài khoản vãng lai của khách
hàng. Có ba phương pháp khác nhau về sử dụng các giao dịch với một
trang ASP. Ta có thể tạo các trang ASP có khả năng giao dịch, tạo các
giao dịch ADO, hoặc sử dụng các giao dịch cơ sở dữ liệu.
Các giao dịch trong trang ASP
Trong một trang ASP có khả năng giao dịch, những thay đổi được
thực hiện trong trang được tự động huỷ bỏ nếu một lỗi xuất hiện hoặc
giao dịch được huỷ bỏ một cách tường minh. Sử dụng Microsoft
Transaction Server để quản lý các giao dịch trong một trang ASP. điều
quan trọng cần phải tìm hiểu là Microsoft Transaction Server.
Các giao dịch ADO
Các giao dịch ASP áp dụng cho toàn bộ một trang ASP. Nếu muốn xử
lý chỉ những thao tác cơ sở dữ liệu trong một giao dịch thì ta có thể
sử dụng các giao dịch ADO.
Đối tượng Connection của ADO có ba phương thức – BeginTrans(),
CommitTrans() và RollbackTrans() cho phép ta quản lý các giao dịch. Để
bắt đầu một giao dịch mới gọi phương thức CommitTrans(). Cuối cùng, để
huỷ bỏ một giao dịch và bắt đầu lại ta gọi phương thức
rollbackTrans(). Script giao dịch ADO sử dụng những phương thức này
khi cập nhật hai bảng trong cơ sở dữ liệu.
Giao dịch ADO
<%
Set Con = Server.CreateObject("ADODB.Connection")
Con.Open "accessDSN"
Con.BeginTrans
' Debit Checking Accont
sqlString=UPDATE checking SET checking_balance=checking_balance 15
WHERE checking_userID=3"
Con.Execute sqlString
'Credit Saving Account
sqlString="UPDATE savings SET savings_balance=savings_balance + 15
WHERE savings_userID=3"
Con.Execute sqlSyting
Con.CommitTrans
%>
Đưa một cửa hàng lên mạng Internet
39
Script này cập nhật hai bảng trong cơ sở dữ liệu tên là checking
và savings Nó lấy 15$ từ tài khoản vãng lai của một khách hàng và thêm
vào tài khoản tiết kiệm cũng 15$ cho vị khách đó. Tất cả các thao tác
cơ sở dữ liệu được thực thi trong script sẽ thành công hoặc thất bại
toàn bộ.
Giao dịch cơ sở dữ liệu
Cơ sở dữ liệu Microsoft SQL Server sử dụng một nhật ký giao dịch
(transaction log) để ghi nhận lại hầu hết mọi thay đổi được thực hiện
trên cơ sở dữ liệu. Điều này cho phép những thay đổi được huỷ bỏ trong
trường hợp có sự cố. Ngôn ngữ Transact – SQL ngôn ngữ được sử dụng để
tương tác với SQL Server – có một số câu lệnh dùng để kiểm soát các
giao dịch. Ta có thể sử dụng những câu lệnh này trong các SQL store
procedure để đánh dấu điểm bắt đầu và kết thúc của các giao dịch.
3.2 HOµN TÊT §¥N §ÆT HµNG
Khi một khách hàng kết thúc việc mua sắm và nhấn vào nút
Checkout trong giỏ đi chợ thì họ sẽ được trình hai trang. Trước tiên,
họ được trình một form cho phép họ cập thông tin về địa chỉ và thông
tin về chi trả. Ví dụ họ có thể thay đổi địa chỉ nhận hàng hoặc số thẻ
tín dụng được sử dụng cho đơn đặt hàng này. Kế đến, khách hàng được
trình một trang cám ơn họ vì đã đặt hàng. Trong trang này, đơn đặt
hàng của họ thực sự hoàn tất. Các mục hàng được chuyển từ giỏ đi chợ
đến bảng Orders.
Đọc ra thông tin về địa chỉ và việc chi trả
Ngay sau khi một khách hàng nhấn vào nút Checkout, họ sẽ thấy
được trình bày trong trang doCheckout.asp. Nó chứa một form HTML thông
thường trong đó hiển thị thông tin địa chỉ và việc chi trả của khách
hàng. Dữ liệu này được đọc từ bảng Users.
Đọc ra dữ liệu về khách hàng
SqlString = "SELECT * FROM users WHERE user_id=&userID"
SET RS = Con.Execute(sqlString)
IF NOT RS.EOF THEN
street=RS("user_street")
city=RS("user_city")
state=RS("user_state)
zip=RS("user_zip)
cctype=RS("user_cctype)
ccnumber=RS("user_ccnumber)
ccexpires=RS("user_ccexpires)
ccname=RS("user_ccname)
END IF
' Hide credit cart Number
ccnumber=LEFT(ccnumber,2)"************"RIGHT(ccnumber,2)
S th tín d ng c n i, ch có hai s u tiên và hai s cu i cùng c a
s th tín d ng là c hi n ra. i u này c th c hi n vì các lý do b o m t.
N u m t ng i nào ó có c g ng oán username và password c a m t khách
hàng thì k này không th n c p c s th tín d ng c a khách.
Cập nhật thông tin về địa chỉ và việc chi trả
Đưa một cửa hàng lên mạng Internet
40
Khi form trong trang doCheckout.asp được đệ trình thì khách hàng
được chuyển đến trang doCheckout2.asp. Trang này thực hiện hai việc:
Trước tiên, nó nhận thông tin về địa chỉ và việc chi trả vừa được form
HTML đệ trình và cập nhật bảng Userd. Thứ hai, nó chức một script làm
nhiệm vụ chuyển các mục hàng từ giỏ đi chợ đến bảng Orders. Thông tin
về khách hàng được cập nhật với thủ tục updateUser.
Thủ tục updateUser
SUB UpdateUser
' Get Regidtraion Fields
street=TRIM(Request("street"))
city=TRIM(Request("city"))
state=TRIM(Request("state"))
zip=TRIM(Request("zip"))
cctype=TRIM(Request("cctype"))
ccnumber=TRIM(Request("ccnumber"))
ccexpires=TRIM(Request("ccexpires"))
ccname=TRIM(Request("ccname"))
' Check For Required Fields
backpage="checkout.asp"
IF street="" THEN
errorForm "You must enter your street address.", backpage
END IF
IF city="" THEN
errorForm "You must enter your city.", backpage
END IF
IF state="" THEN
errorForm "You must enter your state.", backpage
END IF
IF zip="" THEN
errorForm "You must enter your zip code.", backpage
END IF
IF ccnumber="" THEN
errorForm "You must enter your credit card number.", backpage
END IF
IF ccexpires="" THEN
errorForm "You must enter your credit card exiration date.",
backpage
END IF
IF ccname="" THEN
errorForm "You must enter the name that appears on tour credit
card.", backpage
END IF
' Check for Necessary Field Values
IF INSTR(ccnumber,"*")=0 THEN
IF NOT validCCNumber(ccnumber) THEN
errorFrom "You did not enter a valid credit card number",
backpage
ELSE
ccnumber="'"&ccnumber&"'"
END IF
ELSE
ccnumber="user_ccnumber"
END IF
IF NOT isDATE(ccexpires) THEN
ErrorForm "You did not enter a valid credit card expiration data",
backpage
END IF
Đưa một cửa hàng lên mạng Internet
41
' Update user information in the database
sqlString="UPDATE" users SET
user_street='"&fixQuotes(street)&"',
user_city='"&fixQuotes(city)&"',
user_state='"&fixQuotes(state)&"',
user_zip='"&fixQuotes(zip)&"',
user_ccnumber='"&ccnumber&"',
user_cctype='"&cctype&"',
user_ccexpires='"&ccexpires&"',
user_ccname='"&fixQuotes(ccname)&"', WHERE user_id=&userID"
Con.Execute sqlString
END SUB
Đầu tiên thủ tục này đọc các trường trong form HTML vào trong
các biến cục bộ, kế tiếp từng trường được kiểm tra để biết nó có chứa
dữ liệu hay không. Nếu một người nào đó đệ trình một trường trống thì
thủ tục errorForm sẽ được gọi. Thủ tục này hiển thị một trang thông
báo lỗi và mời người dùng trở về form HTML để sửa lại. Nếu một người
nào đó không nhập vào ngày tháng thật sự trong trường nhập ngày tháng
hết hạn của thẻ tín dụng thì một trang thông báo lỗi được hiển thị
bằng cách gọi thủ tục errorForm. Kiểm tra giá trị của thẻ tín dụng là
phần khá phức tạp vì số thẻ tín dụng được hiển thị trong form HTML
được ẩn đi một phần vì những lý do bảo mật. Nếu khách hàng thay đổi số
thẻ tín dụng trong form HTML thì số thẻ tín dụng được đệ trình sẽ chứa
các ký tự * (ký tự * được dùng để che dấu các con số). Mặt khác, nếu
khách hàng nhập vào số thẻ tín dụng mới thì trường này trong cơ sở dữ
liệu sẽ được nhập, trường user_ccnumber trong cơ sở dữ liệu được gán
giá trị của trường ccnumber trong form.
Truyền giỏ đi chợ
Sau khi thông tin về địa chỉ và việc chi trả của khách hàng đã
được cập nhật trong trang doCheckout2.asp, đơn đặt hàng phải được hoàn
tất. Điều này được thực hiện bằng cách chuyển tất cả các mục hàng của
khách hàng từ bảng Cart (đại diện cho giỏ đi chợ của khách hàng) đến
bảng Orders (đại diện cho những đơn đặt hàng hoàn tất). Để chuyển các
mục hàng từ bảng Cart đến bảng Orders, chúng ta sẽ sử dụng script sau:
<%
' Begin A Transaction
Con.BeginTrans
' Transfer cart to orders table
sqlString="INSERT INTO orders(order_id, order_productID,
order_quantity, order_userID, order_entrydate,
order_status) SELECT cart_id, cart_productID,
cart_quantity, cart_userID, NOW(), 0
FROM cart WHERE cart_userID," &userID
Con.Execute sqlString
'Empty shopping cart
sqlString="DELETE FROM cart WHERE cart_userID=" &userID
Con.Execute sqlString
' End the transaction
Con.commitTrans
%>
Đầu tiên một giao dịch mới được tạo ra bằng cách gọi phương thức
BeginTrans() của đối tượng Connection. Kế tiếp các mục hàng trong bảng
Cart được chuyển đến bảng khách hàng. Cuối cùng giao dịch kết thúc.
Đưa một cửa hàng lên mạng Internet
42
Một giao dịch ADO được sử dụng trong script này để ddamr bảo
rằng nếu các mục hàng được sao chép từ bảng Cart đến bảng Orders thì
các mục hàng cũng sẽ bị xoá khỏi bảng Cart. Giao dịch này ngăn chặn
việc xảy ra của một bước nếu bước khác không xảy ra.
3.3 Xö Lý C¸C ®¬N ®ÆT HµNG
Trong phần này ta sẽ tạo một trang ASP cho phép quản lý các đơn
đặt hàng sau khi chúng được một khách hàng đưa ra. Trang này được sử
dụng bởi người quản trị của cửa hàng. Nó cung cấp cho ta một phương
pháp xem và cập nhật tình trạng của mỗi đơn đặt hàng. Mỗi đơn đặt hàng
có thể có một trong những giá trị trạng thái sau:
Pending Đây là giá trị mặc định của một đơn đặt hàng, một
đơn đặt hàng có tình trạng này ngay sau khi nó
được đưa ra.
Credit Card
Declined
Một đơn đặt hàng có tình trạng này khi tài khoản
thẻ tín dụng của khách hàng không đủ chi trả và
sản phẩm này không thể giao được.
Not in Stock Một đơn đặt hàng có tình trạng này khi sản phẩm
được yêu cầu không có trong kho và do đó sẽ không
được giao
Shipped Một đơn đặt hàng có tình trạng này khi thẻ tín
dụng được rút tiền thành công và sản phẩm được
giao.
Ta cần tạo một trang tên là processOrders.asp cung cấp một
phương pháp cập nhật tình trạng của từng đơn đặt hàng, trang
processOrders.asp hiển thị tất cả thông tin cho từng đơn đặt hàng. Mỗi
đơn đặt hàng xuất hiện trong bảng HTML riêng của nó, đối với từng đơn
đặt hàng ta có thể xem mã số của đơn đặt hàng, mã số sản phẩm, thông
tin về địa chỉ và việc chi trả của khách hàng và tình trạng hiện thời
của đơn đặt hàng. Theo mặc định, khi xem các đơn đặt hàng ta chỉ thấy
được các đơn đặt hàng chưa giải quyết (pending orders). Thông thường
đây là những gì ta cần bởi vì ta cần cập nhật chỉ những đơn đặt hàng
mới được đưa ra. Tuy nhiên, ta có thể sử dụng một danh sách chọn lọc
HTML để hiển thị những đơn đặt hàng chưa giải quyết, chỉ những đơn đặt
hàng từ chối thẻ tín dụng, chỉ những đơn đặt hàng mà sản phẩm không có
trong kho, chỉ những đơn đặt hàng có sản phẩm được giao, hoặc tất cả
các đơn đặt hàng.
Các đơn đặt hàng được hiển thị 5 cái trong một trang. Một danh
sách các số trang đóng vai trò như những liên kết những trang khác sẽ
xuất hiện ở cuối trang. Nếu công việc kinh doanh tốt đẹp, ta không
muốn hiển thị quá nhiều đơn đặt hàng trong chỉ một trang.
Cuối cùng, ta có thể cập nhật tình trạng của bất kỳ đơn đặt hàng
nào bằng cách nhắp vào một liên kết siêu văn bản. Tình trạng hiện thời
của một đơn đặt hàng được tô sáng trong một khung màu xanh. Những tuỳ
chọn trạng thái khác xuất hiện trong các khung màu xanh xám dưới dạng
các liên kết siêu văn bản.
ProcessOrders.asp
<%
' Get Form Varables
showOrders=TRIM(Request("showOrder"))
Đưa một cửa hàng lên mạng Internet
43
showPage=TRIM(Request("showPage"))
orderStatus=TRIM(Request("Os"))
orderID=TRIM(Request("oid"))
allPages=TRIM(Request("allpages"))
' Assign Default Values
IF showOrder="" THEN
showOrder=0
END IF
IF showPage="" THEN
showPage=1
END IF
' Open the Database Connection
Set Con = Server.CreateObject("ADODB.Connection")
Con.Open "accessDSN"
' Update Order Status
IF orderID "" THEN
IF orderStatus = 3 THEN
sqlString="UPDATE orders SET
order_status="&orderStatus&,order_shipdate=NULL""
WHERE order_id=&orderID"
END IF
Con.Execute sqlString
END IF
' Retrieve Orders
sqlString="SELECT * FROM Orders, Users, Products
WHERE order_userID=user_id AND order_productID=priduct_id"
IF showOrder < 99 THEN
sqlString=sqlString & "and order_status=" &showOrders
END IF
sqlString=sqlString & "ORDER BY order_entrydate DESC"
SET RS=Server.CreateObject("ADODB.Recordset")
RS.CursorType=adopenStatic
IF allPages="" THEN
RS.PageSize=5
ELSE
RS.PageSIZE=99999
END IF
RS.ActiveConnection=Con
RS.Open sqlString
IF NOT RS.EOF THEN
RS.AbsolutePage=CINT(showPage)
END IF
FUNCTION SELECTED(val1,val2)
IF cSTR(val1)=cSTR(val2) THEN
SELECTED="selacted"
END IF
END FUNCTION
%>
Process Orders
Process Orders
Show Orders:
Đưa một cửa hàng lên mạng Internet
44
>Pending
>Credit Card
Declined
>Not in Stock
>Shipped
>All orders
<%
WHILE NOT RS.EOF AND rowCount < RS.PageSize
rowCount = rowcount + 1
%>
Order Date ID:
Order Date:
Product ID:
Product:
Quantity Ordered:
Shipped:
N/A
Unit Price
Order Total:
Đưa một cửa hàng lên mạng Internet
45
Credit Cart:
Name:
number:
type:
<%
SELECT CASE RS("user_cctype")
CASE "1" Response.Write "Visa"
CASE "2" Response.Write "MasterCard"
END SELECT
%>
expires:
Address:
Street:
city:
state:
Pending
&
oid=&os=0&showOrders=">
Pending
Credit Card Declined
&
oid=&os=1&showOrders=">
Credit Card Declined
Not in Stock
&
oid=&os=2&showOrders=">
Not in Stock
Shipped
&
Đưa một cửa hàng lên mạng Internet
46
oid=&os=3&showOrders=">
Shipped
<%
RS.MoveNext
WEND
%>
1 THEN%>
Page:
<%
FOR i=1 TO RS.PageCount
IF CINT(showPage) = i THEN
%>
&
showOrders=">
<%
END IF
NEXT
IF allPages "" THEN
%>
All
&
AllPages=1">
All
<% END IF
END IF%>
4. Lµm viÖc víi c¸c thÎ tÝn dông
C¸c ph¬ng ph¸p xö lý thÎ tÝn dông
Có rất nhiều tuỳ chọn khác nhau đối với việc xử lý thẻ tín dụng
được chấp nhận tại Website. Tuy nhiên những hệ thống xử lý thẻ tín
dụng khác nhau có thể chia khái quát thành ba loại khác nhau: bộ xử lý
chi trả ngoài site, chi trả đầu cuối và các giải pháp dựa trên thành
phần.
Bộ xử lý chi trả ngoài site
Một vài công ty cho phép liên kết đến Website của họ và họ sẽ xử lý
những giao dịch sử dụng thẻ tín dụng. Họ đăng tải trang chi trả yêu
cầu khách hàng nhập vào thông tin về thẻ tín dụng. Sau khi khách hàng
đã hoàn tất giao dịch chi trả, khách hàng được gởi trở về Website của
ta.
Thuận lợi của loại hệ thống này đó là rất dễ cài đặt. Không cần cấu
hình và sử dụng của Secure Sockets Layer và không cần những phòng ngừa
đặc biệt để duy trì sự riêng tư về thông tin thẻ tín dụng của khách
hàng.
Bất lợi của các bộ xử lý ngoài site (offsite payment process) đó là
ta không còn điều khiển được sự xuất hiện của trang chi trả của mình.
Đưa một cửa hàng lên mạng Internet
47
Ta cũng không bao giờ thu thập được thông tin về thẻ tín dụng trực
tiếp từ khách hàng. Cuối cùng, nếu có gì trục trặc với bộ xử lý chi
trả ngoài site thì những vấn đề này nằm ngoài tầm kiểm soát của ta.
Các giải pháp chi trả đầu cuối
Một hướng giải quyết khác đối với việc xử lý các thẻ tín dụng được
đại diện bởi các giải pháp chi trả đầu cuối (payment terminal
solutions). Một ví dụ điển hình về loại phần mềm này là ICVerify
(www.icverify.com). ICVerify là một sản phẩm phần mềm chứa một giao
diện dễ sử dụng để xác định và giải quyết các giao dịch bằng thẻ tín
dụng. ICVerify không làm việc qua Internet mà sử dụng chương trình này
với một modem. Khi xác thực hoặc giải quyết các giao dịch bằng thẻ tín
dụng, chương trình này sẽ kết nối đến trình xử lý của ta qua đường dây
điện thoại và hoàn tất giao dịch. Thuận lợi chính của việc sử dụng
ICVerify đó là nó là một trong những giải pháp rẻ tiền nhất cho việc
xử lý thẻ tín dụng. Bởi vì ICVerify sử dụng đường dây điện thoại thông
thường, không cần Internet nên các ngân hàng không cần cấu hình những
cổng nối (gateway) đặc biệt để chấp nhận những giao dịch sử dụng thẻ
tín dụng được thực hiện với ICVerify. Kết quả cuối cùng là những ngân
hàng này thường tính tiền cho ta với mức phí thấp hơn.
Các giải pháp dựa trên thành phần
Phương pháp thứ ba và cũng là phương pháp cuối cùng về xử lý các
thẻ tín dụng và sử dụng một giải pháp dựa trên thành phần (component-
based solution). Giải pháp này cung cấp sự linh hoạt rất lớn trong
việc xử lý thẻ tín dụng. Ta có thể viết các script ASP để làm những
công việc như xác thực, nắm bắt những giao dịch sử dụng thẻ tín dụng.
Ví dụ về giải pháp này là CyberCash (www.cybercash.com).
Thuận lợi của một giải pháp dựa trên thành phần đối với việc xử lý
chi trả đó là nó cung cấp cho ta sự kiểm soát toàn diện đối với những
giao dịch sử dụng thẻ tín dụng từ những script ASP. Không giống như
các giải pháp chi trả ngoài site, khách hàng không bao giờ cần rời
khỏi Website của ta. Không giống như các giải pháp dựa trên đầu cuối,
các giao dịch thẻ tín dụng có thể được xử lý theo thời gian thực qua
Internet.
Các giải pháp dựa trên thành phần có hai nhược điểm chính. Đầu
tiên, chúng thường đắt tiền hơn những giải pháp dựa trên đầu cuối bởi
vì chúng đòi hỏi ngân hàng phải thiết lập một cổng nối Internet theo
đơn đặt hàng. Thứ hai, việc cài đặt một giải pháp dựa trên thành phần
yêu cầu ta phải viết thêm các script nên có thể rất tốn thời gian.
5. t¹o mét website ®¨ng ký
5.1. sö dông http authentication
Phương pháp bảo vệ một trang ASP bằng password dễ nhất, ít linh
hoạt nhất là sử dụng HTTP authentication. Khi tính năng HTTP
authentication được bật thì một hộp thoại yêu cầu nhập password sẽ
xuất hiện khi một người truy cập cố gắng đọc ra một trang được giới
hạn. Để xem trang này, người dùng phải nhập vào một username và
password Windows hợp lệ. Nó chỉ hoạt động với Internet Information
Server với Windows NT hoặc Windows 2000.
Khi nào sẽ sử dụng HTTP authentication
Đưa một cửa hàng lên mạng Internet
48
HTTP authentication hữu ích khi cần ta bảo vệ bằng password một
phần của Website để nó truy xuất bởi một số lượng nhỏ những người dùng
được cấp quyền. Tuy nhiên, việc thiết lập HTTP authentication để làm
việc với một hệ thống đăng ký người dùng tự động là rất khó khăn. Rắc
rối phát sinh từ việc cần thêm một tài khoản Windows NT cho mỗi người
dùng được cấp quyền. Nếu có hàng ngàn người dùng đăng ký tại Website
thì cần thiết lập hàng ngàn tài khoản Windows. Nếu cần tạo một hệ
thống đăng ký người dùng tự động, việc sử dụng database authentication
sẽ dễ dàng hơn.
5.2. Sö dông Database Authentication
Bảo vệ bằng password các trang tại Website bằng cách so sánh
username và password với các cột trong một bảng cơ sở dữ liệu. Ta tạo
một file đính kèm chuẩn mà có thể đưa vào trong tất cả các trang muốn
bảo vệ bằng password. Khi có một khách hàng mở một trang có chứa file
dùng chung thì khách hàng này sẽ được yêu cầu nhập vào username cà
password đã đăng ký của khách hàng. Nếu đây là một khách hàng mới thì
họ có thể đăng ký bằng cách sử dụng một trang đăng ký. File dùng chung
này có thể được đưa vào bất kỳ trang nào mà ta cần bảo vệ bằng
password.
Tạo một bảng mới trong cơ sở dữ liệu và ba trang ASP mới:
Userlist Bảng này chứa tất cả username và password đã đăng
ký.
Register.asp File này chứa một form đăng ký.
Login.asp File này chứa một form đăng nhập.
Checkpassword.asp Đây là file dùng chung phải đưa vào trong mọi trang
muốn bảo vệ bằng password.
Tạo bảng UserList
user_id Autonumber Chỉ định duy nhất một người dùng.
user_name Text Chứa username
user_password Text Chứa password
Tạo userDSN cho Data Source Name. Trang đầu tiên cần tạo là
register.asp, trang này chứa một form đăng ký dành cho những người
dùng mới.
Trang Register.asp
<%
nextPage=Request("nextPage")
newUsername=Request("newUsername")
newPassword=Request("newPassword")
%>
Register
Register at this Website by selecting a username and password:
">
Username:
<input name="newUsername" size="20" maxlength="20"
value="">
Password:
Đưa một cửa hàng lên mạng Internet
49
<input name="newPassword" size="20" maxlength="20"
value="">
Trang này được sử dụng bởi một khách hàng mới để đăng ký. Nó chứa
một form HTML có hai trường tên là newUsername và newPassword. Form
này còn chứa một trường ẩn tên là newUser. Trang register.asp không
bao giờ được mở trực tiếp. Một người dùng mới liên kết đến trang này
từ login.asp.
Kế tiếp tạo một trang login.asp. Trang này xuất hiện khi một
người dùng truy xuất một trang được bảo vệ bằng password mà không có
thông tin xác thực thích hợp.
Trang Login.asp
Login
">
USERNAME:
<input name="newUsername" size="20" maxlength="20"
value="">
PASSWORD:
<input name="newPassword" size="20" maxlength="20"
value="">
Remember me with a
cookie
">
Click here to register
Trang này cũng chứa một form HTML, form này gồm ba trường tên là
username, password và addCookie. Trường addCookie là một hộp chọn. Nếu
khách hàng muốn username và password của anh ta được thêm vào trình
duyệt của mình bằng một cookie thì anh ta có thể đánh dấu hộp chọn
này.
Tất cả những điều thú vị diễn ra trong file có tên là
checkpassword.asp. File này được đính kèm ở đầu mỗi trang ta muốn bảo
vệ bằng password. Ta có thể đính kèm trang này bằng cách sử dụng chỉ
thị #include của ASP. Đầu tiên trang checkpassword.asp gọi ra vài biến
từ tập hợp Request:
' Retrieve Form Variable
username=TRIM(Request("username"))
password=TRIM(Request("password"))
newUser=TRIM(Request("newUser"))
newUsername=TRIM(Request("newUsername"))
newPassword=TRIM(Request("newPassword"))
addCookie=TRIM(Request("addCookie"))
Nếu một người truy cập đến trang này từ trang đăng nhập thì các
biến username và password sẽ có giá trị. Nếu một người truy cập vừa
hoàn tất trang register.asp thì các biến newUser, newUsername và
Đưa một cửa hàng lên mạng Internet
50
newPassword sẽ có giá trị. Cuối cùng, nếu một người dùng đánh dấu chọn
hộp có tên là addCookie trong trang login.asp thì biến addCookie sẽ có
một giá trị.
Kế tiếp, toàn bộ đường dẫn ảo của trang hiện tại được gọi ra từ tập
hợp Server Variables của đối tượng Request và được gán cho một biến
tên là nextpage:
' Retrieve Current Page
nextpage=Request.ServerVariable("script_name")
Kế đến, một kết nối đến cơ sở dữ liệu userDB được mở. Kết nối
này được mở với Data Source Name userDSN:
' Ready Database Connection
Set Con=Server.CreateObject("ADODB.Connection")
Con.Open "userDSN"
Kế tiếp, nếu biến newUser có một giá trị thì script này cố gắng
thêm username và password của người dùng mới vào cơ sở dữ liệu. Biến
newUser được truyền bởi trang register.asp khi form đăng ký được đệ
trình
Script thêm người dùng
' Add New User
IF newUser "" THEN
IF newUsername = "" THEN
showError "You must enter a Username"
END IF
IF newPassword = "" THEN
showError "You must enter a Password"
END IF
IF usernameTaken(newUsername) THEN
showError "the username you entered has already been chosen by a
previous user. Please Select anew username"
END IF
sqlString = "INSERT INTO Userlist(user_username, user_password)
VALUES('"&newUsername&"','"&newPassword&"')"
Con.Execute sqlString
username = newUsername
password = newPassword
IF useSession THEN Session("loggedIn")="yes"
END IF
Đầu tiên script này kiểm tra xem trong hai biến username và
password không có giá trị hay không. Nếu một khách hàng đăng ký mà
không nhập vào username và password thì một trang thông báo lỗi xuất
hiện. Kế tiếp, một hàm tên là usernameTaken() được sử dụng để kiểm tra
xem username do khách hàng nhập vào có trùng với username của một
khách hàng trước đó hay không. Bởi vì ta cần bảo đảm rằng một khách
hàng được đăng ký với một username duy nhất. Sau đó username và
password mới được thêm vào trong bảng userlist. Sau khi username và
password mới được thêm vào cơ sở dữ liệu, chúng được gán cho những
biến mới. Cuối cùng một biến Session tên là LoggedIn được gán giá trị
là 1. Biến LoggedIn chỉ định rằng khách hàng đã đăng nhập vào có thể
truy xuất các trang sau này mà không cấn nhập vào username và password
của họ.
Xác thực một người dùng
' Authenticate User
IF Session("loggedIn") = "" THEN
Đưa một cửa hàng lên mạng Internet
51
IF username = "" OR password = "" THEN
LogginMessage="You must login before you can view this page"
ShowLogin
END IF
result = validateLogin(username,password)
IF result = 1 THEN
loginMessage = "You entered an unregidtered username" showLogin
END IF
IF result = 2 THEN
loginMessage = "You did not enter a valid password" showLogin
END IF
IF userSession THEN Session("loggedIn")="Yes"
END IF
Script xác thực bắt đầu bằng việc kiểm tra xem biến Session tên là
LoggedIn có giá trị hay không. Nếu biến này có một giá trị thì khách
hàng đã đăng nhập và phần còn lại của script xác thực bỏ qua. Kế tiếp,
nếu một trong hai biến username và password không có giá trị thì trang
login.asp được hiển thị và script này kết thúc. Ngược lại, username và
password sẽ được kiểm tra với bảng userlist bằng hàm validatelogin().
Hàm này trả về ba giá trị sau:
0 Nếu username và password tồn tại trong bảng userlist
1 Nếu username không tồn tại trong bảng userlist
2 Nếu username tồn tại trong bảng nhưng password không hợp lệ
Nếu hàm validatelogin() trả về giá trị 0 thì có nghĩa là khách
hàng đã đăng nhập thành công. Trong trường hợp này biến LoggedIn được
cấp giá trị là 1.
Kiểm chứng username và password
' Check Uername and Password
FUNCTION validateLogin(theUsername, thePassword)
sqlString="SELECT user_Password FROM Userlist
WHERE user_username='"&fisQuotes(username)&"' "
Set RS = Con.Execute(sqlString)
IF RS.EOF THEN
validateLogin = 1
ELSE
IF RS("user_password") thePassword THEN
validateLogin = 2
ELSE
validateLogin = 0
END IF
END IF
END FUNCTION
Hàm validatelogin() trả về ba giá trị khả dĩ. Đầu tiên, một
chuỗi SQL được xây dựng để gọi ra password từ bảng userlist khớp với
username mà khách hàng nhập vào trong bảng login.asp. Nếu không có
hàng nào được gọi ra từ bảng này thì ta biết username này không tồn
tại và giá trị 1 được trả về. Kế tiếp, nếu username tồn tại trong bảng
những password mà khách hàng nhập vào trang login.asp không khớp với
password trong cơ sở dữ liệu thì giá trị 2 được trả về. Cuối cùng, nếu
cả userlist thì giá trị 0 được trả về. Sau khi username và password
của một khách hàng được kiểm chứng với bảng userlist thì script
checkpassword.asp thực hiện thêm ba nhiệm vụ. Đầu tiên, nếu khách hàng
chỉ định rằng username và password của họ được thêm vào trình duyệt
của họ bằng một cookie thì điều này được thực hiện với script sau:
Đưa một cửa hàng lên mạng Internet
52
' Add a Cookie
IF addCookie "" THEN
Response.Cookies("username") = username
Response.Cookies("username").Expires = "25/12/2002"
Response.Cookies("password") = password
Response.Cookies("password").Expires = "25/12/2002"
END IF
Kế tiếp, một biến tên là sp được xây dựng. Biến này được sử dụng
để truyền thông tin bảo mật (chẳng hạn như username và password của
khách hàng trong một biến chuỗi truy vấn). Cuối cùng, một biến tên là
sf được xây dựng. Biến sf được xử dụng để truyền thông tin bảo mật của
khách hàng trong một trường ẩn. Việc không nắm vững cách thức tương
tác giữa các trang login.asp, register.asp và checkpassword.asp rất dễ
xảy ra vì thế ta sẽ xem xét một ví dụ về cách thức một người dùng mới
gặp phải từng trang này.
Truyền các thông tin bảo mật từ trang này đến trang khác
Khi một khách hàng đăng nhập vào một trang tại Website, khách hàng
đó không hề bị quấy rầy với việc đăng nhập vào mỗi trang khác mà họ
yêu cầu. Việc nhập vào một username và password để xem mỗi trang sẽ
nhanh chóng làm cho khách hàng cảm thấy mệt mỏi. Thông tin này nên
được truyền đến mỗi trang mới một cách tự động.
Có năm cơ chế phổ biến có thể sử dụng để truyền thông tin, bao gồm
thông tin bảo mật, từ một trang ASP đến một trang khác:
Các cookies trình duyệt.
Các biến Session.
Các Form.
Các biến chuỗi truy vấn.
Các tiêu đề trình duyệt.
Trang checkpassword.asp sử dụng bốn phương pháp đầu tiên để theo
dõi thông tin bảo mật của khách hàng. Thuận lợi của các cookie trình
duyệt là chúng cung cấp một phương pháp lưu trữ thông tin của khách
hàng qua nhiều cuộc viếng thăm đến một Website. Vì thế, nếu một người
dùng nhập vào username và password một lần thì họ sẽ không bao giờ cần
nhập lại những thông tin này. Về mặt lý thuyết, người dùng có thể tự
động được xác thực mỗi lần họ yêu cầu một trang. Bất lợi của các
cookie là không phải tất cả các trình duyệt đều hỗ trợ nó. Vì nhiều lý
do, các cookie thường bị hỏng. Vì thế ta không nên dựa vào cookie để
xác thực một khách hàng qua nhiều trang.
Vệc sử dụng các biến chuỗi truy vấn và các biến Form là đáng tin
cậy hơn việc sử dụng cookie và các biến session. Nếu muốn Website hoạt
động với bất kỳ trình duyệt nào, ta cần xem xét việc sử dụng các biến
Form và chuỗi truy vấn để truyền những thông tin bảo mật từ trang này
đến trang khác. Việc sử dụng các biến form và chuỗi truy vấn có hai
bất lợi chính. Đầu tiên, khi ta sử dụng các biến chuỗi truy vấn, các
biến này có thể thấy được rõ ràng trên thanh địa chỉ của trình duyệt.
Quan trọng hơn, việc truyền các biến chuỗi truy vấn và các biến form
từ trang này đến trang khác sẽ mất nhiều công đoạn. Ta phải đưa các
biến này vào mỗi liên kết siêu văn bản và mọi trường trong một trang
để truyền các biến này đến những trang khác.
5.3. sö dông hybrid authentication
Đưa một cửa hàng lên mạng Internet
53
Tìm hiểu cách làm việc của Basic Authentication
Trước khi đi sâu hơn, ta cần hiểu chi tiết về cách làm việc của
Basic authentication. Dưới đây là một cách nhìn tổng quan về những gì
xảy ra khi một người dùng yêu cầu một trang được bảo vệ bởi Basic
authentication.
1. Yêu cầu một trang được bảo vệ bởi Basic authentication.
2. Web server phản hồi với mã tình trạng 401 Not Authorized.
3. Mã tình trạng 401 buộc một hộp thoại password xuất hiện trên
trình duyệt. Nhập username và password và nhấp vào nút OK.
4. Trình duyệt của ta gửi username và password trong một tiêu đề
trình duyệt (một tiêu đề yêu cầu) tên là AUTHORIZATION. Trường
AUTHORIZATION chứa username và password được mã hoá sử dụng mã
base64.
5. Web server giải mã username và password được truyền trong tiêu
đề AUTHORIZATION và kiểm tra xem chúng có tương ứng với một tài
khoản Windows hợp lệ hay không.
6. Nếu username và password hợp lệ thì trang này được hiển thị.
Ngược lại, Web server gởi một mã tình trạng 401 và quá trình này
bắt đầu lại.
Sau khi một trình duyệt được xác thực tại một Website, trình
duyệt sẽ tiếp tục gởi tiêu đề AUTHORIZATION với username và password
mỗi lần một trang được yêu cầu. Điều này có nghĩa là ta không phải lo
lắng về việc truyền username và password từ trang này đến trang khác.
Nhưng khuyết điểm chính của Basic authentication là Internet
Information Server sẽ chỉ kiểm chứng username và password với các tài
khoản Windows. Điều này có nghĩa là ta không thể dễ dàng sử dụng Basic
authentication khi tạo một hệ thống đăng ký tự động.
Để giải quyết vấn đề này ta cần đọc username và password từ tiêu
đề AUTHORIZATION và kiểm chứng username và password với một bảng
trong cơ sở dữ liệu.
Buộc một hộp thoại password xuất hiện
Ta có thể buộc một hộp thoại password xuất hiện bằng việc gởi đi
một mã tình trạng 401 Not Authorized đến một trình duyệt. Đối tượng
Response có một thuộc tính tên là Status cung cấp cho ta phương pháp
gởi một mã tình trạng.
Buộc một hộp thoại password xuất hiện
<%
auth=TRIM(Request.ServerVariable(HTTP_AUTHORIZATION))
IF auth = "" THEN
Response.Status = "401 Not Authorized"
Response.AddHeader "WWW-Authenticate", "Basic realm=localhost"
Response.End
END IF
%>
Proteced Page
The AUTHORIZATION header contains:
Đưa một cửa hàng lên mạng Internet
54
Tiêu đề trình duyệt AUTHORIZATION được gọi ra từ tập hợp
Server- Variable. Nếu tiêu đề AUTHORIZATION không có giá trị thì mã
tình trạng 401 Not Authorized được gởi đến trình duyệt. Mã tình trạng
này buộc một hộp thoại password xuất hiện.
Phương thức addHeader của đối tượng Response được sử dụng để
thêm một tiêu đề tên WWW-Authenticate. Một trình duyệt sử dụng tiêu đề
này để phát hiện loại xác thực nào được sử dụng. Sau khi một người
dùng nhập một user- name và password vào hộp thoại password, trình
duyệt sẽ gởi về tiêu đề AUTHO-RIZATION. Nếu script ở trên có thể gọi
ra tiêu đề AUTHORIZATION thì nó sẽ hiển thị giá trị của tiêu đề này.
Giải mã tiêu đề Authorization
Khi một trình duyệt gởi một tiêu đề AUTHORIZATION, nó gởi đi
tiêu đề ở tình trạng mã hoá base64. Base64 là một phương pháp mã hoá
văn bản cũ. Trước đây nó là một phần của chuẩn MIDE dành cho việc gởi
các đính kèm với các thông điệp.
Bước đầu tiên trong việc giải mã văn bản được mã hoá base64 là
chuyển các ký tự từ bảng mã ANSI thành bảng mã base 0. Ta cần ánh xạ
mỗi ký tự thành một mã từ 0 đến 65:
A-Z ánh xạ thành 0-25.
A-z ánh xạ thành 26-51.
0-9 ánh xạ thành 52-61.
+ ánh xạ thành 62.
/ ánh xạ thành 63.
Chúng ta sẽ sử dụng đối tượng Dictionary để tạo ra một ánh xạ từ
bảng mã ANSI thành bảng mã base 0.
UUEncoding
SET UUEncode = Server.CreateObject("Scripting.Dictionary")
FOR i=0 TO 63
SELECT CASE i
CASE 0 offset = 65
CASE 26 offset = 71
CASE 52 offset = 4
END SELECT
UUEncode(CHR(i + offset)) = i
NEXT
Tạo một thực thể của đối tượng Dictionary. Một vòng lặp FOR…NEXT
được sử dụng để duyệt qua các số từ 0 đến 63. Câu lệnh SELECT…CASE gán
các độ dời thích hợp cho ký tự ANSI. Đối tượng Dictionary có những ký
tự ANSI cho các khoá và các mã của bảng mã base 0 cho các giá trị.
Kế tiếp ta cần tháo gỡ từng ký tự. Khi văn bản được mã hoá
base64 các ký tự thường được thể hiển ở bốn byte được nén thành ba
byte.
00aaaaaa 00bbbbbb 00cccccc 00dddddd
c nén thành
aaaaaabb bbbbcccc ccdddddd
Để giải mã văn bản này, chúng ta cần chuyển mỗi nhóm ba byte này
thành bốn byte. Điều này được thực hiện với hàm Decode()
Đưa một cửa hàng lên mạng Internet
55
Hàm Decode()
FUNCTION Decode(theString)
FOR byteGroup = 1 TO Len(theString) Step 4
numBytes = 3
groupBytes = 0
FOR charCounter = 0 TO 3
thisChar = Mid(theString, byteGroup + CharCounter, 1)
IF thisChar = "" THEN
numBytes = numBytes – 1
thisBytes = 0
ELSE
thisBytes = UUEncode(thisChar)
END IF
groupBytes = 64 * groupBytes + thisBytes
NEXT
FOR k=1 TO numBytes
SELECT CASE k
CASE 1: thisChar = groupBytes\65536
CASE 2: thisChar = (groupBytes And 65535)\256
CASE 3: thisChar = (groupBytes And 255)
END SELECT
Decode = Decode & Chr(thisChar)
NEXT
NEXT
END FUNCTION
Cuối cùng, ta trích ra username và password từ tiêu đề
AUTHORIZATION. Script Hybrid authentication gọi ra username và
password từ một hộp thoại password chuẩn và so sánh chúng với bảng
userlist.
Hybrid authentication (xác thực hỗn hợp)
<%
Set UUEncode = Server.CreateObject("Scripting.Dictionary")
FOR i=0 TO 63
SELECT CASE i
CASE 0 offset = 65
CASE 26 offset = 71
CASE 52 offset = 4
END SELECT
UUEncode(CHR(i + offset)) = i
NEXT
FUNCTION Decode(theString)
FOR byteGroup = 1 TO Len(theString) Step 4
numBytes = 3
groupBytes = 0
FOR charCounter = 0 TO 3
thisChar = Mid(theString, byteGroup + CharCounter, 1)
IF thisChar = "" THEN
numBytes = numBytes - 1
thisBytes = 0
ELSE
thisBytes = UUEncode(thisChar)
END IF
groupBytes = 64 * groupBytes + thisBytes
NEXT
FOR k=1 TO numBytes
SELECT CASE k
Đưa một cửa hàng lên mạng Internet
56
CASE 1: thisChar = groupBytes\65536
CASE 2: thisChar = (groupBytes And 65535)\256
CASE 3: thisChar = (groupBytes And 255)
END SELECT
Decode = Decode & Chr(thisChar)
NEXT
NEXT
END FUNCTION
Auth=TRIM(Mid(auth,6))
auth=Decode(auth)
authSplitSPLIT(auth,":")
username=authSplit(0)
password=authSplit(1)
sqlString "SELECT user_id FROM userlist WHERE
user_username="&username&"
AND user_password="&password&" "
Set Con = Server.CreateObject("ADODB.Connection")
Con.Open "userDSN"
Set.RS = Con.Execute(sqlString)
IF RS.EOF THEN
Response.Status="401 Not Authorized"
Response.AddHeader "WWW-Authenticate","Basic realm=Localhost"
Response.End
END IF
%>
Welcome
Welcome !
Phần lớn script này được dành cho việc giải mã username và password
chứa trong tiêu đề AUTHORIZATION. Tiếp theo tiêu đề AUTHORIZATION
được gọi ra từ tập hợp Request. Nếu tiêu đề AUTHORIZATION không chứa
thông tin thì tình trạng 401 được gởi đến trình duyệt buộc hộp thoại
password xuất hiện. Sau đó sáu ký tự đầu tiên được tích ra từ tiêu đề
AUTHORIZATION. Sáu ký tự đầu tiên này chứa văn bản BASIC, vốn chỉ
định loại xác thực, ta đã biết điều này vì thế ta bỏ đi các ký tự này.
Tiêu đề AUTHORIZATION được giải mã base64 với sự giúp đỡ của hàm
Decode(). Tiêu đề được giải mã sẽ chứa username và password được phân
tách bởi một dấu hai chấm. Hàm SPLIT() của VBScript được sử dụng để
trích username và password từ tiêu đề. Cuối cùng username và password
được so sánh với các username và password chứa trong userlist. Nếu
không có sự trùng khớp, mã tình trạng 401 sẽ gởi đến trình duyệt để
buộc hộp thoại password hiển thị. Ngược lại, người dùng có thể thấy
được trang này.
Các file đính kèm theo tài liệu này:
- 13_6812.pdf