Luận văn Đưa một cửa hàng lên mạng Internet

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.

pdf55 trang | Chia sẻ: lylyngoc | Lượt xem: 2677 | Lượt tải: 0download
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 dng c n i, ch có hai s u tiên và hai s cui cùng ca s th tín dng là c hin ra. iu này c thc hin vì các lý do bo mt. Nu mt ngi nào ó có c gng oán username và password ca mt khách hàng thì k này không th n cp c s th tín dng ca 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:

  • pdf13_6812.pdf