Thứ Năm, 14 tháng 10, 2021

[ASP.NET][IIS] Error CS0016: Could not write to output file ....

 Lỗi liên quan tới compiler csc của .NET Framework

Compiler Error Message: CS0016: Could not write to output file 'c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\3ab7b770\3750c939\en-US\App_GlobalResources.l8frv07t.resources.dll' -- 'Access is denied. '


Với lỗi này có 2 nguyên nhân

1. Thư mục Temp của ASP.NET không có quyền write, cần kiểm tra lại
2. Thư mục C:\Windows\Temp không có quyền write. Cần kiểm tra lại

Nếu đã đảm bảo 2 yếu tố trên mà vẫn lỗi thì có thể áp dụng.

thêm vào web.config :

<identity impersonate="true" userName="devdomain\youruser" password="yourpassword" />

Sau đó cấp full quyền cho user devdomain\yourusername vào thư muc Temp của ASP.NET

Thứ Năm, 9 tháng 9, 2021

[ASP.NET][MSSQL] Web ASP truy vấn SQL chậm qua network

Tình huống khi website asp.net truy cập chậm có liên quan đến truy vấn sql khi server web và server sql thuộc 2 server khác nhau

Quá trình kiểm tra lưu lượng network nếu sử dụng bandwidth nhiều mỗi lần có truy vấn database . Và kiểm tra Resource Waits trên SQL chỉ số Network I/O cao, có nghĩa là ứng dụng (application) không sử dụng hết lưu lượng dữ liệu mà SQL trả về, dẫn tới bị nghẽn cổ chai. mặc dù bandwidth network còn rất rộng và chưa sử dụng hết.

Để cải thiện, có thể kiểm tra cài đặt MARS trong ConnectionString.

MultipleActiveResultSets=True

Nếu có sử dụng thông số này thì bỏ đi hoặc set lại thành False.


Kếu quả Test thực tế trước và sau khi bỏ MultipleActiveResultSets : TTFB trang web giảm 1 nửa, bandwidth network tăng gấp đôi.




[ASP.NET] Xử lý lỗi Could not load file or assembly “*****” or one of its dependencies.

I. Lỗi Could not load file or assembly “*****” or one of its dependencies. Access is denied. ví dụ như ảnh dưới


Lỗi này là Access is denied nên không liên quan tới việc sai version.  Nếu sai version khai báo trong code thì lỗi sẽ phải có nội dung như sau “The located assembly’s manifest definition does not match the assembly reference”

Access is denied : xảy ra do 1 số nguyên nhân sau.


  • File dll bị lock truy cập, có thể kiểm tra process iis hoặc antivirus
  • Thư mục ASP.NET Temp không có quyền ghi đối với user chạy web (lỗi này thường gặp hơn)

Thư mục ASP.NET Temp mặc định sẽ ở đường dẫn C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files

hoặc :

C:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files

Cần kiểm tra quyền write/read cho user chạy web (là user indentity của pool chứa website) cho thư mục ASP.NET Temp trên

Một số trường hợp thử mục ASP.NET Temp này sẽ được khai báo lại, không sử dụng thư mục mặc định của Window nữa. Ví dụ sử dụng Plesk Obsidian 18.x , xem trong web.config của site sẽ có mục khai báo như sau

<compilation tempDirectory=”D:\vhosts\aireal.vn\tmp” />

Với trường hợp này thì cần set quyền read/write cho user chạy web (là user indentity của pool chứa website) lên thư mục temp được khai báo trong web.config của website



II. Lỗi Could not load file or assembly ‘*****’ or one of its dependencies. The located assembly’s manifest definition does not match the assembly reference.


The located assembly’s manifest definition does not match the assembly reference : xảy ra do nguyên nhân là


  • phiên bản (version) của file thư viên (dll) không khớp với khai báo trong web.config.

Lỗi này thường xảy ra khi update code mới nhưng quyên khai báo lại phiên bản thư viện cho đúng với file đang sử dụng.

