Chủ Nhật, 23 tháng 9, 2007

Xâm nhập máy tính từ xa thông qua yahoo

Xâm nhập máy tính từ xa thông qua Yahoo! Messenger - 27/7/2006 9h:55

Sơ lược chương trình Đây là một chương trình xâm nhập và kiểm soát máy tính từ xa thông qua Yahoo! Messenger. Với công cụ này, bạn có thể kiểm soát bất cứ một máy tính nào bằng cách gửi thông tin qua Yahoo! Messenger ảo thiết lập trong hệ thống. Từ đó bạn có thể ra lệnh cho máy đối tượng làm theo bất kỳ mệnh lệnh nào. Cơ chế hoạt động:Sau đây là quy trình hoạt động của chương trình sau khi xâm nhập: 1) Chạy vào chương trình khởi động (Startup). 2) Kiểm soát bộ nhớ hệ thống. 3) Nằm ẩn chờ khi có kết nối vào mạng. 4) Khi máy đối tượng đã kết nối, phát tín hiệu trở về cho máy ID ảo. 5) Gửi thông tin về cho chủ nhân, sau khi quá trình phát tín hiệu thành công. 6) Và bây giờ bạn đã có thể kiểm soát mọi thứ trên máy nạn nhân. Cấu hình tối thiểu: 1) Hệ điều hành Microsoft Windows XP hoặc Windows Server 2003 . Chương trình không hỗ trợ trên Windows 2000, Windows 98 đến thấp hơn, và hệ thống Linux. 2) 128MB RAM (256MB RAM cấu hình chuẩn) 3) 700Mhz CPU. 4) 8MB Card đồ họa. 5) Dung lượng trống đủ dùng. (Để lưu hình chụp gửi về) 6) Kết nối mạng thường xuyên. Chương trình hoạt động với mọi loại mạng. Ví dụ: Dialup, ADSL, Wireless, Broadband, Satellite, LAN... Chương trình vẫn hoạt động với điều kiện truy cập mạng bình thường. Nhưng điều kiện kết nối liên tục thường xuyên sẽ giúp quá trình phát tín hiệu và gửi thông tin tốt hơn. Tính năng đặc biệt Không đòi hỏi IP Address! Đây là ưu thế mạnh nhất của chương trình này. Trong những chương trình trước đây bạn buộc phải có và khai báo một IP Address trong quá trình kiểm soát. Với chương trình này thì không đòi hỏi IP Address. Nghi vấn - Làm thế nào có thể thực hiện kiểm soát mà không cần IP Address? Giải đáp - Bởi vì chương trình này tạo ra hẳn một Yahoo! ID ảo cho bạn, vì vậy bạn không cần phải khai báo IP Address từ máy điều khiển. Mặc dù IP Address vẫn được gửi cho bạn khi kết nối. Nhưng đó chỉ là thông tin cung cấp thêm cho bạn về máy bị kiểm soát, và không có tác dụng gì đối với chương trình TroMessenger. Chạy ẩn trong hệ thống mạng LAN, kể cả hệ thống Router của máy chủ. Đây là một khuyết điểm của hầu hết các loại Trojan, như là Troya, chỉ hoạt động trên hệ thống có IP tĩnh. Trước đây, bạn phải có được IP Address hợp lệ. Ví dụ: nếu có một hệ thống mạng với 5 máy tính và bạn là một thành viên trong hệ thống mạng đó, bạn có thể truy cập vào các máy khác. Nhưng ai đó nằm ngoài hệ thống mạng này thì không thể truy cập vào bất cứ máy nào trong hệ thống. Bởi vì anh ta không có IP Address hợp lệ để liên kết vào hệ thống. Nhưng giờ đây, vấn đề đã được giải quyết với TroMessenger. Với TroMessenger, bạn có thể truy cập vào bất cứ máy nào ở bất kỳ hệ thống mạng nào. Chỉ cần mọi máy tính được kết nối vào mạng và TroMessenger đang nằm ẩn bên trong. Các kiểu lệnh Trong phiên bản này, đây là một số câu lệnh khởi đầu cho việc kiểm soát. /Result Kết quả của quá trình thực thi sẽ được gửi về ngay sau khi quá trình hoàn tất. Nhưng nếu như nội dung của kết quả gửi về quá dài (nhiều hơn 200 ký tự), nó sẽ được gửi lần lượt, liên tục. Bởi vì Yahoo! Messenger không cho phép nội dung có số ký tự vượt quá giới hạn đã định sẵn. /cmd - Tương tự MS-DOS Command Prompt. Bạn có thể thực thi lệnh DOS trên máy bị kiểm soát, và nhận được kết quả. Các lệnh như: DIR , VER , VOL , IPConfig , Netstat , WHOAMI v.v ... đều có thể được sử dụng như lệnh DOS. Ví dụ: /cmd dir C:\*.txt] Các kiểu lệnh thực thi DOS Bạn có thể thực thi một số lệnh DOS đặc biệt để khai thác thông tin từ phía máy bị kiểm soát. /cmd dir - Xem danh sách các tập tin và thư mục. Bạn có thể sử dụng linh động các thông số để khai thác thông tin cụ thể nhất. Ví dụ: /cmd dir /on , /cmd dir *.txt /cmd ipconfig - Lấy thông tin truy cập. Câu lệnh có chức năng khai thác thông tin từ thiết bị mạng đang sử dụng trên máy bị kiểm soát. Nó sẽ truy ra tên thiết bị mạng, địa chỉ IP, cổng vào, DNS Server ... v.v /cmd tasklist - Lấy danh sách các chương trình đang hoạt động. Tương tự như Windows Task Manager. Nhưng dưới giao diện DOS. /cmd whoami - Cung cấp thông tin để xác định máy qua mạng. Thông tin gửi về gồm : TÊN MIỀN / TÊN NHÓM MẠNG , Tên máy tính và tên truy cập máy tính sử dụng WINDOWS. Lưu ý : Câu lệnh này chỉ hoạt động với Windows Server 2003. Không hỗ trợ trên Windows XP. /cmd netstat - Hiển thị hệ thống mạng và tất cả kết nối hiện có trên máy tính. Để đạt tốc độ nhanh, sử dụng /cmd netstat -na Khai thác thông tin của máy tínhChỉ việc sử dụng câu lệnh này, bạn có thể lấy được thông tin chính từ máy đối tượng. /IP - cho biết địa chỉ IP. Một máy tính có thể có nhiều hơn một địa chỉ IP khi hoạt động. Ví dụ : bạn có một tài khoản để kết nối internet, và máy tính của bạn đang nằm trong một khu vực kết nối mạng nội bộ (LAN). Vì vậy bạn sẽ có 2 địa chỉ IP ấn định trong máy tính. TroMessenger sẽ gửi toàn bộ địa chỉ IP hiện hành trên máy tính. /osname - cho bạn biết đầy đủ về tên của Hệ điều hành Windows và tên các phiên bản cập nhật. Ví dụ : Windows Server 2003 Service Pack 1. /computername - cho biết tên thiết lập của máy trên hệ thống mạng. Các máy tính nhận dạng nhau qua tên này. Nếu máy tính hiện thời chưa được kết nối, không thành vấn đề, nội dung sẽ được gửi ngay sau đó. /winusername - cho biết tài khoản quản lý sử dụng Windows. Đặc biệt trong Windows XP, có thể sẽ có nhiều tài khoản sử dụng cùng một máy. Và thông tin này sẽ được thay đổi mỗi khi người sử dụng truy cập. Nhưng với Windows Server 2003 tên này luôn được trả về Administrator. Tuy nhiên dân Admin đã biết chuyển tên tài khoản. nhưng thông thường đa số Admin lại quên làm. /yahooid - Cho biết tên Yahoo ID của người cuối cùng đang bị kiểm soát. Những chức năng chính /Help - Hiển thị các lệnh hợp lệ của TroMessenger. Sẽ có nhiều câu lệnh hơn trong những phiên bản mới. Lúc đó bạn chỉ cần sử dụng lệnh này. /screenshot - Cho bạn ảnh chụp màn hình của máy tính đối tượng. Nghi vấn - Yahoo! Messenger là chương trình viết bằng ngữ lệnh, làm sao TroMessenger có thể cho tôi xem ảnh chụp ? Giải đáp - TroMessenger cho bạn ảnh ngay tức khắc. Có nghĩa là : chụp sao lại màn hình, sau đó tải lên mạng, và gửi đến bạn một liên kết để xem ảnh. /download - Tải về một thứ gì đó và lưu lại trên máy đối tượng. Bạn sẽ được thông báo khi quá trình hoàn tất. Câu lệnh: /download "http://www.hostname.com/folder/file.zip" "C:\SavedFile.zip" Chú ý: Bạn phải sử dụng dấu ngoặc ("). Nếu quên, quá trình tải về sẽ không thực hiện được. /restart - Khởi động lại máy tính. Chú ý: Nếu bạn chạy thử nghiệm trên máy tính của bạn, bạn sẽ bị khởi động ngay lập tức mà không có tín hiệu thông báo nào. Và những chương trình trên máy sẽ bị mất. Hãy cẩn thận khi sử dụng câu lệnh này. Tương tự như Shutdown command. /shutdown - Tắt máy tính. (Lặp lại chú ý) /time , /date - Hiển thị ngày và giờ. /ejectcd - Mở ổ đĩa CD-ROM. /closecd - Đóng ổ đĩa CD-ROM sau khi mở. /view - Hiển thị nội dung của văn bản. Lưu ý: nếu văn bản nhiều hơn ... ký tự, nó sẽ được ngắt ra thành nhiều phần để gửi liên tiếp nhau. /getfile - tải bất kỳ tập tin nào lên mạng và gửi liên kết tải về cho bạn. Được sử dụng khi bạn muốn đọc những tập tin không phải là tập tin văn bản từ máy đối tượng /status , /idle , /busy - Đặt tín hiệu hiển thị cho địa chỉ ảo. Như là tín hiệu Busy hoặc Idle Icons bên cạnh ID. Câu lệnh ví dụ : /status Toiyeuem. /idle Dangantoi. /busy Hiendangban. /cancel - Đình chỉ câu lệnh đang thực hiện. Ví dụ khi bạn muốn xem một tập tin văn bản có dung lượng 1MB. Và nội dung đang được gửi đi từng phần, nhưng rồi bạn cảm thấy chán và không muốn xem nữa và muốn gửi một lệnh khác. Chỉ cần dùng lệnh /cancel là xong. /login - Đăng nhập tài khoản sử dụng quản lý. Mỗi khi TroMessenger khởi động, nếu bạn không được xác nhận là chủ quản lý của chương trình, nhưng bạn biết mật khẩu, bạn sẽ sử dụng /login your password để bắt đầu điều khiển chương trình. Không sử dụng dấu ngoặc cho mật khẩu...Nhưng chú ý: Đây là chương trình xâm nhập trái phép và có thể có Trojan nên khi bạn giải nén ra một số file sẽ bị Symantec và NAV kill luôn. Bạn nào muốn edit thì tắt auto protect của NAV đi (nhưng coi chừng gậy lưng đập lưng ông đó)

Thứ Năm, 20 tháng 9, 2007

Mười lỗi lớn nhất các nhà phát triển hay mắc phải với CSDL

Thế giới phần mềm luôn phát triển không ngừng với những kiểu mẫu mới, thời thượng hơn, trang nhã hơn, đa chức năng hơn. Đã qua lâu rồi cái thời sản phẩm IT chỉ là những cái máy “cục mịch”, có mỗi nhiệm vụ thực hiện chức năng theo mã hoá của người lập trình. Bây giờ, bên cạnh khả năng hoạt động người ta còn quan tâm nhiều đến kiểu dáng, giao diện đẹp mà tiện lợi. Nói vậy nhưng, cũng có không thứ đáng để tâm mà từ trước đến nay chẳng hề được thay đổi. Đôi khi đó lại là các thói quen xấu của người quản trị, nhất là trong việc sử dụng cơ sở dữ liệu. Bạn có thể mới update một giao diện Web AJAX tuyệt vời, hay giao diện người dùng Windows “hàng khủng” mới nhất, nhưng dù làm gì đi chăng nữa, bạn cũng không thể bỏ qua cơ sở dữ liệu. Dù phần mềm phát triển đến đâu, hiện đại ra sao, đẹp đẽ thế nào thì việc đưa dữ liệu vào ra vẫn cần được thực hiện thường xuyên với những thao tác đã từng xuất hiện từ hàng thập kỷ trước. Và, thật đáng ngạc nhiên là các nhà phát triển phần mềm vẫn mắc phải những lỗi cơ bản về cơ sở dữ liệu như thời kỳ của Windows 95. Có lẽ, hầu hết chúng ta chỉ mới học cách sử dụng cơ sở dữ liệu chứ chưa thực sự nghiên cứu về nó. Dưới đây là một số lỗi được cho là lớn nhất và thường gặp nhất khi làm việc với cơ sở dữ liệu (CSDL). Chọn sai CSDL Không phải tất cả CSDL đều được tạo ra như nhau. Có nghĩa là trước khi thực hiện việc gì, hãy chắc chắn rằng bạn đã chọn đúng CSDL phù hợp. Đã từng có nhiều trường hợp, CSDL Access “trĩu xuống” vì phải tải những tập hợp dữ liệu khổng lồ, trong khi chúng chỉ là trò chơi trẻ con với SQL Sever. Một số người dùng phiền phức còn cố gắng trả tiền và cài đặt SQL Sever cho CSDL chỉ với vài trăm hàng. Xét trên diện rộng, thị trường hiện nay có 3 tầng CSDL: tầng thứ nhất dành cho máy tính cá nhân (tầng desktop) với CSDL nhúng, phù hợp cho các công việc nhỏ; tầng thứ hai là phiên bản “Express” của những người chơi lớn, với dung lượng khoảng vài Gigabyte dữ liệu; tầng thứ ba là lớp CSDL doanh nghiệp như SQL Sever, Oracle và DB2, có thể kiểm soát tất cả những gì bạn đưa vào. Trước khi bắt tay vào làm việc, bạn cần đánh giá ước lượng thực tế tổng lượng dữ liệu sẽ lưu trữ trong tương lai để chọn loại sản phẩm cho phù hợp. Chọn quá nhiều CSDL Các API như ODBC, JDBC và OLE DB bây giờ có xu hướng thúc đẩy mạnh khái niệm độc lập của CSDL. Tức là bạn có thể viết mã nguồn chương trình ứng dụng và đưa bất kỳ CSDL nào vào khu vực lưu trữ dữ liệu cũng được. Đã từng có nhiều đội phát triển đi vào bế tắc với độc lập CSDL, viết các tầng dịch tất cả lệnh SQL Sever sang một số dạng tiếng địa phương mẫu thức chung thấp nhất mà mọi CSDL nhận thức được hỗ trợ. Như thế cũng có nghĩa là từ bỏ một số chức năng nâng cao ở CSDL. Khái niệm này dường như nói rằng, một số client trong tương lai có thể sẽ chuyển sang Oracle hoặc DB2 hoặc FoxPro... Vì thế, tốt hơn hết là nên chuẩn bị từ bây giờ. Ngược lại, khi bắt đầu với một sản phẩm mới, hãy chọn cơ chế lưu trữ và viết CSDL phù hợp. Nếu sản phẩm của bạn tốt, mọi người sẽ cài đặt CSDL bạn mô tả. Lúc đó, bạn sẽ không bị lãng phí hàng giờ cho công việc hỗ trợ những thứ không bao giờ cần dùng đến. Bạn đã hiểu dữ liệu của mình? Nếu có thể thu được một 1 đô la sau mỗi lần trả cho khách hàng tài khoản 6 con số thay vì 7 như thực tế, hay nếu văn phòng quản lý hồ sơ thực sự cho phép sinh viên học sinh đăng ký mà không cần dùng đến số chứng minh thư nhân dân và cột ID trong CSDL phải cho phép NULL, thì đảm bảo rất nhiều quản trị viên DBA đã giàu không kể xiết. Thiết kế CSDL không thể thực hiện bừa bãi, bỏ qua mọi luật lệ, quy định thương mại. Bạn cần phải hiểu dữ liệu đầu vào của người dùng thực thuộc kiểu gì; có thể nén nó lại đến bao nhiêu để có được độ lớn cột cho phù hợp; các nguyên tắc áp dụng cho nó là gì; kiểu dữ liệu nào cho từng cột; ai có quyền update, v.v…. Không phải lúc nào cũng đơn giản như Excel Hiện nay có một xu hướng, nhất là trong quan niệm của các quản lý cửa hàng nhỏ cho rằng, bất kỳ nhà phát triển nào cũng biết cách cài đặt một CSDL. Thành thật mà nói, chưa hẳn đã đúng. Liệu có phải tất cả các nhà phát triển đều biết cách viết mã nguồn trên C# hay cài đặt dịch vụ web (Web Service). Nếu thế thì tất cả chúng ta đều có thể là chuyên gia CSDL. Có quá nhiều CSDL được thiết kế bởi những người thậm chí chưa từng nghe nói đến các thuật ngữ cơ bản, cũng không buồn bận tâm nâng cao kiến thức, hiểu biết về các dạng thông thường khác nhau của CSDL. Không biết bao nhiêu lần tôi được chứng kiến tất cả dữ liệu bị dồn vào một bảng lớn., dẫn đến nhiều vấn đề bất thường xuất hiện khi update và thực thi dữ liệu. Nếu bạn đang gặp phải vấn đề này, hãy học thêm về thiết kế CSDL. Đừng khám phá mọi thứ về chỉ qua các bản thử nghiệm và lỗi gặp phải. Kiểu bình thường của nhóm thứ ba không phải là “chén Thánh” Nói cách khác, đôi khi một chút kiến thức nhỏ cũng có thể trở thành thứ nguy hiểm. Tôi đã từng chứng kiến một số CSDL được bình tường hoá tới mức kẹt cứng bởi các nhà phát triển “thiện chí”, những người một mực khăng khăng đặt tất cả mọi thứ vào các bảng tra tìm. Và một phiên hoạt động đáng ghi nhớ, trong đó “yes” và “no” được bỏ vào tblAnswers. Bảng này có thể tham chiếu bởi khoá ngoại AnswerID từ các bảng khác. Phải, bạn cần biết các nguyên tắc bình thường hoá, nhưng cũng cần phát triển kỹ năng để hiểu khi nào thì nên ngừng, khi nào nên loại bỏ hoạt động này cho các thực thi thực sự. Thật tuyệt vời với các ứng dụng logic ẩn! Các thủ tục và ràng buộc lưu trữ là những thành phần tuyệt vời. Khi có nhiều client truy cập CSDL cùng một lúc, các thủ tục, ràng buộc này giúp đảm bảo tính nhất quán của dữ liệu. Đồng thời chúng cũng có thể quay trở lại một hộp đen chứa các ứng dụng logic ẩn, thông thường không được nhìn thấy và không thể xem. Có rất nhiều mã CSDL không có cùng tiêu chuẩn thiết kế, kiểm tra, xem lại mã nguồn giống nhau như yêu cầu. Khi có ý định đặt mã nguồn vào CSDL, bạn hãy dành ra chút thời gian tự hỏi lại xem nó có thực sự thuộc về nơi đó không. Ai cần những bản sao lưu? Ai cần những bản sao lưu? Chính là các bạn, những người quản trị CSDL hay các nhà phát triển. Vì đơn giản, công việc của các bạn chắc chắn phải lưu trữ dữ liệu trong một Database (CSDL). Có thể, vào một lúc nào đó, vì một lý do nào đó như lỗi phần cứng, hacker tấn công, hay đơn giản chỉ bởi các lỗi thông thường mà CSDL của bạn gặp trục trặc, bị mất mát hoặc phải cài đặt lại. Khi ấy, chắc chắn bạn sẽ cần đến những bản sao lưu. Kế hoạch sao lưu (như tần suất thực hiện, kiểu sao lưu…) cần được thực hiện vào thời điểm từ khi bắt đầu chu trình phát triển chứ không phải đợi đến khi hoàn thành mới tiến hành. Bạn cần kiểm soát phiên bản Nói đến sao lưu, bên cạnh các thay đổi về dữ liệu, bạn cũng cần theo dõi thay đổi về giản đồ CSDL, chủ động tinh thần sẵn sàng tạo lại CSDL vào bất cứ lúc nào. Nếu muốn làm công việc thực sự của một chuyên gia xây dựng phần mềm, bạn cần mở rộng kiểm soát phiên bản trong thiết kế CSDL. Bạn sẽ không thể phục hồi phiên bản 0.784.5 của một phần mềm trong quá trình kiểm tra gỡ lỗi cho khách hàng nếu không tạo được CSDL tương ứng. Nếu các nhà phát triển CSDL đang vui vẻ viết thủ tục lưu trữ, ngừng quá trình thiết kế bảng mà không để lại bất cứ dấu vết gì trong công việc của họ, bạn sẽ gặp phải vấn đề. Sử dụng công cụ hỗ trợ CSDL hiện đại thường cung cấp nhiều Bucket, cho phép bạn bổ sung dữ liệu vào. Chúng cũng có nhiều công cụ hỗ trợ, giúp việc quản lý dữ liệu dễ dàng hơn. Như SQL Sever hỗ trợ kiểm tra quá trình bắt đầu của server đang sử dụng truy vấn. CSDL này còn cung cấp một số Wizard nói cho bạn biết chỉ mục nào sẽ thực hiện các truy vấn hiệu quả hơn so với hoạt động tải thực đang thực hiện trên server. Nếu bạn không biết công cụ và tiện ích nào có thể dùng trong CSDL nào và chúng có thể giúp gì cho bạn, hãy đọc thêm nhiều về chúng. Đừng cho rằng mọi thứ “là cái đinh” chỉ vì bạn có trong tay một cái búa lớn CSDL ngày nay có xu hướng đưa tất cả dữ liệu lưu trữ vào một ứng dụng. Nhiều ứng dụng đã từng được thử nghiệm xây dựng toàn bộ giao diện người dùng theo hướng siêu dữ liệu. Sau đó lưu trữ siêu dữ liệu với các tham chiếu người dùng trong cùng một Database chứa dữ liệu doanh nghiệp. Đây là một cách tốt để phức tạp hoá đời sống và kỹ năng thực thi. Một số dữ liệu thực sự thuộc về các file cục bộ, không phải nằm trên CSDL client-server qua mạng. Khi lưu trữ dữ liệu, bạn cần đánh giá các vị trí khác nhau có thể đặt chúng (Database, registry, file văn bản thuần tuý, file XML, …) và chọn nơi phù hợp cho từng phần dữ liệu. Đừng đưa nó vào CSDL một cách tự động chỉ vì bạn có trong tay xâu kết nối. Ngày nay, xu hướng sử dụng file XML xuất hiện nhiều hơn là CSDL quan hệ, nhưng nguyên tắc cơ bản thì vẫn vậy.

Sử dụng và quản lý Database Mail

SQL Server 2005 có một hệ thống mail nhỏ được gọi là Database Mail. Database Mail là một tính năng được cải thiện trong SQL Mail so với các phiên bản trước đó của SQL Server. Với tính năng này bạn có thể thiết lập nhiều tài khoản cũng như hồ sơ để hỗ trợ những vấn đề về email. Database Mail là gì?

Database Mail là một hệ thống hàng đợi của mail. Các email message được lưu trong một hàng đợi bên trong cơ sở dữ liệu để được xử lý. Khi một email message được đưa vào trong hàng đợi, một quá trình mở sẽ được kích hoạt để gửi email messages trong hàng đợi đến mail server thích hợp. Khi email đã được gửi thì một email message có trạng thái của phân phối sẽ được gửi trở lại cho SQL Server.

Kích hoạt Database Mail

Database Mail không ở trạng thái có sẵn khi cài đặt. Từ mô hình bảo mật của SQL Server có một số thứ bị tắt mặc định, bạn cần phải kích hoạt Database Mail nếu muốn sử dụng nó. Bạn có thể sử dụng công cụ cấu hình Surface Area Configuration hoặc T-SQL Server dưới đây để kích hoạt Database Mail:

sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Database Mail XPs', 1;
GO
RECONFIGURE
GO

Thiết lập tài khoản

Một tài khoản Database Mail cho biết SQL Server 2005 phải truyền thông như thế nào với máy chủ SMTP. Tài khoản chỉ rõ email được định dạng và được gửi như thế nào. Một tài khoản sẽ nhận dạng một máy chủ SMTP và phương pháp thẩm định. Tài khoản được sử dụng cho Database Mail không tương ứng với tài khoản đăng nhập của SQL Server.

Khi thiết lập một tài khoản, bạn cần phải chỉ ra đủ thông tin để SQL Server 2005 có thể truyền thông với máy chủ SMTP và thẩm định lại nó nếu cần thiết. Tham khảo các nguồn dữ liệu có online để có danh sách đầy đủ về các tùy chọn trong việc định nghĩa một tài khoản. Bạn có thể thiết lập một tài khoản bằng sử dụng Database Mail Configuration Wizard, chức năng này có thể được tìm thấy ở dưới “Database Mail” trong thư mục “Management” bên trong SQL Server Management Studio, hoặc bằng sử dụng thủ tục được lưu (SP) “sysmail_add_account_sp”. Đây là một đoạn mã sử dụng phương pháp SP ở trên để tạo một tài khoản cho phép truyền thông với một máy chủ SMTP không yêu cầu sự thẩm định:

EXECUTE msdb.dbo.sysmail_add_account_sp
@account_name = 'Database Administration Account',
@description = 'Mail account for used by DBA staff',
@email_address = 'ProdServer01@domainname.com',
@display_name = 'ProdServer01 DBA Mail',
@replyto_address = 'Greg.Larsen@domainname.com',
@mailserver_name = 'mailserver.domainname.com';
Tài khoản này có tên là “Database Administration Account”, và có địa chỉ email là ProdServer01@domainname.com. Một trong những ưu điểm của việc sử dụng Database Mail là địa chỉ email này không nhất thiết phải là một tài khoản email hợp lệ trong hệ thống mail. Thêm vào đó, bạn lại có thể kết hợp một địa chỉ “reply to” với một tài khoản mail cơ sở dữ liệu của bạn. trong ví dụ của tôi ở trên, tôi đã định nghĩa Greg.Larsen@domainname.com là @replyto_address. Vì vậy khi một ai đó nhận đươc một email từ bất kỳ các quá trình thông báo email tự động nào của tôi họ sẽ có thể trả lời nó và email có thể được gửi trực tiếp đến tôi.

Với Database Mail, bạn có thể thiết lập nhiều tài khoản email nếu muốn. Trong phần dưới đây tôi sẽ giới thiệu một số lý do tại sao bạn lại có thể thiết lập được nhiều tài khoản Database Mail như vậy.

Thiết lập hồ sơ và liên kết nó với các tài khoản

Trước khi gửi một Database Mail đến máy chủ SMTP đã được phân biệt trong một tài khoản, bạn cần phải kết hợp tài khoản với một hồ sơ (profile) và cho phép truy cập đến profile. Database Mail profile được sử dụng để cải thiện bảo mật mail. Có hai loại profile: public và private. Public profile luôn được áp dụng cho bất cứ ai được phép truy cập đến cơ sở dữ liệu msdb và là một thành viên của DatabaseMailUserRole trong cơ sở dữ liệu msdb. Trong khi đó private profile chỉ có thể được sử dụng cho những người dùng đặc biệt được phép truy cập vào private profile. Một mail profile có thể được kết hợp với một hay nhiều tài khoản khác. Bạn có thể quản lý các profile bằng Database Mail Configuration Wizard, hoặc sử dụng lệnh T-SQL Server giống như thiết lập cho một mail profile dưới đây:

-- Create a Database Mail profile
EXECUTE msdb.dbo.sysmail_add_profile_sp
@profile_name = 'Database Administration Profile',
@description = 'Mail Profile for use by DBA processes';

Ở đây tôi đã tạo một profile có tên là “Database Administration Profile”. Có một profile đã tạo không có nghĩa là bạn có thể sử dụng profile này để gửi email. Bạn vẫn cần phải kết hợp nó với ít nhật một tài khoản Database Mail và một người dùng bên trong dữ liệu msdb. Để thực hiện điều đó tôi có thể chạy hai lệnh dưới đây:

-- Add the account to the profile
EXECUTE msdb.dbo.sysmail_add_profileaccount_sp
@profile_name = 'Database Administration Profile',
@account_name = 'Database Administration Account',
@sequence_number =1 ;
-- Grant access to the profile
EXECUTE msdb.dbo.sysmail_add_principalprofile_sp
@profile_name = 'Database Administration Profile',
@principal_name = 'ProdServer01',

Câu lệnh EXECUTE đầu tiên sẽ kết hợp profile của tôi với một tài khoản. Câu lệnh thứ hai sẽ kết hợp profile với cơ sở dữ liệu msdb người dùng ‘ProdServer01’. Những người dùng này cần phải được cho phép là thành viên trong DatabaseMailUserRole trước khi họ có thể gửi mail. Khi tôi kết hợp profile này với một người dùng đặc biệt, thì profile này được hiểu như một private profile. Để tạo một public profile bạn cần phải kết hợp một profile với một “public” database role.

Gửi Database Mail

SQL Server cung cấp SP “sp_send_dbmail” để gửi mail. Cú pháp dưới đây được sử dụng để gọi SP này:

sp_send_dbmail [ [ @profile_name = ] 'profile_name' ]
[ , [ @recipients = ] 'recipients [ ; ...n ]' ]
[ , [ @copy_recipients = ] 'copy_recipient [ ; ...n ]' ]
[ , [ @blind_copy_recipients = ] 'blind_copy_recipient [ ; ...n ]' ]
[ , [ @subject = ] 'subject' ]
[ , [ @body = ] 'body' ]
[ , [ @body_format = ] 'body_format' ]
[ , [ @importance = ] 'importance' ]
[ , [ @sensitivity = ] 'sensitivity' ]
[ , [ @file_attachments = ] 'attachment [ ; ...n ]' ]
[ , [ @query = ] 'query' ]
[ , [ @execute_query_database = ] 'execute_query_database' ]
[ , [ @attach_query_result_as_file = ] attach_query_result_as_file ]
[ , [ @query_attachment_filename = ] query_attachment_filename ]
[ , [ @query_result_header = ] query_result_header ]
[ , [ @query_result_width = ] query_result_width ]
[ , [ @query_result_separator = ] 'query_result_separator' ]
[ , [ @exclude_query_output = ] exclude_query_output ]
[ , [ @append_query_error = ] append_query_error ]
[ , [ @query_no_truncate = ] query_no_truncate ]
[ , [ @mailitem_id = ] mailitem_id ] [ OUTPUT ]

Như những gì bạn nhìn thấy, SP này hỗ trợ một số các tham số khác nhau. Thông tin về mỗi tham số này bạn có thể tham khảo trong các sách online.

Dưới đây là một ví dụ nói về tôi sẽ sử dụng private profile đã được tạo ở trên để gửi một email message đơn giản như thế nào không quan tâm đến quá trình đánh chỉ số lại cơ sở dữ liệu tự động.

EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'Database Administration Profile',
@recipients = 'greg.larsen@databasejournal.com',
@body = 'Reindex database process completed successfully',
@subject = 'Reindex Database' ;

Database Mail xử lý hết một hàng đợi khi chạy lệnh trên thì tôi sẽ có một thông báo được gửi phản hồi nói rằng mail được đưa vào hàng đợi “Mail queued”. Khi bạn thực thi sp_send_dbmail SP thì mail không được gửi đi ngay lập tức mà thay vì đó nó được lưu trong hàng đợi mail bên trong cơ sở dữ liệu msdb. SP này kích hoạt một quá trình mail mở rộng (DatabaseMail90.exe) để chạy. Thực thi này đọc mail trong hàng đợi và gửi nó đến mail server thích hợp.

Các trường hợp khác nhau trong sử dụng tài khoản và hồ sơ

Có một số cách khác nhau trong việc sử dụng những ưu điểm của đa tài khoản và profile được Database Mail cho phép bạn thực hiện với chúng.

Một trong những ưu điểm quan sát thấy của tính năng đa tài khoản đó là cấu hình profile Database Mail của bạn có thể cho phép khả năng chuyển đổi dự phòng khi một trong những máy chủ SMTP gặp các vấn đề trục trặc. Khi bổ sung vào các tài khoản cho một profile Database Mail bạn có thể cung cấp cho chúng một chuỗi số sequence_number. Khi gửi một email message mới, Database Mail cố gắng gửi nó bằng cách sử dụng số chuỗi thấp nhất trước. Nếu quá trình gửi đó bị hỏng thì Database Mail sẽ sử dụng chuỗi số cao hơn tiếp theo. Database Mail sẽ liên tục thực hiện công việc này cho đến khi mail được gửi thành công hoặc tất cả các tài khoản đã đều được thử.

Một tùy chọn khác trong việc sử dụng này là hỗ trợ cho mail message phân phát đến các địa chỉ email khác nhau. Nếu bạn có nhiều ứng dụng cần phải gửi email, mỗi ứng dụng có một địa chỉ email riêng của nó. Việc làm này sẽ giúp người nhận email tự đông phân biệt được quá trình đã gửi là quá trình gì bằng việc xem địa chỉ email.

Ngoài ra, nếu bạn sử dụng các private profile thì bạn có thể kết hợp các profile này với các chính sách bảo mật khác. Bằng cách đó sẽ cho phép bạn kiểm soát được private profile, người dùng msdb sẽ được phép sử dụng một profile Database Mail riêng biệt.

Kiểm tra Database Mail

SQL Server cung cấp 6 cửa sổ hệ thống khác nhau trong cơ sở dữ liệu msdb cho việc kiểm tra thông tin Database Mail. Các cửa sổ này có thể được sử dụgn để lấy lại thông tin trong cơ sở dữ liệu msdb có cho biết đến cả trạng thái của tất cả Database Mail hoặc chỉ những email message cụ thể. Các cửa sổ này rất hữu dụng trong việc phân biệt mail nào đã được xử lý cũng như lý do tại sao mail message có thể không được phân phối đến mail server yêu cầu. Chúng là các công cụ lý tưởng cho phép bạn có thể kiểm tra và khắc phục một số các vấn đề Database Mail. Để có thêm thông tin chi tiết về các cửa sổ này, bạn có thể tìm hiểu thêm trong các sách online.

sysmail_allitems – cửa sổ này cho phép bạn trả về một tập bản ghi, gồm có một hàng cho mỗi email message được xử lý bằng Database Mail.

sysmail_event_log – Cửa sổ này cho phép bạn trả về một hàng cho mỗi một thông báo lỗi của Windows hoặc SQL Server khi Database Mail xử lý một email message.

sysmail_faileditems – Cửa sổ này trả về một bản ghi cho mỗi một email message có một trạng thái nào đó hoặc bị thất bại.

sysmail_mailattachments – Cửa sổ này gồm một hàng cho mỗi một đính kèm đã gửi

sysmail_sentitems – Cửa sổ này gồm có một bản ghi cho mỗi một email đã được gửi thành công

sysmail_unsentitems – Cửa sổ này gồm có một bản ghi cho mỗi email hiện đang có trong hàng đợi để được gửi hoặc trong quá trình đang gửi.

Duy trì các thông báo trong MSDB Database

Tất cả các email message được lưu trong cơ sở dữ liệu msdb, bạn phải xem xét xem quản lý các thông tin này như thế nào. Phụ thuộc vào các chính sách ghi nhớ email, bạn cần thiết lập một thói quen để làm sạch có chu kỳ đối với các email message không cần thiết nữa. SQL Server 2005 cung cấp hai thủ tục lưu khác nhau để gỡ các bản ghi mail từ cơ sở dữ liệu msdb.

sysmail_delete_mailitems_sp – SP này xóa thường xuyên các email message có trong msdb trong bảng Database Mail.

sysmail_delete_log_sp – SP này xóa các thông báo bản ghi Database Mail.

Bạn có thể xem sách online để có thêm thông tin chi tiết về SP.

T-SQL Server dưới đây sẽ xóa mail đã được gửi cách đấy một tháng:

DECLARE @delete_date datetime
SET @delete_date = dateadd(MM,-1,getdate())
EXECUTE msdb.dbo.sysmail_delete_mailitems_sp @sent_before=@delete_date

Kết luận

Database Mail SQL Server 2005 là một sự cải thiện lớn trong SQL Mail so với các phiên bản trước đây của SQL Server. Database Mail cung cấp một hệ thống mail với rất nhiều tính năng để bảo vệ và quản lý tốt hơn các mail đang gửi bằng sử dụng T-SQL. Với Database Mail trong SQL Server 2005, bạn không cần phải xây dựng một lời giải cho một giải pháp sử dụng CDOSYS để gửi email. Nếu bạn đang tìm cách để hỗ trợ email từ T-SQL, hãy xem xét đến những tính năng của Database Mail.

Doi moi quan ly theo qui trinh

Quản lý (QL) từ xưa tới nay vẫn là nhiệm vụ trung tâm của mọi tổ chức. Với thời gian, các công cụ công nghệ và phương pháp luận mới do con người nghiên cứu, phát triển đã giúp cho việc QL các tổ chức lớn ngày một hữu hiệu hơn. Từ chỗ phụ thuộc vào tài năng bẩm sinh của con người thành các quy trình (QT) khoa học công nghệ (KHCN) không phụ thuộc vào người thực hiện

QL cổ điển dựa trên con người

QL cổ điển lấy con người làm trung tâm cho nên phụ thuộc rất nhiều vào tài năng và nghệ thuật của người lãnh đạo. Con người trong QL cổ điển là nhân tố tổng hợp của các yếu tố: cảm nhận thực tế, hình thành QT, xây dựng chuẩn mực và kỷ luật tuân thủ. Thường người ta thấy ở những tổ chức cổ điển thành công phải có những con người biết nhận định chính xác tình hình, biết lập ra QT phối hợp mọi người làm việc, biết lập ra các chuẩn mực đo chính xác hiệu quả công việc, và biết tuân thủ nghiêm ngặt các QT và chuẩn mực đó. Không phải tất cả mọi người đều có thể hội tụ được những khả năng này, đặc biệt là khả năng nhận định chính xác tình hình và lập ra QT giải quyết vấn đề.

Trong QL cổ điển, đặc biệt là ở phương Đông, việc tuyển chọn nhân tài trở thành điều kiện thiết yếu và đầu tiên cho QL thành công. Từ đó xuất hiện quan niệm "hiền tài là nguyên khí quốc gia" và quan điểm lấy người tài làm trung tâm này được đẩy lên quá mức. Ngày nay, quan điểm này đã chuyển dịch: chọn người tâm phúc và tin cậy để đặt vào các vị trí chủ chốt, bỏ qua yếu tố xem xét tình huống để lập QT cho sát các nghiệp vụ.

Ví dụ điển hình về QL cổ điển là việc Khổng Minh bầy binh bố trận trong cuộc chiến Xích Bích với Tào Tháo. Khổng Minh, một nhà lãnh đạo và QL giỏi, đã hình dung ra QT trận đánh, bố trí các tướng lĩnh trấn giữ những điểm chốt sẽ xảy ra chiến trận, và trao cho mỗi người một “túi gấm” mô tả QT xử lý cho các tình huống cùng các tiêu chuẩn thành công. Đòi hỏi căn bản với các tướng lĩnh là phải tuân thủ nghiêm ngặt những QT đã được thiết lập. Không có mấy ai trong lịch sử có được khả năng lập ra QT hoàn hảo sát với thực tế như vậy.

Người QL như vậy thực sự là người lao động trí tuệ cao, chuyển những nhận biết của mình thành các tài liệu mô tả mục đích cần đạt tới, cách thực hiện công việc, cách kiểm soát công việc theo mục đích và sử dụng sức mạnh tuân thủ của tổ chức để làm cho ý tưởng trở thành hiện thực. Thiếu những lao động trí tuệ này, thực tế người ta sẽ không thể điều khiển được hệ thống phức tạp đang diễn ra.






QL hiện đại trên nền công nghệ

Ngày nay, các cơ quan và tổ chức đều có mức độ QL phức tạp vượt ra ngoài khả năng bao quát của con người bình thường. Do đó các tổ chức này đều có nhu cầu tìm kiếm những người có khả năng QL giỏi. Nhưng hiển nhiên không thể có nhiều người QL giỏi bẩm sinh như kiểu Khổng Minh được.

Với sự phát triển của KHCN, vấn đề QL đã thay đổi từ chỗ phụ thuộc vào tài năng bẩm sinh của con người thành các QT KHCN không phụ thuộc vào người thực hiện. Vì vậy, QL hiện đại ngày nay nhấn mạnh vào việc xây dựng các QT nghiệp vụ và sự tuân thủ QT, thay vì nhấn mạnh vào tài năng cá nhân và sự tuân thủ cá nhân.

QL hiện đại quan niệm cần trích rút ra các loại hình thông tin trong thao tác của những người QL giỏi, để lập thành các tri thức của tổ chức và từ đó xác định ra cách vận hành của tổ chức mà không bị lệ thuộc vào cá nhân người thực hiện. Việc trích rút ra tri thức của tổ chức là điều rất quan trọng và thiết yếu cho mọi tổ chức hiện đại thích nghi với môi trường biến động nhanh ngày nay, vì các tri thức tổ chức làm việc phải thường xuyên thay đổi.

QL hiện đại không những thế còn đưa các yếu tố công nghệ mới vào làm nền tảng cho việc QL các tri thức của tổ chức. Điều đó có nghĩa là tất cả các cách tổ chức QT làm việc, các chuẩn mực công việc, các kiểm tra tuân thủ công việc đều phải được thực hiện trên nền công nghệ, trên các hệ thống mạng máy tính. Đây là chỗ để cho các công cụ trợ giúp QL đi vào thực tế một cách không thể đảo ngược được.

QL hiện đại xem xét việc phân chia hoạt động của người QL giỏi thành nhiều nhiệm vụ độc lập nhau, có thể trao cho từng nhóm chuyên gia thực hiện. Toàn tổ chức là bộ máy xâu chuỗi công việc của các nhóm chuyên gia để thực hiện mục tiêu.





Các nguyên tắc của QL hiện đại

Bên cạnh những yếu tố trực cảm, quyết đoán của người quản lý, các yếu tố KHCN của QL cần được nhận diện và thực thi để làm cho tổ chức phát triển vững chắc. Xuất phát từ những đặc trưng chính của người QL các tổ chức, bên ngoài yếu tố sáng tạo của con người, các yếu tố sau đây cần được thiết lập dựa trên các nguyên tắc KHCN:

1. Xây dựng và hoàn chỉnh QT làm việc

2. Xây dựng và hoàn chỉnh các tiêu chuẩn cho sản phẩm và dịch vụ

3. Xây dựng và hoàn chỉnh QT đảm bảo chất lượng

4. Xây dựng và phát triển ý thức tuân thủ QT và chuẩn

QT làm việc là dãy các hoạt động phối hợp công việc của nhiều chuyên gia, nhiều nhóm công tác để đạt tới mục tiêu của tổ chức. QT này phải do chuyên gia trong các lĩnh vực xây dựng nên và cần phải được làm tài liệu cẩn thận để cho những người kế tục có thể hiểu, thực hiện và cải tiến chúng. QT này không phụ thuộc vào người tham gia thực hiện miễn là họ đáp ứng đủ yêu cầu kỹ năng nào đó.

GIỚI THIỆU VỀ TÁC GIẢ

Ông Ngô Trung Việt đã từng là thành viên và cố vấn của nhiều dự án phát triển CNTT của Chính Phủ. Hiện ông là chuyên gia phân tích qui trình nghiệp vụ và giảng viên cao cấp cho tập đoàn Công Nghệ DTT, đồng thời tham gia vào các dự án phát triển kiến trúc công ty và triển khai quản lí theo qui trình, đặc biệt với sản phẩm ChangeDriver.
E-mail: vietnt@dttvietnam.com

Các sản phẩm của từng công đoạn QT cần phải đáp ứng các tiêu chuẩn chất lượng do các nhóm chuyên môn theo dõi, kiểm nghiệm tuân thủ đúng các chuẩn đã quy định. Toàn tổ chức tham gia vào việc đảm bảo chất lượng cho sản phẩm và dịch vụ được thực hiện.

Việc theo dõi các QT trong sự vận hành của nó cần được làm tài liệu chu đáo, để thông qua đó người QL có thể nắm sát diễn biến của thực tế, đo lường được mức độ cũng như chất lượng công việc thực hiện.

Tất cả những tài liệu này tạo nên tri thức của tổ chức trong việc QL vận hành thường xuyên, theo thuật ngữ chuyên môn của tổ chức đó chính là 'kí ức của tổ chức'. Khi chưa có đủ các tài liệu này, công tác QL không thể thực hiện một cách hữu hiệu. Khi thay đổi nhân sự, tổ chức sẽ có nguy cơ hoạt động mất ổn định, các QT có thể bị thay đổi một cách tuỳ tiện theo ý người lãnh đạo mới. Đây là điều rất thường xảy ra ở Việt Nam vì hầu hết các cơ quan đều chưa có hệ thống tri thức tổ chức được ghi lại trong kí ức tổ chức.

Vì vậy, điều quan trọng cho các tổ chức là cần coi các QT hoạt động của mình như bộ khung pháp lý mà mọi người đều phải tuân thủ. Để cho công tác lãnh đạo và QL các tổ chức mang tính khoa học khách quan, các tổ chức dần phải phát triển các bộ phận xây dựng QT, thực hiện QT và tư vấn-kiểm tra QT, một hình thái cụ thể của quan niệm tam quyền phân lập trong nhà nước pháp quyền: lập pháp, hành pháp, tư pháp.

Trong QL hiện đại, ba khái niệm về QT này được tách ra độc lập nhau và có thể trao cho các nhóm người khác nhau trong tổ chức phụ trách. Nhưng vấn đề là, các tổ chức ngày càng phức tạp, dù có các nhóm chuyên môn hoá, cũng không thể bao quát hết nếu chỉ dựa vào đầu óc của từng cá nhân. Công nghệ và máy móc cùng phương pháp làm việc mới trở thành quan trọng để hỗ trợ hữu hiệu cho con người trong công tác QL tổ chức phức tạp. Do đó việc tăng cường sử dụng các công cụ xử lý thông tin trong QL theo QT là một yêu cầu tất yếu.

An toan cho ung dung web

Bên cạnh giải pháp (GP) sửa lỗi bảo mật trong mã nguồn, thị trường hiện còn có nhiều GP sử dụng các thiết bị bảo vệ lớp mạng, lớp ứng dụng (ƯD) để web được an toàn.

Thiết bị bảo vệ lớp mạng

GP này được hầu hết tổ chức, doanh nghiệp Việt Nam ứng dụng:dùng thiết bị có chức năng tường lửa (firewall), phòng chống xâm nhập (IPS) đặt tại cửa ngõ hệ thống mạng.

Khi gói tin đi qua, thiết bị an ninh lớp mạng sẽ kiểm tra sự hợp lệ của địa chỉ nguồn, địa chỉ đích, các cổng (port) của gói tin (đối với firewall), các kiểu tấn công xâm nhập mạng đã biết trước và nếu các thông số này hợp lệ sẽ cho qua. Như hình trên, thiết bị an ninh mạng thông thường chỉ có khả năng bảo vệ kiểu tấn công mạng, không có khả năng bảo vệ sự tấn công khai thác các điểm yếu của ƯD. Như vậy thiết bị bảo mật chuyên dụng cho ƯD web sẽ bổ sung một lớp bảo mật trong hệ thống.

Các ứng dụng web chứa nhiều thông tin quan trọng. Lớp ứng dụng web nếu bị tấn công sẽ gây ảnh hưởng đối với thông tin:
- Bị đánh cắp các thông tin nhận dạng về khách hàng, về thẻ thanh toán
- Thay đổi dữ liệu, lộ dữ liệu
- Thay đổi website làm xấu hình ảnh công ty

GP này sẽ ngăn chặn các kiểu tấn công lớp mạng: tấn công từ chối dịch vụ, tấn công phá gói tin... Tuy nhiên, để cho phép ƯD web chạy, bắt buộc thiết bị an ninh phải mở hai cổng 80 (http) và 443 (https) và đó là nguyên nhân khiến GP này không thể bảo vệ trước các tấn công lớp ƯD.

Ngoài ra, tường lửa ở lớp mạng không "đọc" được các dữ liệu đã mã hóa như SSL và IPSEC. Hacker lợi dụng điểm này thông qua các kết nối mã hóa để dễ dàng vượt qua các firewall.

Hiện nay, nhiều kỹ thuật tấn công ƯD mới và tinh vi có khả năng vượt qua các thiết bị an ninh lớp mạng, tấn công lên lớp ƯD. Như vậy GP này sẽ chỉ có khả năng bảo vệ các ƯD web khỏi sự tấn công từ lớp mạng, chưa có khả năng chống lại các tấn công lớp ƯD như: SQL Injection, Parameter Tampering, Buffer overflow (tràn bộ đệm), đánh cắp phiên, tiêm nhiễm các cookie, đánh lừa ... Kiểu tấn công lớp ƯD hoàn toàn có khả năng xâm nhập vào tận ƯD, cơ sở dữ liệu.

Thiết bị bảo vệ lớp ƯD web

Firewall ƯD web không cho phép truyền dữ liệu trực tiếp giữa 2 mạng, gói tin nào đi qua đều phải qua nó để kiểm tra nội dung. Nếu nội dung không chứa mã nguồn độc hại nó sẽ cho phép đi qua. Ngoài ra firewall ứng dung web còn cho phép ghi nhật ký các cuộc kết nối truyền dữ liệu để dễ dàng thực hiện kiểm tra sau này.

Firewall ƯD web cho phép bảo vệ toàn diện các tài nguyên web, kiểm soát sự truy cập, ngăn chặn các dạng tấn công tại lớp ƯD như: SQL Injection, Cross site scripting, Virus & Web worm, Cookie Poisoning & theft, SQL Slammer, Site defacing.

Nếu kết hợp hai GP nói trên sẽ ngăn chặn hầu hết các cuộc tấn công vào hệ thống ƯD web, đảm bảo cho giao dịch diện tử.

GP kết hợp

Trên thị trường hiện có GP toàn diện bảo vệ ƯD web ngay tại hai lớp mạng và ƯD của một số hãng như Net Continuum, F5 và Blue Coat. Trong đó, GP TrafficShield của hãng F5 nổi trội hơn nhờ công nghệ Application Flow Model (ƯD theo luồng).

Trafficshield dựa theo mô hình bảo mật chắc chắn (Positive Security Model), tức là từ chối tất cả dịch vụ trừ những dịch vụ được phép (deny all unless allowed). Nhờ vậy, GP này tự động bảo vệ ƯD web với tất cả các kiểu tấn công ƯD như SQL injection, SQL Slammer, Site Defacing. Nó tự động tạo tiến trình cho tất cả hoạt động tương tác hợp pháp của người dùng với ƯD, hay nói nôm na là nó tự động "học" xem các ƯD web hoạt động thế nào (Application Flow Model), từ đó đưa ra tiến trình, mức độ bảo mật hợp lý để áp dụng.

Sau khi TrafficShield "học" xong thì luồng ƯD "lạ” bị coi là không hợp lệ ngay lập tức sẽ bị ngăn chặn.

TrafficShield còn có chế độ Active block mode - không cho phép người phát triển ƯD thêm các thành phần chức năng mới có thể gây ra lỗ hổng vào ƯD. Điều này ngăn chặn lập trình viên có ý đồ xấu nhúng mã độc hại vào ƯD hoặc hacker xâm nhập.

Một số tổ chức như FPT, bộ Tài Chính, Hanoi Telecom, Vegasoft, Phú Nhuận Jewellery đã chọn sử dụng GP này của F5.

Chủ Nhật, 16 tháng 9, 2007

Danh Gia Website

Đánh giá website


Khách hàng là người quyết định - điều này cũng đúng trong thế giới web. Số lượng khách truy cập website, số trang khách xem, thời gian khách dừng chân... quyết định thứ hạng và giá trị của website.

Thế giới web ngày càng nhộn nhịp, thu hút không chỉ người dùng cá nhân mà cả doanh nghiệp. Ngày càng có nhiều công ty lập website, kinh doanh và quảng cáo trên web. Tuy theo đuổi những mục tiêu khác nhau nhưng hầu hết các công ty đều cần đo lường hiệu quả công sức và tiền của mà họ đã đầu tư trên web.

Câu nói “khách hàng luôn đúng” lại vẫn đúng! Website có nội dung hấp dẫn, sẽ có nhiều khách truy cập; nội dung website được cập nhật, khách sẽ đến thường xuyên. Những “số đo” về khách truy cập website có thể trả lời cho các câu hỏi như: “mức độ thu hút của website?”, “hiệu quả của chiến dịch tiếp thị?”, “sự trung thành của khách hàng?”, “phân khúc khách hàng quan trọng?”... những số liệu này giúp các chủ website hiểu được khách hàng của mình tốt hơn và có thể đưa ra những chiến lược thích hợp đem lại sự hài lòng cho khách hàng và lợi nhuận cho website.

Các chỉ số


Hình 1. Chỉ số pageview và visitor có thể được dùng để xếp hạng website

Khi nói đến mức độ thu hút của website, người ta thường trưng ra số “hit” – số lượt truy cập. Không có gì lạ vì đây là chỉ số có thể gây ấn tượng nhờ trị số lớn.

Hit thường được đếm khi có một thành phần dữ liệu (file) được truy xuất từ máy chủ web (web server). Một trang web có thể gồm nhiều thành phần như CSS, JavaScript, hình,... Khi trình duyệt của người dùng mở một trang web, nó sẽ yêu cầu tất cả thành phần này từ web server, mỗi yêu cầu có thể được đếm như 1 hit. Nếu thiết kế “khéo”, một trang web có thể tạo nên hàng chục hit mỗi lần được truy cập.

Số hit thường do các website tự đếm và không có dịch vụ độc lập kiểm chứng, nó hay được nói quá lên và cũng rất dễ dùng kỹ thuật lập trình tạo ra số hit tăng phi mã. Do tình trạng lạm phát, hit đã bị mất giá và giờ đây không còn được xem là thước đo chính cho website.

Tương tự hit, số trang xem - “pageview” - cũng được đếm khi có yêu cầu truy xuất file từ web server nhưng chỉ đếm cho trang chính (file .htm, .asp, .php...), không tính các thành phần trong trang. Nhiều website hiện nay đã áp dụng cách đếm “trung thực” này tuy vẫn dùng tên “hit”, khi này số hit chính là số pageview. Số pageview có ý nghĩa không chỉ vì nó cho biết số trang “thật” được xem mà còn cho biết số quảng cáo được hiển thị cùng với trang (quảng cáo có thể được bán theo phương thức CPM – Cost Per iMpression, tính cho mỗi 1000 trang xem).

Hiện được xem là 1 trong 2 “thước do” chính của website (Hình 1), tuy nhiên chỉ số pageview có nguy cơ bị thất sủng do những kỹ thuật mới như Ajax, RSS, mashup... và sự phát triển của video trên web. Những kỹ thuật mới như Ajax đem đến cho người dùng thông tin nhanh hơn, nhiều hơn, tiện lợi hơn và ít phải nạp trang web hơn, do vậy giảm số pageview. Pageview càng bị thất thu với video - với những website như YouTube người ta có thể xem cả thước phim (có thể xen kẽ hàng chục cảnh quảng cáo) chỉ với 1 trang xem.


Hình 2. Chỉ số thời gian cho biết “sức hút” của trang đối với những đối tượng khách khác nhau.

Chỉ số thứ 2 hiện được trọng dụng là số khách truy cập (“visitor” hay “unique visitor”). Khách truy cập website được xác định dựa trên thông tin nhận dạng thường là địa chỉ IP hay dữ liệu cookie “không trùng” trong khoảng thời gian quy định (chẳng hạn 12 giờ hay 24 giờ). Trong thời gian này, mỗi khách chỉ được đếm 1 lần dù truy cập website nhiều lần (và tạo nên nhiều hit). Chỉ số này rất có ý nghĩa đối với các báo điện tử và công ty quảng cáo. Rõ ràng, nhiều người xem quan trọng hơn là chỉ một nhóm người xem đi xem lại nhiều lần.

Tuy nhiên, số đo “unique visitor” không phải lúc nào cũng phản ánh đúng số khách “không trùng” truy cập website. Hàng chục hay hàng trăm người dùng trong một mạng nội bộ (LAN) có thể giao tiếp với thế giới bên ngoài chỉ qua một địa chỉ IP (thông qua firewall hay proxy server) và do vậy chỉ được đếm như một visitor. Một số nhà cung cấp dịch vụ Internet có thể sử dụng DHCP (Dynamic Host Configuration Protocol) sinh ra địa chỉ IP khác nhau cho mỗi file được yêu cầu, trong trường hợp này thì một khách truy cập lại được đếm như nhiều visitor. Rất may là những trường hợp này không phổ biến.

Cùng với số visitor, thời gian mà khách lưu lại website cũng là số đo quan trọng, đánh giá sự quan tâm của khách (Hình 2). Dù nhắm đến mục tiêu gì thì trước hết website cần phải có được sự quan tâm của khách. Số trang xem hay số visitor dù có lớn đến mấy đi nữa cũng sẽ mất ý nghĩa khi mà khách đến rồi đi ngay, không hề dành thời gian xem nội dung và quảng cáo. (Xem phần “Click hay không click?”).

Chỉ số thời gian cùng với các chỉ số đánh giá sự tương tác của khách với website như tỉ lệ khách thực hiện giao dịch (ví dụ mua hàng trực tuyến) hay tỉ lệ khách quay lại so với khách mới... không chỉ đánh giá số lượng mà cả chất lượng khách truy cập.

Các chỉ số về chất lượng ngày càng được quan tâm. Trong môi trường Internet ngày càng cạnh tranh, người ta càng phải chú trọng vào thị trường hẹp hơn và càng cần khách chất lượng hơn có tiềm năng trở thành khách hàng thật sự (thực hiện giao dịch).

Thứ Năm, 13 tháng 9, 2007

Convert INI file to XML

private string GetConfigValue( XmlDocument xmlDoc, string sectionName, 
string settingName )
{
string valueRet;

// get setting node
string xpath =
String.Format( "//section[@name='{0}']/setting[@name='{1}']",
sectionName, settingName );
XmlNode node = xmlDoc.DocumentElement.SelectSingleNode( xpath );

// display value
if ( node == null )
{
throw new Exception(
String.Format(
"No such setting, using the following xpath:{0}{1}",
Environment.NewLine, xpath ) );
}
else
{
XmlAttribute xmlAttr = node.Attributes["value"];
if ( xmlAttr == null )
{
throw new Exception( String.Format(
"No value for this setting, using the following xpath:{0}{1}",
Environment.NewLine, xpath ) );
}
else
{
valueRet = xmlAttr.Value;
}
}

return valueRet;
}

// Load configuration from xml file
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load( "C:\\WINNT\\iexplore.xml" );
string homePage = GetConfigValue( xmlDoc, "main", "Home Page" );
string searchPage = GetConfigValue( xmlDoc, "main", "Search Page" );

Generate PDB files in C#

class PDBHeader
{
#region Declarations
char[] databaseName={'\0','\0','\0','\0','\0','\0','\0',
'\0','\0','\0','\0','\0','\0','\0','\0',
'\0','\0','\0','\0','\0','\0','\0','\0',
'\0','\0','\0','\0','\0','\0','\0',
'\0','\0'}; // 32 Bytes

UInt16 fileAttributes = 0X0008; // 2 Bytes
UInt16 version = 0X0000; // 2 Bytes
UInt32 creationDate; // 4 Bytes
UInt32 modificationDate; // 4 Bytes
UInt32 lastBackupDate; // 4 Bytes
UInt32 modification=0X0000; // 4 Bytes
UInt32 appInfoArea=0X0000; // 4 Bytes
UInt32 sortInfoArea=0X0000; // 4 Bytes
char[] type={'d','a','t','a'}; // 4 Bytes
char[] creatorID; // 4 Bytes
UInt32 uniqueID=0X0000; // 4 Bytes
UInt32 nextRecord=0X0000; // 4 Bytes
UInt16 numRecords; // 2 Bytes
#endregion

#region Properties
public UInt16 NumRecords
{
set
{
numRecords=value;
}
get
{
return numRecords;
}
}
public DateTime CreationDate
{
set
{
TimeSpan ts=DateTime.Now-value;
creationDate=(UInt32)ts.TotalSeconds;
}
}
public DateTime ModificationDate
{
set
{
TimeSpan ts=DateTime.Now-value;
modificationDate=(UInt32)ts.TotalSeconds;
}
}
public DateTime LastBackupDate
{
set
{
TimeSpan ts=DateTime.Now-value;
lastBackupDate=(UInt32)ts.TotalSeconds;
}
}

public string CreatorID
{
set
{
if (value.Length==4)
{
creatorID=value.ToCharArray();
}
else
{
throw new PDBException("Creator ID" +
" is invalid (must be 4 charactors)");;
}
}
get
{
return new String(creatorID);
}
}

public string DataBaseName
{
set
{
if (value.Length<=32)
{
databaseName=value.ToCharArray();
}
else
{

throw new PDBException("Database Name" +
" Exceeds 32 Charactors");;
}
}
get
{
return new String(databaseName);
}
}

#endregion

#region Functions

public PDBHeader()
{
// Palm databse store total number
// of seconds since 01-01-1904
TimeSpan ts=
DateTime.Now-DateTime.Parse("01-01-1904");
creationDate=(UInt32)ts.TotalSeconds;
modificationDate=(UInt32)ts.TotalSeconds;
lastBackupDate=(UInt32)ts.TotalSeconds;
numRecords=0;
}

public override string ToString()
{
string getAll="";
getAll+=HexEncoding.GetStringToChar(databaseName,32);
getAll+=fileAttributes.ToString("X4");
getAll+=version.ToString("X4");
getAll+=creationDate.ToString("X8");
getAll+=modificationDate.ToString("X8");


getAll+=lastBackupDate.ToString("X8");
getAll+=modification.ToString("X8");
getAll+=appInfoArea.ToString("X8");
getAll+=sortInfoArea.ToString("X8");
getAll+=HexEncoding.GetStringToChar(type,4);
getAll+=HexEncoding.GetStringToChar(creatorID,4);
getAll+=uniqueID.ToString("X8");
getAll+=nextRecord.ToString("X8");
getAll+=numRecords.ToString("X4");

return getAll;
}
ii. RecordList Section
The size of the recordlist section depends on the number of records. Each record uses 8 bits to store record information. The PDBRecordList class is used to represent a recordlist.

Collapse
class PDBRecordList
{
#region Declarations
UInt32 offset=0; // 4 Bytes (Offset of the record)
byte recordAttribute=0X40;
char[] uniqueID={'\0','\0','\0'}; // 3 Bytes (Unique ID for each record)
string dataRecord=""; // Record data for current record
#endregion

#region Properties
public string DataRecord
{
set
{
dataRecord=value;
}
get
{
return dataRecord;
}
}
public UInt32 RecordOffset
{
set
{
offset=value;
}
get
{
return offset;
}
}
#endregion

#region Functions
public PDBRecordList(string str)
{
dataRecord=str;
}
public override string ToString()
{

string getAll="";
getAll+=offset.ToString("X8");
getAll+=recordAttribute.ToString("X2");
getAll+=HexEncoding.GetStringToChar(uniqueID,3);
return getAll;
}

#endregion
}
iii. Data Section
It is the main section to store information related to the records. Each record is separated by a null terminated character ('\0'). The size of each record may vary but the number of columns should be the same.

Using the code
The PDBCreators class is used to create databases.

Collapse
class PDBCreators
{
PDBHeader header=new PDBHeader();
ArrayList pdbRecord=new ArrayList();
public PDBCreators()
{
}
public PDBHeader PDBHeaders
{
set
{
header=value;
}
get
{
return header;
}
}
public Object[] AddRecord
{
set
{
string row="";
for (int i=0; i {
if (value[i].GetType().ToString()=="System.Int32")
continue;
row+=value[i].ToString().Trim()+'\0';
}
pdbRecord.Add(new PDBRecordList(row));
}
}

public void GeneratePDB(string fileName)
{
try
{
FileStream fs=new FileStream(fileName,FileMode.Create);
BinaryWriter bw=new BinaryWriter(fs);
int discard=0;
UInt32 index=78; // Header length is 78 Bytes
header.NumRecords=(UInt16)pdbRecord.Count;

bw.Write(HexEncoding.GetBytes(header.ToString(),
out discard));

// start index of Data List Area
index+=(UInt32)(pdbRecord.Count*8)+2;
string result="";
for (int i=0; ipdbRecord.Count; i++)
{
PDBRecordList rec=(PDBRecordList)pdbRecord[i];
rec.RecordOffset=index;
bw.Write(HexEncoding.GetBytes(rec.ToString(),
out discard));
index+=(UInt32)rec.DataRecord.Length;
result+=rec.DataRecord;
}
char[] padding={'\0','\0'}; // Two bytes for backup bits
bw.Write(HexEncoding.GetBytes(
HexEncoding.GetStringToChar(padding,2),
out discard));
result=HexEncoding.GetStringToChar(
result.ToCharArray(),result.Length);
bw.Write(HexEncoding.GetBytes(result,out discard));
bw.Close();
fs.Close();
}
catch (Exception exc)
{
throw new PDBException("Error" +
" in writing pdb file "+exc.Message);
}

}
}
The PDBGenerator reads two file formats (CSV and XML) and displays data in table format in a DataGrid. This data can be changed. It reads all table data from the XML file and displays table names in a combo box.

Collapse
PDBCreators pdb=new PDBCreators();
pdb.PDBHeaders.DataBaseName=this.txtDBName.Text;
pdb.PDBHeaders.CreatorID=this.txtCreatorID.Text;

DataTable recordsTable;
if (recordsDataSet.Tables.Count>0 &&
this.cmbTableNames.Items.Count>0 &&
recordsDataSet.Tables.Contains(this.cmbTableNames.Text))
recordsTable=recordsDataSet.Tables[this.cmbTableNames.Text];
else
{
MessageBox.Show("There is no table to convert",
"PDB Generator",MessageBoxButtons.OK,
MessageBoxIcon.Information);
return;
}
for (int i=0; i pdb.AddRecord=recordsTable.Rows[i].ItemArray;
try
{
pdb.GeneratePDB(this.txtDestination.Text+"\\"+
this.txtDBName.Text+".pdb");
MessageBox.Show("PDB Generated Successfully",
"PDB Generator",MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
catch(Exception exc)
{
MessageBox.Show("Error in PDB Generation"+exc.ToString(),
"PDB Generator",MessageBoxButtons.OK,
MessageBoxIcon.Information);
}

Read MP3 header information and read/write the ID3v1 tag

Dim objMP3Info As New _
Monotic.Multimedia.MP3.MP3Info
With ListView1
''' Set the filename property
objMP3Info.Filename = "c:\test.mp3"

''' Add the header information to a listview
.Add("Filesize").SubItems.Add(objMP3Info.Filesize & " Byte")
.Add("SamplingRateFrequency").SubItems.Add _
(objMP3Info.SamplingRateFrequency & " Hz")
.Add("Padding").SubItems.Add(objMP3Info.Padding & " Bytes")
.Add("Private").SubItems.Add(objMP3Info.PrivateBit)
.Add("Copyright").SubItems.Add(objMP3Info.Copyright)
.Add("OriginalBit").SubItems.Add(objMP3Info.OriginalBit)
.Add("Bitrate").SubItems.Add(objMP3Info.Bitrate & " bps")
.Add("FrameSamples").SubItems.Add(objMP3Info.FrameSamples)
.Add("FrameSize").SubItems.Add(objMP3Info.FrameSize & " Byte")
.Add("Length").SubItems.Add(objMP3Info.Length & " s ("
& Int(objMP3Info.Length / 60) & ":" & _
objMP3Info.Length Mod 60 & " m)")
.Add("HeaderPosition").SubItems.Add(objMP3Info.HeaderPosition)
.Add("VBRScale").SubItems.Add(objMP3Info.VBRScale)

Select Case objMP3Info.MPEGVersion
Case MP3.MPEGVersionEnum.MPEG1
.Add("MPEGType").SubItems.Add("MPEG 1")
Case MP3.MPEGVersionEnum.MPEG2
.Add("MPEGType").SubItems.Add("MPEG 2")
Case MP3.MPEGVersionEnum.MPEG25
.Add("MPEGType").SubItems.Add("MPEG 2.5")
End Select

Select Case objMP3Info.Layer
Case MP3.LayerEnum.LayerI
.Add("Layer").SubItems.Add("Layer I")
Case MP3.LayerEnum.LayerII
.Add("Layer").SubItems.Add("Layer II")
Case MP3.LayerEnum.LayerIII
.Add("Layer").SubItems.Add("Layer III")
End Select

Select Case objMP3Info.Protection
Case MP3.ProtectionEnum.None
.Add("Protection").SubItems.Add("None")
Case MP3.ProtectionEnum.CRC
.Add("Protection").SubItems.Add("By CRC")
End Select

Select Case objMP3Info.ChannelMode
Case MP3.ChannelModeEnum.DualChannel
.Add("ChannelMode").SubItems.Add("Dual Channel")
Case MP3.ChannelModeEnum.JointStereo
.Add("ChannelMode").SubItems.Add("Joint Stereo")
Case MP3.ChannelModeEnum.SingleChannel
.Add("ChannelMode").SubItems.Add("Single Channel")
Case MP3.ChannelModeEnum.Stereo
.Add("ChannelMode").SubItems.Add("Stereo")
End Select

Select Case objMP3Info.Emphasis
Case MP3.EmphasisEnum.CCIT
.Add("Emphasis").SubItems.Add("CCIT")
Case MP3.EmphasisEnum.MS5015
.Add("Emphasis").SubItems.Add("50/15 ms")
Case MP3.EmphasisEnum.None
.Add("Emphasis").SubItems.Add("None")
End Select

Select Case objMP3Info.Encoding
Case MP3.EncodingEnum.CBR
.Add("Encoding").SubItems.Add("CBR")
Case MP3.EncodingEnum.VBR
.Add("Encoding").SubItems.Add("VBR")
End Select

''' Add the ID3v1 tag information to a listview
If (objMP3Info.ID3v1Tag.TagAvailable) Then
.Add("ID3 Title").SubItems.Add _
(objMP3Info.ID3v1Tag.Title)
[...]
End If

''' Update the tag
objMP3Info.ID3v1Tag.Title = "Another title"
objMP3Info.ID3v1Tag.Update()

End With

Read/Write App.Config File with .NET 2.0








using System;
using System.Collections.Generic;
using System.Text;
using System.Configuration;

namespace AppSettings
{
class Program
{
static void ShowConfig()
{

// For read access you do not need to call OpenExeConfiguraton
foreach(string key in ConfigurationManager.AppSettings)
{
string value = ConfigurationManager.AppSettings[key];
Console.WriteLine("Key: {0}, Value: {1}", key, value);
}
}

static void Main(string[] args)
{

ShowConfig();

// Open App.Config of executable
System.Configuration.Configuration config =
ConfigurationManager.OpenExeConfiguration
(ConfigurationUserLevel.None);

// Add an Application Setting.
config.AppSettings.Settings.Add("ModificationDate",
DateTime.Now.ToLongTimeString() + " ");

// Save the changes in App.config file.
config.Save(ConfigurationSaveMode.Modified);

// Force a reload of a changed section.
ConfigurationManager.RefreshSection("appSettings");
ShowConfig();
}
}
}



// Get the application configuration file.
System.Configuration.Configuration config =
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

// Get the collection of the section groups.
ConfigurationSectionGroupCollection sectionGroups = config.SectionGroups;

// Show the configuration values
ShowSectionGroupCollectionInfo(sectionGroups);

static void ShowSectionGroupCollectionInfo(
ConfigurationSectionGroupCollection sectionGroups)
{
ClientSettingsSection clientSection;
SettingValueElement value;

foreach(ConfigurationSectionGroup group in sectionGroups)
// Loop over all groups
{
if(!group.IsDeclared)
// Only the ones which are actually defined in app.config
continue;

Console.WriteLine("Group {0}", group.Name);

// get all sections inside group
foreach(ConfigurationSection section in group.Sections)
{
clientSection = section as ClientSettingsSection;
Console.WriteLine("\tSection: {0}", section);

if(clientSection == null)
continue;


foreach(SettingElement set in clientSection.Settings)
{
value = set.Value as SettingValueElement;
// print out value of each section
Console.WriteLine("\t\t{0}: {1}",
set.Name,value.ValueXml.InnerText);
}
}
}
}




How To Read/Write Another App.Config File
To open another App.Config file, you need to create an instance of ExeConfigurationFileMap. The purpose of this class is not that obvious but we can use it to open another file. Once you have learnt this little trick the rest is easy. Here is a little example that opens a file by specifying it's name, makes some changes to it and writes the changes to disk.

ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = @"ConfigTest.exe.config";
// relative path names possible

// Open another config file
Configuration config =
ConfigurationManager.OpenMappedExeConfiguration(fileMap,
ConfigurationUserLevel.None);

//read/write from it as usual
ConfigurationSection mySection = config.GetSection("mySection");
config.SectionGroups.Clear(); // make changes to it

config.Save(ConfigurationSaveMode.Full); // Save changes
The Microsoft Enterprise Library way has a shorthand utility class for this. It is the FileConfigurationSource which hides those strange things. Tom Hollander has a nice post explaining this already so I will not repeat the same here.

How To Read/Write Serialized Objects
A more advanced way to store our settings is to create our own ConfigurationSection. This makes our configuration values distinguishable from other configuration values inside the App.config file. It is a little more complicated since you have to write your own class whose content is de/serialized to the App.config file. I am going to show you at first the config file and then explain what code you need to write to read/save these settings to your application configuration file.

App.Config (Taken from the Enterprise Library Configuration Migration QuickStart Sample)




type="ConfigurationMigrationQuickStart.EditorFontData,
ConfigurationMigrationQuickStart, Version=1.1.0.0,
Culture=neutral,PublicKeyToken=null"/>





Most App.config files which contain config data have a element where many
are defined. The name attribute of a section (in this example "EditorSettings") tells the config system that the class ConfigurationMigrationQuickStart.EditorFontData is responsible for the ser/deserialization of the node . The EditorFontData class derives from the ConfigurationSection class and uses the ConfigurationProperty attribute to create a mapping between the properties to de/serialize and the attribute names in names in the App.Config file.

using System.Text;
using System.Configuration;

public class EditorFontData : ConfigurationSection
{
public EditorFontData()
{
}

[ConfigurationProperty("name")]
public string Name
{
get { return (string)this["name"]; }
set { this["name"] = value; }
}

[ConfigurationProperty("size")]

public float Size
{
get { return (float)this["size"]; }
set { this["size"] = value; }
}

[ConfigurationProperty("style")]
public int Style
{
get { return (int)this["style"]; }
set { this["style"]= value; }
}
}
To access an EditorFontData instance with values from your config file you only need to call: EditorFontData configData = ConfigurationManager.GetSection("EditorSettings") as EditorFontData;

Please note that the System.Configuration.ConfigurationManager returns only objects with read only properties. Subsequent calls to GetSection use the cached instance inside the ConfigurationManager. This constraint requires you to create every time a new instance for you e.g. EditorFontData object if you want to write to the App.config file. You even cannot add an object with the same name twice to the System.Configuration.Configuration object. Now comes the fun part: To edit an existing App.config file you have to remove your config object and then add a new object instance to the Configuration object. Only then the Save will succeed.

EditorFontData configData = new EditorFontData();

configData.Name = "Arial";
configData.Size = 20;
configData.Style = 2;

Configuration config =
ConfigurationManager.OpenExeConfiguration(
ConfigurationUserLevel.None);

// You need to remove the old settings object before you can replace it
config.Sections.Remove("EditorSettings");
// with an updated one
config.Sections.Add("EditorSettings", configData);
// Write the new configuration data to the XML file
config.Save();
To get your hands on the System.Configuration.Configuration object you have to open your App.Config file. The .NET config mechanism supports setting inheritance from the Machine.config from which all settings are inherited. Next comes the App.Config file which is selected by the ConfigurationUserLevel.None file.

Quick Xml Read and Write Adapters for C#

#region XmlWriterAdapter and XmlReaderAdapter

#region XmlReaderAdapter
///
/// Allows Easy Reading from XmlNodes
///

public class XmlReaderAdapter {
#region Attributes
private XmlNode currNode;
#endregion

#region Constructors
public XmlReaderAdapter(XmlNode currNode){
this.currNode = currNode;
}
public XmlReaderAdapter(XmlDocument doc):this(doc.FirstChild){
}
#endregion

#region Getting text and attribute values
///
/// Get child value of a node.
///

public string this[string child]{
get{
return currNode.SelectSingleNode("child::" + child).InnerText;
}
}
///
/// Get child attribute.
///

public string this[string child, string attribute]{
get{
return currNode.SelectSingleNode("child::" + child).Attributes[attribute].Value;
}
}
#endregion

#region Check if child exists
///
/// Return whether child value exists.
///

///
///
public bool hasChildValue(string child){
return (hasChild(child) && (this[child].Length>0));
}
public bool hasChild(string child){
return (this.currNode.SelectSingleNode("child::"+child)!=null);
}
#endregion

#region Get Sub-Nodes - Old version
///
/// Get Child node collection from a wrapper name - old version
///

///
///
public XmlNodeList getSubNodeCollection(string collectionWrapperChild){
return currNode.SelectSingleNode("child::" + collectionWrapperChild).ChildNodes;
}
#endregion

#region Get SubNode / Children Adapter Collections - new version
///
/// Get Child node collection from a wrapper name
///

///
///
public XmlReaderAdapterCollection getSubNodeAdapterCollection(string collectionWrapperChild){
return new XmlReaderAdapterCollection(currNode.SelectSingleNode("child::" + collectionWrapperChild).ChildNodes);
}
///
/// Get All Child nodes
///

///
///
public XmlReaderAdapterCollection getAllChildren(){
return new XmlReaderAdapterCollection(currNode.ChildNodes);
}

#endregion
}
#endregion

#region XmlReaderAdapterCollection
///
/// Provides a strongly typed collection of XmlReaderAdapter objects.
///

[Serializable()]
public class XmlReaderAdapterCollection : CollectionBase{
///
/// Creates Default XmlReaderAdapterCollection
///

public XmlReaderAdapterCollection(){
}
///
/// Creates XmlReaderAdapterCollection from a list of nodes
///

public XmlReaderAdapterCollection(XmlNodeList nodes){
foreach (XmlNode node in nodes){
this.Add(new XmlReaderAdapter(node));
}
}///
/// Returns a XmlReaderAdapter object from the specified ordinal position within the collection.
///

public XmlReaderAdapter this[int index]{
get{
return (XmlReaderAdapter)List[index];
}
set{
List[index] = value;
}
}
///
/// Adds a VersionCriteria to the VersionCriteriaCollection.
///

/// The XmlReaderAdapter object to add to the collection.
/// The position within the collection that the XmlReaderAdapter object was added.
public int Add(XmlReaderAdapter value){
return(List.Add(value));
}

///
/// Determines the index in the XmlReaderAdapterCollection of the XmlReaderAdapter object specified.
///

/// The VersionCriteria object to locate within the collection.
/// The index of the VersionCriteria object; if not found returns -1.
public int IndexOf(XmlReaderAdapter value){
return(List.IndexOf(value));
}

///
/// Adds the VersionCriteria object at the specified ordinal position in the collection.
///

/// The zero based index at which the XmlReaderAdapter object should be added.
/// The XmlReaderAdapter to be added to the XmlReaderAdapterCollection.
public void Insert(int index, XmlReaderAdapter value){
List.Insert(index, value);
}

///
/// Removes the XmlReaderAdapter object from the XmlReaderAdapterCollection.
///

/// The XmlReaderAdapter object to remove.
public void Remove(XmlReaderAdapter value){
List.Remove(value);
}

///
/// Determines if the XmlReaderAdapterCollection contains the specified XmlReaderAdapter object.
///

/// The XmlReaderAdapter to search for.
/// true if the XmlReaderAdapter object is found in the collection; false if not.
public bool Contains(XmlReaderAdapter value){
return(List.Contains(value));
}
}
#endregion

#region XmlWriterAdapter
///
/// Allows Easy Writing of an XmlDocument
///

public class XmlWriterAdapter{
#region Properties and Attributes
private XmlDocument doc;
private string docNamespace;
private XmlNode rootNode;
///
/// Allows you to retrieve the RootNode, so you can append to the root if needed
///

public XmlNode RootNode{
get{
return this.rootNode;
}
}
///
/// Allows you to retrieve the XmlDocument in case you need to do something not
/// defined here.
///

public XmlDocument Doc{
get{
return this.doc;
}
}
#endregion

#region Constructors
///
/// Creates a XmlWriterAdapter with no namespace (THIS IS NORMAL)
///

///
public XmlWriterAdapter(string rootNodeName):this(string.Empty,rootNodeName){
}
///
/// Creates a XmlWriterAdapter with a namespace (CURRENTLY NOT USED)
///

///
///
public XmlWriterAdapter(string docNamespace, string rootNodeName){
this.docNamespace = docNamespace;
this.doc = new XmlDocument();
rootNode = MakeAndSetElement(rootNodeName);
doc.AppendChild(rootNode);
}
#endregion

#region Creating Elements with inner text
///
/// Creates and returns an element with the given name and NO value.
///

///
///
public XmlNode MakeAndSetElement(string name){
return doc.CreateNode(XmlNodeType.Element, name, docNamespace);
}
///
/// Creates and returns an element with the given name and value
///

///
///
///
public XmlNode MakeAndSetElement(string name, string value){
XmlNode field = MakeAndSetElement(name);
//if (value != string.Empty){
field.InnerText = value;
//}
return field;
}
#endregion

#region Add Attribute
///
/// Makes and sets an attribute.
///

///
///
///
public void MakeAndSetAttribute(string name, string value, XmlNode parent){
XmlAttribute field = doc.CreateAttribute(name, docNamespace);
field.Value = value;
parent.Attributes.Append(field);
}
#endregion

#region Append Element
///
/// Creates an element with the given name and value. Appends Element to the given parent.
///

///
///
///
///
public XmlNode AppendElement(string name, string value, XmlNode parent){
return AppendElement(MakeAndSetElement(name,value),parent);
}
///
/// Creates an element with the given name and NO value. Appends Element to the given parent.
///

///
///
///
public XmlNode AppendElement(string name, XmlNode parent){
return AppendElement(MakeAndSetElement(name),parent);
}
///
/// Appends an element to the given parent.
///

///
///
///
public XmlNode AppendElement(XmlNode child, XmlNode parent){
parent.AppendChild(child);
return child;
}
#endregion

#region AppendElementToRoot
///
/// Creates an element with the given name and NO value. Appends Element to the root.
///

///
///
public XmlNode AppendElementToRoot(string name){
return AppendElementToRoot(name,string.Empty);
}
///
/// Creates an element with the given name and value. Appends Element to the root.
///

///
///
public XmlNode AppendElementToRoot(string name, string value){
return AppendElementToRoot(MakeAndSetElement(name,value));
}
///
/// Appends an element to the root.
///

///
///
///
public XmlNode AppendElementToRoot(XmlNode child){
return AppendElement(child,this.rootNode);
}
#endregion

#region Write XML
///
/// Writes XML to string in Indented Format (good for debugging or printing to user)
///

///
public string WriteIndentedXML(){
StringWriter strWriter = new StringWriter();
XmlTextWriter xmlWriter = new XmlTextWriter(strWriter);
xmlWriter.Formatting = Formatting.Indented;
doc.WriteTo(xmlWriter);
xmlWriter.Flush();
strWriter.Flush();
return strWriter.ToString();
}
///
/// Writes XML to string with no formatting (good for sending it to other programs)
///

///
public string WriteXML(){
//System.Diagnostics.Trace.WriteLine(WriteIndentedXML());

StringWriter strWriter = new StringWriter();
XmlTextWriter xmlWriter = new XmlTextWriter(strWriter);
xmlWriter.Formatting = Formatting.None;
doc.WriteTo(xmlWriter);
xmlWriter.Flush();
strWriter.Flush();
return strWriter.ToString();
}
#endregion
}
#endregion

#endregion


ColinBashBash

Soure CSS menu

.foo {} /* W3C CSS validator likes CSS files to start with a class rather than a comment. Soooooo.... */
/* This style sheet is intended to contain OFTEN CHANGED rules used when the Menu control adapter is enabled. */
/* When the Menu control's Orientation property is Vertical the adapter wraps the menu with DIV */
/* whose class is AspNet-Menu-Vertical. */
/* Note that the example menu in this web site uses relative positioning to force the menu to occupy */
/* a specific place in the web page. Your web site will likely use a different technique to position your */
/* menu. So feel free to change all the properties found in this CSS rule if you clone this style sheet. */
/* There is nothing, per se, that is magical about these particular property value choices. They happen to */
/* work well for the sample page used to demonstrate an adapted menu. */
.PrettyMenu .AspNet-Menu-Vertical
{
position:relative;
top: 3em;
left: 0;
z-index: 300;
}
/* The menu adapter renders an unordered list (ul) in HTML for each tier in the menu. */
/* So, effectively says: style all tiers in the menu this way... */
.PrettyMenu ul
{
background:#7795BD;
}
/* Top tier */
.PrettyMenu .AspNet-Menu-Vertical ul.AspNet-Menu
{
width: 9em;
}
/* This rule effectively says: style all tiers EXCEPT THE TOP TIER in the menu this way... */
/* In other words, this rule can be used to style the second and third tiers of the menu without impacting */
/* the topmost tier's appearance. */
.PrettyMenu ul.AspNet-Menu ul
{
width: 10.5em;
left: 8.9em;
top: -1em;
z-index: 400;
}
.PrettyMenu ul.AspNet-Menu ul ul
{
width: 11.5em;
left: 10.4em;
}
/* The menu adapter generates a list item (li) in HTML for each menu item. */
/* Use this rule create the common appearance of each menu item. */
.PrettyMenu ul.AspNet-Menu li
{
background:#7795BD url(bg_nav.gif) repeat-x;
}
/* Within each menu item is a link or a span, depending on whether or not the MenuItem has defined it's */
/* NavigateUrl property. By setting a transparent background image here you can effectively layer two images */
/* in each menu item. One comes from the CSS rule (above) governing the li tag that each menu item has. */
/* The second image comes from this rule (below). */
.PrettyMenu ul.AspNet-Menu li a,
.PrettyMenu ul.AspNet-Menu li span
{
color: black;
padding: 4px 2px 4px 8px;
border:1px solid #648ABD;
border-bottom: 0;
background: transparent url(arrowRight.gif) right center no-repeat;
}
/* When a menu item contains no submenu items it is marked as a "leaf" and can be styled specially by this rule. */
.PrettyMenu ul.AspNet-Menu li.AspNet-Menu-Leaf a,
.PrettyMenu ul.AspNet-Menu li.AspNet-Menu-Leaf span
{
background-image: none;
}
/* Not used presently. This is here if you modify the menu adapter so it renders img tags, too. */
.PrettyMenu ul.AspNet-Menu li a img
{
border-style: none;
vertical-align: middle;
}
/* When you hover over a menu item, this rule comes into play. */
/* Browsers that do not support the CSS hover pseudo-class, use JavaScript to dynamically change the */
/* menu item's li tag so it has the AspNet-Menu-Hover class when the cursor is over that li tag. */
/* See MenuAdapter.js (in the JavaScript folder). */
.PrettyMenu ul.AspNet-Menu li:hover,
.PrettyMenu ul.AspNet-Menu li.AspNet-Menu-Hover
{
background:#7795BD;
}
.PrettyMenu ul.AspNet-Menu li:hover a,
.PrettyMenu ul.AspNet-Menu li:hover span,
.PrettyMenu ul.AspNet-Menu li.AspNet-Menu-Hover a,
.PrettyMenu ul.AspNet-Menu li.AspNet-Menu-Hover span,
.PrettyMenu ul.AspNet-Menu li:hover li:hover a,
.PrettyMenu ul.AspNet-Menu li:hover li:hover span,
.PrettyMenu ul.AspNet-Menu li.AspNet-Menu-Hover li.AspNet-Menu-Hover a,
.PrettyMenu ul.AspNet-Menu li.AspNet-Menu-Hover li.AspNet-Menu-Hover span,
.PrettyMenu ul.AspNet-Menu li:hover li:hover ul a:hover,
.PrettyMenu ul.AspNet-Menu li:hover li:hover ul span.Asp-Menu-Hover,
.PrettyMenu ul.AspNet-Menu li.AspNet-Menu-Hover li.AspNet-Menu-Hover ul a:hover,
.PrettyMenu ul.AspNet-Menu li.AspNet-Menu-Hover li.AspNet-Menu-Hover ul span.Asp-Menu-Hover
{
color: White;
}
.PrettyMenu ul.AspNet-Menu li:hover ul a,
.PrettyMenu ul.AspNet-Menu li:hover ul span,
.PrettyMenu ul.AspNet-Menu li.AspNet-Menu-Hover ul a,
.PrettyMenu ul.AspNet-Menu li.AspNet-Menu-Hover ul span,
.PrettyMenu ul.AspNet-Menu li:hover li:hover ul a,
.PrettyMenu ul.AspNet-Menu li:hover li:hover ul span,
.PrettyMenu ul.AspNet-Menu li.AspNet-Menu-Hover li.AspNet-Menu-Hover ul a,
.PrettyMenu ul.AspNet-Menu li.AspNet-Menu-Hover li.AspNet-Menu-Hover ul span
{
color: Black;
}
/* While you hover over a list item (li) you are also hovering over a link or span because */
/* the link or span covers the interior of the li. So you can set some hover-related styles */
/* in the rule (above) for the li but set other hover-related styles in this (below) rule. */
.PrettyMenu ul.AspNet-Menu li a:hover,
.PrettyMenu ul.AspNet-Menu li span.Asp-Menu-Hover
{
color: White;
background: transparent url(activeArrowRight.gif) right center no-repeat;
}
.PrettyMenu ul.AspNet-Menu li.AspNet-Menu-Leaf a:hover
{
background-image: none;
}
/* -------------------------------------------------------------------------- */
/* When the Menu control's Orientation property is Horizontal the adapter wraps the menu with DIV */
/* whose class is AspNet-Menu-Horizontal. */
/* Note that the example menu in this web site uses absolute positioning to force the menu to occupy */
/* a specific place in the web page. Your web site will likely use a different technique to position your */
/* menu. So feel free to change all the properties found in this CSS rule if you clone this style sheet. */
/* There is nothing, per se, that is magical about these particular property value choices. They happen to */
/* work well for the sample page used to demonstrate an adapted menu. */
.PrettyMenu .AspNet-Menu-Horizontal
{
position:absolute;
left: 9.5em;
top: 0;
z-index: 300;
}
/* This rule controls the width of the top tier of the horizontal menu. */
/* BE SURE TO MAKE THIS WIDE ENOUGH to accommodate all of the top tier menu items that are lined */
/* up from left to right. In other words, this width needs to be the width of the individual */
/* top tier menu items multiplied by the number of items. */
.PrettyMenu .AspNet-Menu-Horizontal ul.AspNet-Menu
{
width: 45em;
}
/* This rule effectively says: style all tiers EXCEPT THE TOP TIER in the menu this way... */
/* In other words, this rule can be used to style the second and third tiers of the menu without impacting */
/* the topmost tier's appearance. */
/* Remember that only the topmost tier of the menu is horizontal. The second and third tiers are vertical. */
/* So, they need a much smaller width than the top tier. Effectively, the width specified here is simply */
/* the width of a single menu item in the second and their tiers. */
.PrettyMenu .AspNet-Menu-Horizontal ul.AspNet-Menu ul
{
width: 10.5em;
left: 0;
top: 100%;
}
.PrettyMenu .AspNet-Menu-Horizontal ul.AspNet-Menu ul ul
{
top: -0.3em;
}
.PrettyMenu .AspNet-Menu-Horizontal ul.AspNet-Menu ul ul
{
width: 11.5em;
}
/* Generally, you use this rule to set style properties that pertain to all menu items. */
/* One exception is the width set here. We will override this width with a more specific rule (below) */
/* That sets the width for all menu items from the second tier downward in the menu. */
.PrettyMenu .AspNet-Menu-Horizontal ul.AspNet-Menu li
{
width: 9em;
text-align:center;
}
/* This rule establishes the width of menu items below the top tier. This allows the top tier menu items */
/* to be narrower, for example, than the sub-menu items. */
/* This value you set here should be slightly larger than the left margin value in the next rule. See */
/* its comment for more details. */
.PrettyMenu .AspNet-Menu-Horizontal ul.AspNet-Menu ul li
{
text-align:left;
width: 10.5em;
}
.PrettyMenu .AspNet-Menu-Horizontal ul.AspNet-Menu ul ul li
{
width: 11.5em;
}
/* Third tier menus have to be positioned differently than second (or top) tier menu items because */
/* they drop to the side, not below, their parent menu item. This is done by setting the last margin */
/* value (which is equal to margin-left) to a value that is slightly smaller than the WIDTH of the */
/* menu item. So, if you modify the rule above, then you should modify this (below) rule, too. */
.PrettyMenu .AspNet-Menu-Horizontal ul.AspNet-Menu li ul li ul
{
margin: -1.4em 0 0 10.35em;
}
/* ------------------------------------------------------------------- */
/* Specific to this sample web site. */
/* These rules are probably not useful in your site. */
#SampleMenu
{
position:relative;
height: 13em;
font-size:small;
font-family: Tahoma;
}
#SampleMenu #Sample-Content
{
width: 44em;
height: 10em;
overflow: hidden;
position:absolute;
left: 9.5em;
top: 2em;
padding: 10px;
background: #B9D3EE;
font-family: "Times New Roman";
font-style:italic;
color: Black;
}
/* --------------------------------------------------------------------------------------------------- */
/* Used when the Menu adapter is NOT used. */
/* These styles are used by the Menu's skin, found in this theme's skin file. */
#SampleMenu .Menu-Skin-Horizontal
{
position:absolute;
left: 9.5em;
top: 0;
width: 45em;
z-index: 300;
}
#SampleMenu .Menu-Skin-Vertical
{
position:relative;
top: 3em;
left: 0;
z-index: 300;
}
#SampleMenu .Menu-Skin-StaticItem
{
background:#7795BD url(bg_nav.gif) repeat-x;
font-size: small;
}
#SampleMenu .Menu-Skin-DynamicHover
{
background:#7795BD;
}

Anh web luu tru







web hotel tu thiet ke dang can chinh sua







Thứ Ba, 11 tháng 9, 2007

Hack Google

Google là máy tìm kiếm mạnh mẽ và phổ biến nhất thế giới,nó có khả năng chấp nhận những lệnh được định nghĩa sẵn khi nhập vào và cho những kết quả không thể tin được.Điều này cho phép những người dùng có dã tâm nhưtin tặc, crackers, và script kiddies v.v... sử dụng máy tìm kiếm Google để thu thập những thông tin bí mật và nhạy cảm, những cái mà không thể nhìn thấy qua những tìm kiếm thông thường.Trong bài báo này tôi sẽ làm rõ những điểm dưới đây mà những người quản trị hoặc chuyên gia bảo mật phải đưa vào tài khoản để phòng chống những thông tin bí mật bị phơi bày.- Những cú pháp tìm kiếm nâng cao với Google- Tìm kiếm những Site hoặc Server(máy chủ) dễ bị tấn công sử dụng những cú pháp nâng cao của Google- Bảo mật cho servers hoặc sites khỏi sự tấn công của GoogleNhững cú pháp tìm kiếm nâng cao với GoogleDưới đây thảo luận về những lệnh đặc biệt của Google và tôi sẽ giải thích từng lệnh một cách ngắn gọn và nói rõ nó được sử dụng như thế nào để tìm kiếm thông tin.[ intitle: ]Cú pháp “intitle:” giúp Google giới hạn kết quả tìm kiếm về những trang có chứa từ đó trong tiêu đề. Ví dụ, “intitle: login password” (không có ngoặc kép) sẽ cho kết quả là những link đến những trang có từ "login" trong tiêu đề, và từ "password" nằm ở đâu đó trong trang.Tương tự, nếu ta muốn truy vấn nhiều hơn một từ trong tiêu đề của trang thì ta có thể dùng “allintitle:” thay cho “intitle” để có kết quả là những trang có chứa tất cả những từ đó trong tiêu đề. Ví dụ như dùng“intitle: login intitle: password” cũng giống như truy vấn “allintitle: login password”.[ inurl: ]Cú pháp “inurl:” giới hạn kết quả tìm kiếm về những địa chỉ URL có chứa từ khóa tìm kiếm. Ví dụ: “inurl: passwd” (không có ngoặc kép) sẽ cho kết quả là những link đến những trang có từ "passwd" trong URL.Tương tự, nếu ta muốn truy vấn nhiều hơn một từ trong URL thì ta có thể dùng “allinurl:” thay cho “inurl” để được kết quả là những URL chứa tất cả những từ khóa tìm kiếm.Ví dụ: “allinurl: etc/passwd“ sẽ tìm kiếm những URL có chứa “etc” và “passwd”. Ký hiệu gạch chéo (“/”) giữa các từ sẽ bị Google bỏ qua.[ site: ]Cú pháp “site:” giới hạn Google chỉ truy vấn những từ khóa xác định trong một site hoặc tên miền riêng biệt. Ví dụ: “exploits site:hackingspirits.com” (không có ngoặc kép) sẽ tìm kiếm từ khóa “exploits” trong những trang hiện có trong tất cả các link của tên miền “hackingspirits.com”. Không có khoảng trống nào giữa “site:” và “tên miền”.[ filetype: ]Cú pháp “filetype:” giới hạn Google chỉ tìm kiếm những files trên internet có phần mở rộng riêng biệt (Ví dụ: doc, pdf hay ppt v.v...). Ví dụ : “filetype:doc site:gov confidential” (không có ngoặc kép) sẽ tìm kiếm những file có phẩn mở rộng là “.doc” trong tất cả những tên miền của chính phủ có phần mở rộng là “.gov” và chứa từ “confidential”(bí mật) trong trang hoặc trong file “.doc”. Ví dụ . Kết quả sẽ bao gồm những liên kết đến tất cả các file văn bản bí trên các site của chính phủ.[ link: ]Cú pháp “link:” sẽ liệt kê những trang web mà có các liên kết đến đến những trang web chỉ định. Ví dụ :chuỗi “link:www.securityfocus.com” sẽ liệt kê những trang web có liên kết trỏ đến trang chủ SecurityFocus.Chú ý không có khoảng trống giữa "link:" và URL của trang Web.[ related: ]Cú pháp “related:” sẽ liệt kê các trang Web "tương tự" với trang Web chỉ định. Ví dụ :“related:www.securityfocus.com” sẽ liệt kê các trang web tương tự với trang chủ Securityfocus. Nhớ rằng không có khoảng trống giữa "related:" và URL của trang Web.[ cache: ]Truy vấn “cache:” sẽ cho kết quả là phiên bản của trang Web mà mà Google đã lưu lại. Ví dụ:“cache:www.hackingspirits.com” sẽ cho ra trang đã lưu lại bởi Google's. Nhớ rằng không có khoảng trống giữa "cache:" và URL của trang web.Nếu bạn bao gồm những từ khác trong truy vấn, Google sẽ điểm sáng những từ này trong văn bản đã được lưu lại.Ví dụ: “cache:www.hackingspirits.com guest” sẽ cho ra văn bản đã được lưu lại có từ "guest" được điểm sáng.[ intext: ]Cú pháp “intext:” tìm kiếm các từ trong một website riêng biệt. Nó phớt lờ các liên kết hoặc URL và tiêu đề của trang.Ví dụ: “intext:exploits” (không có ngoặc kép) sẽ cho kết quả là những liên kết đến những trang web có từ khóa tìm kiếm là "exploits" trong các trang của nó.[ phonebook: ]“phonebook” tìm kiếm thông tin về các địa chỉ đường phố ở Mỹ và số điện thoại. Ví dụ:“phonebook:Lisa+CA” sẽ liệt kê tất cả các tên người có từ “Lisa” trong tên và ở “California (CA)”. Cú pháp này có thể được sử dụng như là một công cụ tuyệt vời của tin tặc trong trường hợp ai đó muốn tìm kiếm thông tin cá nhân cho công việc xã hội.Truy vấn các site hoặc server dễ bị tấn công sử dụng các cú pháp nâng cao của GoogleNhững cú pháp truy vấn nâng cao thảo luận ở trên thực sự có thể giúp người ta chính xác hóa các tìm kiếm và có được những gì họ thực sự tìm kiếm.Bây giờ Google trở thành một máy tìm kiếm thông minh, những người dùng có ác ý không hề bận tâm khai thác khả năng của nó để đào bới những thông tin bí mật từ internet mà chỉ có sự truy cập giới hạn. Bây giờ tôi sẽ thảo luận những kỹ thuật này một cách chi tiết làm thế nào để những người dùng ác tâm đào bới thông tin trên internet sử dụng Google như một công cụ.Sử dụng cú pháp “Index of ” để tìm kiếm các site cho phép duyệt chỉ mụcMột webserver(máy chủ web) cho phép duyệt chỉ mục nghĩa là bất kỳ ai có thể duyệt các thư mục của webserver như các thư mục nội bộ thông thường. Ở đây tôi sẽ thảo luận làm thế nào để sử dụng cú pháp "index of" để có một danh sách các liên kết đến webserver cho phép duyệt thư mục.Cách này trở thành một nguồn dễ dàng cho việc thu thập thông tin của tin tặc. Tưởng tưởng nếu họ nắm được các file mật khẩu hoặc các file nhạy cảm khác mà bình thưởng không thể thấy được trên internet.Dưới đây là vài Ví dụ sử dụng để có được quyền truy cập vào rất nhiều thông tin nhạy cảm dễ dàng hơn rất nhiều:Index of /adminIndex of /passwdIndex of /passwordIndex of /mail"Index of /" +passwd"Index of /" +password.txt"Index of /" +.htaccess"Index of /secret""Index of /confidential""Index of /root""Index of /cgi-bin""Index of /credit-card""Index of /logs""Index of /config"Tìm kiếm các site hoặc server dễ bị tấn công sử dụng cú pháp “inurl:” hoặc “allinurl:”a. Sử dụng “allinurl:winnt/system32/” (không có ngoặc kép) sẽ liệt kê tất cả các liên kết đến server mà cho phép truy cập đến những thư mục giới hạn như “system32” qua web. Nếu bạn đủ may mắn thì bạn có thể có quyền truy cập đến file cmd.exe trong thư mục “system32”. Một khi bạn có quyền truy cập đến file “cmd.exe” và có thể thực thi nó thì bạn có thể tiến lên xa hơnleo thang quyền của bạn khắp server và làm hại nó.b. Sử dụng “allinurl:wwwboard/passwd.txt”(không có ngoặc kép) trongGoogle search sẽ liệt kê tất cả các liên kết đến server mà dễ bị tấn công vào “tính dễ bị tấn công mật khẩu WWWBoard”. Để biết thêm về tính dễ bị tấn công này bạn có thể vào link sau đây:http://www.securiteam.com/exploits/2BUQ4S0SAW.htmlc. Sử dụng “inurl:.bash_history” (không có ngoặc kép) sẽ liệt kê tất cả các liên kết đến server mà cho phép truy cập vào file“.bash_history” qua web. Đây là một file lịch sử dòng lệnh. File này bao gồm danh sách các lệnh được thực thi bởi quản trị viên,, và đôi khi bao gồm cả thông tin nhạy cảm như mật khẩugõ vào bởi quản trị viên. Nếu file này bị làm hạivà nếu nó bao gồm mật khẩu đã mã hóa của hệ thống unix (or *nix)thì nó có thể dễ dàng bị crack bởi phương pháp “John TheRipper”.d. Sử dụng “inurl:config.txt” (không có ngoặc kép) sẽ liệt kê tất cả các liên kết đến các máy chủ cho phép truy cập vào file “config.txt”qua giao diện web. File này bao gồm các thông tin nhạy cảm,bao gồm giá trị bị băm ra của mật khẩu quản trị và sự xác thực quyền truy cập cơ sở dữ liệu. Ví dụ: Hệ thống quản lý học tập Ingeniumlà một ứng dụng Web cho các hệ thống Windows phát triển bởi Click2learn, Inc. Hệ thống quản lý học tập Ingeniumphiên bản 5.1 và 6.1 lưu các thông tin nhạy cảm không an tòan trong file config.txt. Để biết thêm thông tin vào liên kết sau:http://www.securiteam.com/securitynews/6M00H2K5PG.htmlNhững tìm kiếm tương tự khác dùng “inurl:” hoặc “allinurl:” kết hợp với các cú pháp khác:inurl:admin filetype:txtinurl:admin filetype:dbinurl:admin filetype:cfginurl:mysql filetype:cfginurlasswd filetype:txtinurl:iisadmininurl:auth_user_file.txtinurlrders.txtinurl:"wwwroot/*."inurl:adpassword.txtinurl:webeditor.phpinurl:file_upload.phpinurl:gov filetype:xls "restricted"index of ftp +.mdb allinurl:/cgi-bin/ +mailtoTìm kiếm các site hoặc server dễ bị tấn công dùng “intitle:” hoặc “allintitle:”a. Sử dụng [allintitle: "index of /root”] (không có ngoặc vuông) sẽ liệt kê các liên kết đến các webserver(máy chủ Web) cho phép truy cập vào các thư mục giới hạn như “root” qua giao diện web. Thư mục này đôi khi bao gồm các thông tin nhạy cảm mà có thể dễ dàng tìm được tqua những yêu cầu Web đơn giản.b. Sử dụng [allintitle: "index of /admin”] (không có ngoặc vuông) sẽ liệt kê các liên kết đến các website cho phép duyệt chỉ mục các thư mục giới hạn như “admin” qua giao diện web. Hầu hết các ứng dụng web đôi khi sử dụng tên như “admin” để lưu quyền admin trong đó. Thư mục này đôi khi bao hàm các thông tin nhạy cảm mà có thể dễ dàng tìm được qua các yêu cầu Web đơn giản.Những tìm kiếm tương tự dùng “intitle:” hoặc “allintitle:” kết hợp với các cú pháp khácintitle:"Index of" .sh_historyintitle:"Index of" .bash_historyintitle:"index of" passwdintitle:"index of" people.lstintitle:"index of" pwd.dbintitle:"index of" etc/shadowintitle:"index of" spwdintitle:"index of" master.passwdintitle:"index of" htpasswdintitle:"index of" members OR accountsintitle:"index of" user_carts OR user_cartallintitle: sensitive filetype:docallintitle: restricted filetype :mailallintitle: restricted filetype:doc site:govNhững truy vấn tìm kiếm thú vị khácĐể tìm những site dễ bị tấn công bằng phương pháp Cross-Sites Scripting (XSS):allinurl:/scripts/cart32.exeallinurl:/CuteNews/show_archives.phpallinurl:/phpinfo.phpĐể tìm những site dễ bị tấn công bằng phương pháp SQL Injection:allinurl:/privmsg.phpallinurl:/privmsg.phpBảo mật các server hoặc site khỏi sự tấn công của GoogleDưới đây là những phương pháp bảo mật mà các quản trị viên và các chuyên gia bảo mật phải đưa vào tài khoản để bảo mật những thông tin then chốt khỏi rơi vào không đúng chỗ:- Cài những bản vá bảo mật mới nhất cho các ứng dụng cũng như hệ điều hành chạy trên máy chủ.- Đừng để những thông tin nhạy cảm và then chốt trên máy chủ mà không có hệ thống xác nhận hợp lệ mà có thể bị truy cập trực tiếp bởi bất kỳ ai trên internet.- Không cho phép duyệt thư mục trên webserver. Duyệt thư mục chỉ nên được cho phép với các thư mục web bạn muốn cho bất kỳ ai trên internet truy cập.- Nếu bạn tìm thấy bất kỳ liên kết nào đến server hoặc site giới hạn của bạn trong kết quả của Google search thì nó phải được xóa đi. Vào liên kết sau để biết thêm chi tiết:http://www.google.com/remove.html- Không cho phép truy cập dấu tên vào webserver qua internetvào các thư mục hệ thống giới hạn.- Cài các công cụ lọc như URLScan cho các máy chủ chạyIIS như là webserver.Kết luậnĐôi khi tăng sự phức tạp trong hệ thống tạo ra những sự cố mới. Google trở lên phức tạp hơn có thể được sử dụng bởi bất kỳ anh Tom,anh Dick & Harry nào đó trên internet để đào bới những thông tin nhạy cảm mà thông thường không thể nhìn thấy hoặc với đến bởi bất kỳ ai.Người ta không thể ngăn cản ai đó ngừng tạo ra những giả mạo vì vậy những lựa chọn duy nhất còn lại cho những chuyên gia bảo mật và quản trị hệ thống là bảo vệ hệ thống của họ và làm khó khăn hơn từ sự xâm hại không mong muốnTài Liệu Từ Internet