Mã hóa web config để che đi thông tin string năm 2024
Mình mới làm quen lập trình với ASP.NET. Vấn đề mình muốn hỏi ở đây là làm sao để khai báo một biến toàn cục để các trang có thể sử dụng mà không cần phải khai báo từ đầu. Ví dụ như một biến kết nối vào CSDL: Dim myConnection As OleDbConnection myConnection = New OleDbConnection(ConnStr) Mình muốn khai báo biến myConnection để tất cả các trang có thể sử dụng không cần phải khai báo lại từ đầu. Bạn nào biết xin chỉ giáo. Cảm ơn nhiều! commandline 24-05-2009, 22:09 Bạn chỉ cần khai báo biến kiểu static. (chú ý: Trong ASP.Net, mọi thứ đều là đối tượng ) khanhloc2011 02-06-2009, 15:29 Khai báo trong Global.asax hoặc dùng Session Dùng Application[] nhé bạn trinhdiep 02-06-2009, 21:00 biến này khá nhạy cảm. mình nghĩ tốt nhất nên tạo ra class static. khi nào cần thiết ví dụ như mã hóa, phát triển gì thì cũng dễ dàng. dùng Application[] cũng tốt nhưng mà không thật sự hay. hoanguyenduc 04-06-2009, 22:00 trong Asp.Net không có biến toàn cục như trong APP.pải lưu trên Global.asax hoặc dùng Session không biết có đúng không các pác pro. Mình có ý kiến thế này :
- Bạn lưu chuỗi kết nối csdl vào file Web.Config trong phần Lấy chuỗi kết nối này như sau: ConfigurationManager.ConnectionStrings("MyConnectionString").ToString() Cuối cùng là việc khai báo biến myConnection trong từng trang là việc đơn giản thôi mà, không cần phải tìm cách khai báo biến toàn cục. Mình có ý kiến thế này :
- Bạn lưu chuỗi kết nối csdl vào file Web.Config trong phần Lấy chuỗi kết nối này như sau: ConfigurationManager.ConnectionStrings("MyConnectionString").ToString() Cuối cùng là việc khai báo biến myConnection trong từng trang là việc đơn giản thôi mà, không cần phải tìm cách khai báo biến toàn cục. Không bao giờ để connection string ở web.config hết. Nhất là lại dùng SQL authentication với tên đăng nhập và mật mã. Hackers có thể dễ dàng biết được bạn dùng cách gì để đăng nhập vào CSDL. Và dĩ nhiên, họ cũng có thể lấy được tên đăng nhập và mật mã. Nếu phải để connection string ở web.config, thì luôn luôn dùng encryption. Không bao giờ để connection string ở web.config hết. Nhất là lại dùng SQL authentication với tên đăng nhập và mật mã. Hackers có thể dễ dàng biết được bạn dùng cách gì để đăng nhập vào CSDL. Và dĩ nhiên, họ cũng có thể lấy được tên đăng nhập và mật mã. Nếu phải để connection string ở web.config, thì luôn luôn dùng encryption. Cứ là hacker là thích hack cái gì là hack được hả? nói như dq_ninh thì chắc hacker xâm nhập được vào ổ cứng lưu web ấy nhỉ =)) funy vãi Cái đó thì còn tùy. Nhưng chắc chắn có một điều, bạn làm cho một công ty, mà có cái connection string với user login name và mật mã nằm khơi khơi như vậy, thì xếp cho bạn về nhà đuổi gà cho vợ thôi. Trường hợp bạn là con dâu hay con rể của xếp thì khác, không bị đuổi. Nhưng chắc chắn sẽ nhận được nụ cười miếng chi cọp rất khinh bỉ của bạn đồng nghiệp khi họ nhìn thấy cái web.config đó. Cái đó thì còn tùy. Nhưng chắc chắn có một điều, bạn làm cho một công ty, mà có cái connection string với user login name và mật mã nằm khơi khơi như vậy, thì xếp cho bạn về nhà đuổi gà cho vợ thôi. Trường hợp bạn là con dâu hay con rể của xếp thì khác, không bị đuổi. Nhưng chắc chắn sẽ nhận được nụ cười miếng chi cọp rất khinh bỉ của bạn đồng nghiệp khi họ nhìn thấy cái web.config đó. Tên này điên điên. vô viện đi. Đang mất ngủ vào bàn nhảm, bà con đừng chém tui. Không bao giờ để connection string ở web.config hết. không để trong file webconfig thì cũng phải để ở 1 file nào đó thôi hà. Nếu phải để connection string ở web.config, thì luôn luôn dùng encryption. Cái này bạn nói đúng. Tên này điên điên. vô viện đi. Bạn này có lẽ còn trẻ hơn bạn dq_ninh mà, nói chuyện nhẹ nhàng hơn một chút nha. Scripted 24-07-2009, 01:54 Mình kô biết các bạn ra sao chứ mình lúc nào cũng để trong web.config hết ... nếu thằng host nó muốn lấy thì chịu thôi ... dùng encryption có thể slow down performance nhưng cũng tốt là làm encryption ... dù nó chôm được cái web.config cũng kô làm được gì. thông thường trong web.config của tui thì không có encryption nhưng trong username với password thì tui để $username $password ... sau đó khi initialize connection String ... tui gọi 1 cái method để replace($uername + password) với cái encrypted String đã set sẳng ... thay vì encrypted hết cái string ... tui chỉ replace ($username với pasword) thôi ... nếu lỡ hacker nó chôm hết website thì chịu thôi :) ... mà nói thiệt tui thấy đó giờ tui làm biết bao nhieu cái website có thấy hacker nào hackd dâu ... ngoại trừ đi chôm code (module) online rồi đi về sử sửa ... rồi khi nguoi ta ra version mới kô update lên ... rồi thì mấy anh hacker dzô forum đọc cách exploide ... rồi dzô fá bậy bạ dzị thôi! nếu đồ tự mình viết ra hacker mà muốn hack dzô ... cũng fải mất ăn mất ngủ á ... những gì chôm có free code thì dể bị hack hơn ... tại người ta có thể xem được cái logic. Để ở web.config mà khơi khơi thì không biết để ở đâu nữa. Chắc mình cũng về đuổi gà cho ... má. web.config được .NET mã hóa và bảo mật rất cao, không có chuyện hack được nó đâu dq_ninh. Hack được bảo mật của Host + bảo mật của .NET đi rồi tính, không phải hacker là thánh cái gì cũng làm được. Đây cũng là một phương pháp mà người ta hay dùng trên hầu hết các mạng không có giá trị để hack. Một mạng có giá trị để thu hút các tay hackers, dĩ nhiên không phải là mạng của tôi cũng như của bạn, cũng như hầu hết 90% các websites khác. Nhưng nếu bạn viết website cho các ngân hàng có cung cấp các dịch vụ chuyển tiền online thì lại khác. Hoặc một website tầm cỡ Amazon hàng năm buôn bán cả chục tỷ đô la thì lại khác. Còn cái chuyện để username/password trong config file, thật ra là một chuyện tầm phào/bố láo mà bất cứ một học sinh trung học đã học qua lập trình đều biết, đừng nói tới một lập trình gia chuyên nghiệp. Chỉ duy nhất một điều là hầu hết các admin của SQL cũng như của Windows đều theo quy tắc an toàn là bắt buộc các users phải thay đổi password mỗi tháng, hay ít nhất là ba tháng một lần. Không lẽ mỗi lần thay đổi password là mỗi lần phải vào sửa đổi config file? Nói tới hackers, nhiều người cứ nghĩ đến những source code có khả năng truy tầm password. Nhưng thật sự ra, 98% những tay hacke tìm ra được passwords mà không dùng bất cứ một phần mềm nào. Nói tới source code security là nói tới một phần mà có lẽ, phải học cả năm trời cũng chưa biết hết. Chẳng hạn như khi dùng một tham biến từ dạng char* trong C/C++, một chuyên gia về security cũng không bao giờ dùng tới một chuỗi char chấm dứt bằng null(0). Tại sao vậy? Tại vì các tay hackers có thể thay đổi các tham biến từ thuộc dạng chuỗi đó khi phần mềm đang chạy. Và đây chính là lý do tại sao Microsoft phải thay đổi tất cả các hàm string của họ trong C/C++ như strcpy, strcat qua strcpy_s, strcat_s, vận vân... Và nếu các bạn đọc document mới của bất cứ một hàm string của những hàm này, sẽ thấy ngay giòng sau đây: strcpy_s, wcscpy_s, _mbscpy_s Copy a string. These are versions of strcpy, wcscpy, _mbscpy with security enhancements as described in Security Enhancements in the CRT. Một hàm strcpy, được compile và chuyển thành binary code, mà còn có thể trở thành vô cùng không an toàn. Huống hồ chi nói đến cái chuyện để mật mã khơi khơi trong config file. Tất cả chúng ta đều vào đây để cùng học hỏi. Các bạn học hỏi, và tôi cũng học hỏi. Không ai có biết biết hết được tất cả. Cái chuyện để mật mã đó là tuyệt đối không nên làm, và tôi biết chắc chắn rằng như thế. Nhưng nếu có một vài bạn nào đó thích làm chuyện đó, thì cứ việc làm, đâu có ai cấm cản, đúng không? Nói chuyện như ông dq_ninh dễ tự ái quá. Chửi đổng kiểu đó còn mở miệng học với hỏi. Tôi không biết ông bao nhiêu tuổi nhưng nói giọng cha chú đó tôi hơi bị dị ứng. Ông để ở web.config bao nhiêu connection string, bao nhiêu user mà bắt user đổi? Cái này thường chỉ cho một truy cập duy nhất để đọc dữ liệu từ DB server và được .NET bảo mật khá cao, ông chui vào mà lấy được tui khen ông giỏi. Thêm một lợi điểm của web.config là admin có thể sửa đổi trực tiếp connection string on-the-fly mà không cần phải build lại application của mình trên server nếu DB có thay đổi. Nếu muốn bảo mật hơn, encrypt nó như là ý của Scripted và viết thêm một lớp để có thể thay đổi nó tự động, vậy là xong, rõ ràng là chẳng ai để plain text không hay. Nhưng nói để ở web.config là "chuyện tầm phào/bố láo" thì tôi cũng thua, chắc chỉ mình ông là "lập trình gia" chuyên nghiệp. Nói luôn cho hết, ông đem mấy cái Security của C Runtime vào đây thì nói tới năm sau cũng chưa hết. Chắc ông đang nghiên cứu Safe Library của nó hả :D Thêm phát: không biết ông lấy thông tin ở đâu mà 90% website rồi 98% hackers cái này cái kia, cho cái link đọc đi. Dạ thưa các anh. Nếu các anh không để connection string trong webconfig thì cũng ở File khác thôi.nhưng nếu để khơi khơi ra đơn giản nhất có chú nhân viên đi qua đá hình 1 cái khả năng các bác đền bù thiệt hại rất cao.THường bọn em hay mã hóa nó hì hì hì.Mong các bác đừng cãi nhau.Bảo mật rất cao nhưng chỉ là tương đối.Con người làm ra được thì con người cũng có khả năng can thiệp được. freshgraduate09 17-08-2010, 13:28 @dq_ninh: nhiều khi em cũng ko hiểu lắm ý của anh (hay chú ), nhưng rất quan tâm đến các post của anh, vì học hỏi được khá nhiều. Tiện thể em dùng cách trong trang này hướng dẫn để mã hóa 1 số key/value pairs trong web.config. http://www.beansoftware.com/ASP.NET-Tutorials/Encrypting-Connection-String.aspx anh có thể phân tích độ an toàn bảo mật của nó ko, đã đáp ứng đủ chưa câu hỏi khác: ở trên anh có nói "Nếu phải để connection string ở web.config, thì luôn luôn dùng encryption" vậy nếu em ko muốn lưu connection string ở web.config thì nên lưu ở đâu, cách thức tương tác? Ý tưởng của em: Viết 1 module, ở sự kiện tại thời điểm khi webserver bật lên, prompt admin: yêu cầu nhập các thông số kết nối, lưu các thông số này trên memory (chứ ko lưu trên file của hdd). Các thông số trên memory lưu vào biến ở global scope đối với ứng dụng web (mỗi công nghệ web sẽ có 1 tên gọi, nên em chỉ gọi chung là biến ở global scope). ví dụ em dùng J2EE thì sẽ làm 1 form yêu cầu system admin nhập vào user,pass,server,database_name và lưu vào biến application: application.setAttribute("key","value"); khi cần truy xuất kết nối thì lấy giá trị ra: application.getAttribute("key"); // return object Anh xem xét dùm em nhé. Thanks anh! @các bạn: Có thể bài viết ra là đúng nhưng không được công nhận nhưng forum cũng là nơi học hỏi trao đổi thôi, cuối cùng thế nào là do bản thân mình quyết định đâu cần phải dùng ngôn từ kích động sỉ nhục nhau như thế. Cái cách mà lưu connection string, user / pass ở dạng raw string như thế đúng thực là chỉ có học sinh sinh viên làm bài tập đồ án trong trường mới làm thôi phanhung1906 11-05-2011, 09:45 mirufa1121 27-08-2011, 10:41 nói như dq_ninh thì chắc hacker xâm nhập được vào ổ cứng lưu web ấy nhỉ =)) funy vãi thế theo như bạn nghĩ hacker là cái gì ? sonC0609k 28-08-2011, 00:27 encrypt connection string là chuẩn rồi cãi gì nữa mà cãi. ebookfinder 28-08-2011, 03:31 kakaka... Tất nhiên web.config là cách linh động nhất để ấn định thông số cho ứng dụng rồi, nó cũng giống như config.php hay wp-config.php vậy, nhưng nó được phía server "giữ kỹ" nhất có thể :) Cũng xin thưa các bác là encrypt cái web.config không hề tăng thêm 1 chút secure nào trên server side cả mà để secure nó against các đồng nghiệp trong cái team/phòng phát triển thôi, mà cty nào chẳng có loại này. Tại sao vậy? nếu hacker tấn công vào một ms-server bằng cách canh me cái chập chờn của ms mà lựm web.config về nghe mắc cừ quá :), vậy các bác cũng đoán được khi lấy đc web.config thì đã đứng ở đâu rồi chứ. Lại nữa, cái để decrypt ko nằm trong dll của người dùng thì cũng thuộc 1 add-in hệ thống, cũng chẳng cần bận tâm dịch ngược, mà dịch ngược managed dll đâu có khó, nhưng thả 1 chút xíu nguyên code .cs hay .vb để hòa vào cái app đó thì dễ hơn, ms đâu có cấm, thứ gì mà dump chẳng được. keke :) Còn cái chuyện để username/password trong config file, thật ra là một chuyện tầm phào/bố láo mà bất cứ một học sinh trung học đã học qua lập trình đều biết, đừng nói tới một lập trình gia chuyên nghiệp. Chỉ duy nhất một điều là hầu hết các admin của SQL cũng như của Windows đều theo quy tắc an toàn là bắt buộc các users phải thay đổi password mỗi tháng, hay ít nhất là ba tháng một lần. Không lẽ mỗi lần thay đổi password là mỗi lần phải vào sửa đổi config file? Nói tới hackers, nhiều người cứ nghĩ đến những source code có khả năng truy tầm password. Nhưng thật sự ra, 98% những tay hacke tìm ra được passwords mà không dùng bất cứ một phần mềm nào. Nói tới source code security là nói tới một phần mà có lẽ, phải học cả năm trời cũng chưa biết hết. Đọc tới đây như chợt thấy mặt trời, :) Đồng ý vì đã học 6 năm - nhiều bậc cũng chưa thấy biết gì ráo. Chẳng hạn như khi dùng một tham biến từ dạng char* trong C/C++, một chuyên gia về security cũng không bao giờ dùng tới một chuỗi char chấm dứt bằng null(0). Tại sao vậy? Tại vì các tay hackers có thể thay đổi các tham biến từ thuộc dạng chuỗi đó khi phần mềm đang chạy. Và đây chính là lý do tại sao Microsoft phải thay đổi tất cả các hàm string của họ trong C/C++ như strcpy, strcat qua strcpy_s, strcat_s, vận vân... Ôi trời ơi; (1) Phải chi bà con đang bàn cái vụ sql injection mà bác cho cái ví dụ trên thì còn kiêng nễ, thôi bỏ quá cũng được. (2) Nghe câu: "một chuyên gia về security cũng không bao giờ dùng tới một chuỗi char chấm dứt bằng null(0)" thì tôi giật cả mình; trong c/c++ mà ko dùng 0 kêt thúc chuỗi thì chẳng lẽ kết thúc chuỗi bằng con mắt à? Thêm nữa, bạn nên xem cách lợi dụng copy tràn vùng đệm để gửi mã độc nhé. Cũng xin thưa bạn là cái đám hàm c/c++ ***_s là do microsoft đẻ ra phục vụ cho những kẻ viết c/c++ bất cẩn. Thêm nữa, c/c++ đâu phải chỉ có ở windows, các hđh khác cũng dùng cả đấy thôi; ko bắt chước thêm hàm ***_s chẳng lẽ các hđh khác hỏng hết à? Xin nhắc là tại sao tôi nói 'những kẻ viết c/c++ bất cẩn'; lấy ví dụ viết web nhé, csdl MySql có trường họ tên 30 ký tự, cái php page cho người dùng nhập tên để lưu, thằng user nó nghịch nhập cái tên 100 ký tự, ko kiểm tra gì cả mà cứ thế tạo nguyên con sql statement tán vào database, nó báo lỗi. chưa nói đến trường hợp nó nhập 1 đoạn script, 1 thằng user vô tôi khác vô xem tên bị dẫn đi đâu đấy... đấy là người viết php bất cẩn Tất cả chúng ta đều vào đây để cùng học hỏi. Các bạn học hỏi, và tôi cũng học hỏi. Không ai có biết biết hết được tất cả. Cái chuyện để mật mã đó là tuyệt đối không nên làm, và tôi biết chắc chắn rằng như thế. Nhưng nếu có một vài bạn nào đó thích làm chuyện đó, thì cứ việc làm, đâu có ai cấm cản, đúng không? Đúng, có thể bạn biết nhờ đọc lóang thoáng ở đâu đó, hoặc nhờ ai đó nói qua cho nghe nhưng thực sự bạn chưa hiểu đến ngọn nguồn. Rất cần học hỏi thêm. ebookfinder 28-08-2011, 03:47 Mình mới làm quen lập trình với ASP.NET. Vấn đề mình muốn hỏi ở đây là làm sao để khai báo một biến toàn cục để các trang có thể sử dụng mà không cần phải khai báo từ đầu. Ví dụ như một biến kết nối vào CSDL: Dim myConnection As OleDbConnection myConnection = New OleDbConnection(ConnStr) Mình muốn khai báo biến myConnection để tất cả các trang có thể sử dụng không cần phải khai báo lại từ đầu. Bạn nào biết xin chỉ giáo. Cảm ơn nhiều! .net tuyệt đối là OOP, vì vậy ko có chuyện thả 1 biến kinh điển nằm lang thang; tất cả phải đóng gói vào lớp và thể hiện ra bằng đối tượng. Nếu bạn có khả năng quản lý ứng dụng theo các mức lớp đối tượng thì bạn có thể đặt biến như property trong 1 lớp đối tượng cụ thể; ví dụ biến đó có thể đặt và dùng trong 1 thread thì lớp Page của trang web là quá đủ. Nhưng nếu liên quan events (cái này LAMP ko có) ngoài page (Render after the page generated) thì dùng lớp Application, nếu xuyên application thì dùng httpHandler. Nếu bạn thấy như thế rối quá thì làm 1 lớp static để khai thác ở đâu cũng được, hoặc ẹ quá cho vào session. Riêng về connection, bạn biết tại sao MS nó khoe cái công nghệ databases connectionless này rồi chứ; tốt nhất là: mở ra - dùng ngay - đóng lại nhanh chóng, đừng có để cái connection object lê la, nên nhớ bạn đang lập trình web, mà website chắc ko phải chỉ có 1 người. Nếu 1 ngày bạn thuê cái shared economy hosting của godaddy nó cho 50 concurrent connections mỗi lúc thì bạn sẽ điên đầu vì cái cách bạn đang muốn làm đấy. PS. Bạn để ý trong các lệnh tạo object dùng dbconnection, ms nó thòng thêm 1 option trong tham số thứ 3 hay 4 gì đó, giúp tự động đóng db connection khi đối tượng sử dụng bị clear. bongbingo 28-08-2011, 19:28 Mình mới làm quen lập trình với ASP.NET. Vấn đề mình muốn hỏi ở đây là làm sao để khai báo một biến toàn cục để các trang có thể sử dụng mà không cần phải khai báo từ đầu. Ví dụ như một biến kết nối vào CSDL: Dim myConnection As OleDbConnection myConnection = New OleDbConnection(ConnStr) Mình muốn khai báo biến myConnection để tất cả các trang có thể sử dụng không cần phải khai báo lại từ đầu. Bạn nào biết xin chỉ giáo. Cảm ơn nhiều! theo mình thì việc khai báo toàn cục như bạn hungtvht là bạn í thấy việc open connection phải sử dụng đi sử dụng lại nên muốn khai báo 1 biến toàn cục để đỡ mất công khai báo --> giảm code. việc này bạn hoàn toàn có thể sử dụng trong Global.asax (có thể khai báo trong session start hoặc application start) tùy theo nhu cầu của bạn bạn có thể tìm hiểu thêm Global.asax (xem thêm tại http://msdn.microsoft.com/en-us/library/2027ewzw.aspx) Tuy nhiên việc khai báo như vậy sẽ dẫn đến việc open connection đến CSDL nếu không quản lý các connection này sẽ dẫn đến việc connection không được giải phóng --> web sẽ chạy chậm hoặc nặng hơn là sẽ bị treo cả hệ thống. bạn nên xem thêm bộ dọn rác của .net (garbage collection) và tại sao connection không tự hủy nhé. Cho nên theo mình thì nên thực 1 class quản lý connection đến CSDL (open, close) sau đó chỉ kế thừa là xong (các project sau cứ copy class này vào là xong) |