Trường hợp lỗi này bắt buộc phải sửa lại khai báo trong web.config cho đúng mới chạy được

  • Server không hỗ trợ thư viện mà Khách hàng sử dụng. Trường hợp này là những thư viện bắt buộc phải register vào registry của Window, đây là những loại thư viện bắt buộc phải setup trên server , ví dụ như thư viện của bộ ứng dụng văn phòng Office.

Could not load file or assembly ‘Microsoft.Office.Interop.Excel, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c’ or one of its dependencies. The located assembly’s manifest definition does not match the assembly reference

III . Could not load file or assembly ‘**** or one of its dependencies. The system cannot find the file specified


The system cannot find the file specified : Xảy ra khi bị thiếu file thư viện. Nguyên nhân thường do khi upload source bị thiếu file, cần kiểm tra thông báo lỗi tên gì và đối chiếu với source xem có file đó tồn tại trong thư mục bin của source code hay không

Thứ Tư, 4 tháng 8, 2021

[ASP.NET] kiểm tra , chuẩn đoán lỗi net::ERR_HTTP2_PROTOCOL_ERROR

 Với lỗi net::ERR_HTTP2_PROTOCOL_ERROR  xảy ra với ajax jquery XMLHttpRequest  thông thường nguyên nhân không liên quan tới HTTP2. 

Nguyên nhân chính dẫn tới lỗi này thường là do lỗi khi thực thi code trên website, hoặc do bị reset connection.

Nếu disable HTTP2 và để chạy HTTP1.1 mà theo dõi có phát sinh lỗi net::ERR_CONNECTION_RESET  thì nguyên nhân chính sẽ là do thời điểm đó kết nối bị mất không có phản hồi từ server dẫn tới code ajax timeout không nhận được responsed và trả về lỗi net::ERR_HTTP2_PROTOCOL_ERROR


Các bước để chuẩn đoán :

- Kiểm tra window eventlog "Application" xem có lỗi gì liên quan website hay không

- Kiểm tra window eventlog "System" xem có thông tin liên quan tới lỗi application pool của website hay không (Source WAS). nếu có log như sau thì đây là nguyên nhân

A process serving application pool 'xxx' suffered a fatal communication error with the Windows Process Activation Service. The process id was 'yyy'. The data field contains the error number.

Để kiểm tra chi tiết hơn thì cần sử dụng công cụ DebugDiag, chọn mục "Crash" -> "A Special IIS Web Application pool". Sau đó chọn pool để theo dõi. Khi nào có dump file thì dùng DebugDiag Analysis để mở lên xem chi tiết . Ví dụ như ảnh dưới



Tham khảo thêm

31623G9043 : lỗi do thiếu quyền ghi log file

39VTD27590 : Lỗi code gây crash pool.

Thứ Hai, 21 tháng 6, 2021

[ASP.NET] Read , Write Excel file với thư viện của MS Office

Một số lập trình viên hay sử dụng bộ thư viện Interop.Microsoft.Office.Interop.Excel.dll của MS Office để xử lý file Excel (VD : import, export dữ liệu từ file Excel)

Với thư viện này bắt buộc trên máy chủ phải có cài đặt (install) MS Office. Nếu không khi chay sẽ báo lỗi như bên dưới 

Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))


Đối với thư viện Microsoft cũng khuyên cáo không sử dụng và không được Microsoft hỗ trợ để chạy cùng với các ứng dụng ngoài khác (bao gồm ASP, ASP.NET )


"Microsoft does not currently recommend, and does not support, Automation of Microsoft Office applications from any unattended, non-interactive client application or component (including ASP, ASP.NET, DCOM, and NT Services), because Office may exhibit unstable behavior and/or deadlock when Office is run in this environment."

https://support.microsoft.com/en-us/topic/considerations-for-server-side-automation-of-office-48bcfe93-8a89-47f1-0bce-017433ad79e2

Nếu bạn buộc phải sử dụng thư viện này và không thể thay đổi thì cần sử dụng VPS riêng để có thể cài đặt MS Office. 

Hoặc có thể tham khảo các thử viện khác hỗ trợ thao tác trên file Excel

https://nugetmusthaves.com/Tag/excel

https://www.codeproject.com/Articles/1088970/Read-Write-Excel-file-with-OLEDB-in-Csharp-without

https://github.com/ExcelDataReader/ExcelDataReader



[Linux] Một số câu lệnh kiểm tra server khi bị tấn công DDoS

– Kiểm tra số connection trên port 80:
Code:
netstat -n | grep :80 |wc -l
 
– Kiểm tra số lượng connection đang ở trạng thái SYN_RECV:
Code:
netstat -n | grep :80 | grep SYN_RECV|wc -l
 
– Hiển thị tất cả các IP đang kết nối và số lượng kết nối từ mỗi IP:
Code:
netstat -an|grep :80 |awk '{print $5}'|cut -d":" -f1|sort|uniq -c|sort -rn
 
Nếu muốn kiểm tra IP nào mở nhiều SYN thì thêm vào:
Code:
netstat -an|grep :80|grep SYN |awk '{print $5}'|cut -d":" -f1|sort|uniq -c|sort -rn
 
– Đối với server có nhiều IP, để kiểm tra IP nào đang bị tấn công:
Code:
netstat -plan  | grep  :80 | awk '{print $4}'| cut -d: -f1 |sort |uniq -c

Thứ Năm, 4 tháng 3, 2021

[MSSQL] Tìm giá trị chuỗi trong Database SQL Server

Để tìm 1 giá trị dạng text (chuỗi) trong toàn bộ table trong Database SQL Server.


USE DATABASE_NAME

DECLARE @SearchStr nvarchar(100) = 'SEARCH_TEXT'

DECLARE @Results TABLE (ColumnName nvarchar(370), ColumnValue nvarchar(3630))

SET NOCOUNT ON

DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110)

SET  @TableName = ''

SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''')

WHILE @TableName IS NOT NULL

BEGIN

    SET @ColumnName = ''

    SET @TableName = 

    (

        SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))

        FROM     INFORMATION_SCHEMA.TABLES

        WHERE         TABLE_TYPE = 'BASE TABLE'

            AND    QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName

            AND    OBJECTPROPERTY(

                    OBJECT_ID(

                        QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)

                         ), 'IsMSShipped'

                           ) = 0

    )

    WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)

    BEGIN

        SET @ColumnName =

        (

            SELECT MIN(QUOTENAME(COLUMN_NAME))

            FROM     INFORMATION_SCHEMA.COLUMNS

            WHERE         TABLE_SCHEMA    = PARSENAME(@TableName, 2)

                AND    TABLE_NAME    = PARSENAME(@TableName, 1)

                AND    DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar', 'int', 'decimal')

                AND    QUOTENAME(COLUMN_NAME) > @ColumnName

        )

        IF @ColumnName IS NOT NULL

        BEGIN

            INSERT INTO @Results

            EXEC

            (

                'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630) 

                FROM ' + @TableName + ' (NOLOCK) ' +

                ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2

            )

        END

    END    

END

SELECT ColumnName, ColumnValue FROM @Results


Ngoài ra, có thể sử dụng ApexSQL Search miễn phí trên SSMS : https://www.apexsql.com/sql-tools-search.aspx


Thứ Tư, 20 tháng 1, 2021

[Linux] Chống DDOS hiệu quả với cài đặt và cấu hình CSF Firewall

Trước khi cấu hình CSF, ta tìm hiểu các quy ước về thông số:

Tất cả các file cấu hình csf nằm ở: /etc/csf/

– Các tham số khi cấu hình có dạng ARGS = “VALUE” , trong đó
+ VALUE = “0″ => Disable (Tắt)
+ VALUE = “1″ => Enable (Bật)
+ VALUE > 1 (VALUE = “10″ , VALUE = “60″ … ) : giới hạn tối đa.
+ VALUE >1 (VALUE = “3600″ , VALUE = “7200″ … ) : thời gian tối đa.

Ta bắt đầu thực hiện config CSF. Bạn hãy mở file: csf.conf và chỉnh sủa theo hướng dẫn bên dưới:

Mặc định khi cài xong CSF thì TESTING = “1″, với TESTING = “1″ thì LFD daemon (Login Fail Detect daemon) sẽ không hoạt động, do đó nếu VPS/server bị tấn công thì CSF cũng sẽ không block IP tấn công.

Thời gian chạy cronjob để clear iptables nếu như TESTING=1 , tính bằng phút.

tắt chế độ auto update của CSF.

Cho phép kết nối TCP qua các cổng: Dùng cho các dịch vụ SSH, sendmail, DNS, Web trên server. (nếu bạn không sử dụng https và email có thể bỏ 25 và 443)

Cho phép kết nối từ VPS/Server ra bên ngoài: cho phép server kết nối đến web server, sendmail server khác.

cho phép người dùng sử dụng dịch vụ DNS trên server.

cho phép server truy vấn DNS bên ngoài.

Cho phép người dùng thực hiện lệnh ping đến server.

nếu để giá trị này thấp thì khi ping sẽ nhận được giá trị request time out.

Mặc định csf sẽ cấu hình iptables để filter traffic trên toàn bộ các card mạng , ngoại trừ card loopback . Nếu như bạn muốn rules iptables chỉ applied vào card mạng “eth0″ thì khai báo ở đây.

Nếu bạn không muốn rules iptables không applied vào card mạng nào thì khai báo ở đây. Ví dụ card “eth1″ là card local , bạn không muốn filter trên card này thì cấu hình như trên.

“
Giới hạn số lượng IP bị block “vĩnh viễn” bởi CSF (các IP này được lưu trong file /etc/csf/csf.deny).
Con số này để 200 nếu bạn sử dụng VPS và 500 nếu bạn sử dụng server.
Khi số lượng IP bị block vượt qua con số này , csf sẽ tự động unblock IP cũ nhất.

Enable tính năng Login fail detection.

Tự động restart CSF khi csf bị stop.

Filter các gói tin TCP không hợp lệ… )

Disable IPV6 support

Bật chức năng synflood protection : Nếu 1 IP gửi 30 cú SYN trong vòng 1s và số lượng SYN connection tồn tại trên server đạt trên 40 thì block IP đó (block tạm thời (temp))

Giới hạn số lượng new concurrent connection đến server trên mỗi IP.
Ví dụ trên có nghĩa : mỗi IP được phép mở 20 concurrent new connection đến port 80 trên server.

Giới hạn số lượng connection đến một port cụ thể trong một khoảng thời gian nhất định. Ví dụ như trên có nghĩa : nếu nhiều hơn 20 kết nối tcp đến port 80 trong vòng 5s thì block IP đó tối thiểu 5s tính từ packet cuối cùng của IP đó. Sau 5s IP đó sẽ tự động được unlock và truy cập bình thường.

Danh sách các port khi bị drop sẽ không cần phải ghi vào log

Ghi log các IP vượt quá giới hạn CONNLIMIT cấu hình ở bước trên.

Mặc định toàn bộ email thông báo sẽ được gửi về root của server . Nếu bạn muốn gửi đến địa chỉ email khác thì khai báo ở đây.

Enable tính năng block vĩnh viễn một IP . Nếu một IP bị temp ban (ban tạm) 6 lần khi vi phạm các rule sẽ block ip này 86400s ( 1 ngày) đồng thời gửi email về cho ngừoi quản trị biết.

Enable tính năng Login Fail Detect cho từng dịch vụ cụ thể (được khai báo bên dưới)

Khi LF_TRIGGER = “1″ thì có thể enable LF_TRIGGER_PERM để kích hoạt block IP permanent
+ LF_TRIGGER_PERM = “1″ => IP sẽ bị block permanent
+ LF_TRIGGER_PERM = “86400″ => IP sẽ bị block 1 ngày

Khi một IP vi phạm các rule của LFD thay vì block toàn bộ traffic từ IP này đến server thì chỉ block traffic đến dịch vụ mà IP này login fail (ví dụ login ftp sai nhiều lần thì block truy cập đến FTP nhưng vẫn cho phép truy cập vào website)

Gửi email thông báo nếu một IP bị block bởi các trigger bên dưới

Nếu login SSH sai 5 lần thì sẽ bị block IP (temp block)
Nếu bị temp block lớn hơn số lần quy định ở LF_PERMBLOCK_COUNT (cấu hình bước trên ) thì sẽ block permanent.

Không kích hoạt login fail detect cho dịch vụ FTP.

Tương tự cho các dịch vụ còn lại bên dưới ( SMTP , POP3 , IMAP , .htpasswd , mod_security … )

Không gửi email thông báo khi có một ai đó login thành công thông qua SSH

LF_SU_EMAIL_ALERT = “0″
Không gửi email thông báo khi có một người dùng “su” (switch user) qua người dùng khác. Không gửi email khi họ dùng lệnh “su” , bất kể “su” thành công hoặc thất bại.

LFD sẽ check thư mục /tmp và /dev/shm định kỳ sau mỗi 3600s , nếu phát hiện ra các file nghi vấn là file độc hại sẽ gửi email thông báo đến cho chúng ta. Thường thì trên server thư mục, /temp và /dev/shm phân quyền cho phép mọi người dùng có quyền ghi trên thư mục này , do đó các attacker lợi dụng điều này để ghi mã độc vào đây (các file để back connect , local root exploit … )

Khi phát hiện ra các file nghi vấn ở thư mục /tmp và /dev/shm sẽ mv chúng khỏi 2 thư mục trên và append vào file /etc/csf/suspicious.tar , thuận tiện cho chúng ta theo dõi , phân tích về sau và phần nào vô hiệu hóa cuộc tấn công của attacker.

Theo dõi sự thay đổi của các file và thư mục , nếu có thay đổi gửi email thông báo về cho chúng ta. Để theo dõi file/thư mục nào thì add chúng vào file csf.dirwatch. Cấu hình như trên thì 60s chạy 1 lần.

Kiểm tra tính toàn vẹn của hệ điều hành bằng cách so sánh MD5 của các file binary khi LFD start với MD5 của các file đó lúc kiểm tra. Nếu khác nhau thì sẽ gửi email thông báo. Tính năng này có thể sẽ hoạt động không chính xác khi hệ thống update và sẽ tăng I/O , load của server do phải tính toán MD5 rất nhiều lần.

Phát hiện tấn công brute force từ mạng botnet. Nếu như một account bị login sai quá giới hạn cho phép từ nhiều IP khác nhau thì sẽ block toàn bộ IP đã login sai.

Số lượng IP tối thiểu để nhận biết đây là tấn công phân tán (DDOS).

Block login POP3 nếu một account được login nhiều hơn 30 lần trong 1 giờ từ 1 IP. Tương tự cho LT_IMAPD.

Send email khi một account vượt quá giới hạn cho phép của LT_IMAPD và LT_POP3D

Không áp dụng permanent block cho LT_POP3D/LT_IMAPD

Giới hạn số lượng connection từ một IP đến server . Nếu số lượng đó vượt quá 300 thì temp block IP đó.

Các lần scan để kiểm tra cách nhau 30s.

Gửi email thông báo nếu một IP bị block bởi connection tracking.

Disable block permanent cho connectiong tracking.

Thời gian block một IP nếu như vi phạm Connection tracking limit.

Khi đếm số lượng connection từ 1 IP đến server thì bỏ qua trạng thái TIME_WAIT của connection , không đếm trạng thái này.

Chỉ đếm các kết nối ở trạng thái SYN_RECV

Chỉ áp dụng connection tracking cho các kết nối đến port 80 và 443.

Trong 500s nếu kết nối đến nhiều hơn 15 port không có trên server sẽ block IP đó.

Giới hạn range port sẽ được theo dõi.

IP bị block bởi Port Scan Tracking sẽ là temp block hoặc là permanent :
PS_PERMANENT = “0″ : IP bị temp block
PS_PERMANENT = “1″ : IP bị block permanent.

Nếu PS_PERMANENT = “0″ thì đây là thời gian temp block của một IP.

Gửi email thông báo khi có một IP bị block.

sau khi thực hiện config xong cấu hình CSF. Bạn phải restart lại CSF để thay đổi có hiệu lực.

Lệnh restart csf:

Vậy là bạn đã hoàn thành cài đặt và cấu hình CSF cho VPS/Server của mình.