@manhng

Welcome to my blog!

Music Store

January 13, 2022 15:00

Music Store (edit)

richard-coffey/MusicStore (github.com) (.NET Core)

FanHuaRan/Musicstore-ASP.NET-MVC5 (github.com) (.NET)

Continuous Delivery Project - Making MVCMusicStore Testable (tiernok.com) (Unit Testing)

kendo-examples-asp-net/grid-webapi-crud-cors at master · telerik/kendo-examples-asp-net (github.com) (CRUD WebAPI)

kendo-examples-asp-net/grid-webapi-odata-crud at master · telerik/kendo-examples-asp-net (github.com)

kendo-examples-asp-net/grid-webapi-crud at master · telerik/kendo-examples-asp-net (github.com)

kendo-examples-asp-net/grid-web-service-crud at master · telerik/kendo-examples-asp-net (github.com)

Microsoft ASP.NET MVC Music Store Tutorial

dnkato/MvcMusicStore-Tutorial: Microsoft ASP.NET MVC Music Store Tutorial (github.com)

  • ASP.NET 4.6.1
  • ASP.NET MVC 5.x
  • ASP.NET Identity
  • Owin

evilDave/MVC-Music-Store: A fork of mvcmusicstore.codeplex.com that can be deployed to Diffusyn (github.com)

SebastiaanLubbers/MvcMusicStore: MVC Music Store is a tutorial application built on ASP.NET MVC. It's a lightweight sample store which demonstrates ASP.NET MVC using Entity Framework. (github.com)

sagulati/MvcMusicStore: Old asp.net MVC Music Store sample app. (github.com)

  • net40
  • DotNetOpenAuth.OAuth
  • Microsoft.Data.OData
  • ASP.NET Membership

AlexL70/MVCMusicStore: Nothing special. Just another ASP.NET MVC Music Store application. For training purposes only. More or less the same as this http://mvcmusicstore.codeplex.com/ one. (github.com)

  • Owin
  • ASP.NET Identity

rally25rs/KendoWcfSample: Sample: Kendo UI and WCF Data Services 5.1 OData (github.com)

jesuswasrasta/MvcMusicStore: MVC Music Store is a tutorial application built on ASP.NET MVC. It's a lightweight sample store which demonstrates ASP.NET MVC using Entity Framework. (github.com)

dmcrock/MVCMusicStore: ASP.net MVC3 music store application (github.com)

KSchlobohm/MVC-Music-Store (github.com)

FanHuaRan/Musicstore-ASP.NET-MVC5 (github.com)

  • ASP.NET MVC5
  • EntityFramework 6 (Code First)

ASP.Net MVC Music Store Tutorial CSS Layout issue - Stack Overflow

  • StyleSheet

nickyquinn/DemoDotNetNLayer: A demo N-Tier app (github.com)

  • AutoMapper
  • DTO
This project demonstrates how to perform CRUD operations using Web API and Kendo Grid for ASP.NET MVC. 

Binding to a Web ApiController in UI for ASP.NET MVC Grid - Telerik Code Libraries

Custom Membership and Role Provider

How to configure Custom Membership and Role Provider using ASP.NET MVC | LogCorner.com (HAY HAY HAY HAY HAY)

Custom Membership with MySQL

6.2.1 Tutorial: Connector/NET ASP.NET Membership and Role Provider (oracle.com)

Oracle Providers for ASP.NET

  • Oracle Developer Tools for Visual Studio
  • Oracle Data Provider for .NET
  • Oracle Providers for ASP.NET

The Oracle Membership Provider uses only the old MembershipProvider and does not use a UserProfile table or Oauth features.

You can install the oracle asp tables by using the SQL files included in your installation

Oracle Providers for ASP.NET Installation

Using Oracle Providers for ASP.NET

Oracle Providers for ASP.NET

Oracle.Web.dll

ORACLE_BASE\ORACLE_HOME\ASP.NET\sql

  • InstallOracleSessionState.sql (Oracle Membership Provider)
  • InstallOracleRoles.sql (Oracle Role Provider)
  • InstallOracleSessionState.sql (Oracle Session State Provider)

Oracle Providers for ASP.NET support this service provider mechanism allowing application state storage within an Oracle database. Existing ASP.NET provider developers will discover the Oracle Providers for ASP.NET are easy to learn and use as they share a common schema and API with existing ASP.NET providers. They integrate seamlessly with existing ASP.NET services and controls, just like other ASP.NET providers. 

Oracle offers the following providers:

  • Membership Provider
  • Role Provider
  • Site Map Provider
  • Session State Provider
  • Profile Provider
  • Web Events Provider
  • Web Parts Personalization Provider
  • Cache Dependency Provider

Building Secure ASP.NET Applications

Building Secure ASP.NET Applications (purdue.edu) (eBook) (HAY HAY HAY)

Custom Membership Provider - HAY HAY HAY

Custom Membership and Role Providers - CodeProject (HAY HAY HAY HAY HAY)

How to Create Your Own Membership Provider Instead of Using SqlMembershipProvider (.NET) | Spiria (HAY HAY HAY HAY HAY)

  • AspNetSqlMembershipProvider
  • SqlMembershipProvider
  • System.Web.Security.SqlMembershipProvider

Using Oracle Providers for ASP.NET ~ ASP.Net Examples (anagaraju.blogspot.com)

Oracle Providers for ASP.NET Installation (HAY HAY HAY HAY HAY)

ASP.NET MVC - Set custom IIdentity or IPrincipal - Stack Overflow (HAY HAY HAY HAY HAY)

Custom Membership with OLE DB and MS Access

How to configure Custom Membership and Role Provider using ASP.NET MVC | LogCorner.com

ASP.NET 2.0 Membership and Role providers for Microsoft Access (binarywater.com) (HAY HAY HAY)

View PDF file in ASP.NET MVC

.net - Pdf Viewer in MVC to show the pdf contents in View - Stack Overflow

Display (Show) PDF file embedded in View in ASP.Net MVC Razor (aspsnippets.com)

How To Open PDF File In New Tab In MVC Using C# (c-sharpcorner.com)

Create and Download PDF in ASP.NET MVC5 (completecsharptutorial.com)

asp.net - How to display PDF in div for a particular id using MVC? - QA With Experts

1.8 Oracle Providers for ASP.NET Object References

The schema in which the user runs the SQL installation script owns the tables, views, roles, stored procedures, and synonyms that the SQL script creates.

The following schema objects and their tabled information provide descriptions of what privileges each role provides, as well as the relationship between the ASP.NET service methods and the Oracle stored procedure or function.

This section lists the following objects:

1.8.1 Tables

Table 1-3 lists the tables that are used by each provider.

Table 1-3 Provider Tables

Oracle Provider Table

Membership

ora_aspnet_Membership

ora_aspnet_Applications

ora_aspnet_Users

Role

ora_aspnet_Roles

ora_aspnet_UsersInRoles

ora_aspnet_Applications

ora_aspnet_Users

Profile

ora_aspnet_Profile

ora_aspnet_Applications

ora_aspnet_Users

Personalization

ora_aspnet_Paths

ora_aspnet_PersonaliznAllUsers

ora_aspnet_PersonaliznPerUser

ora_aspnet_Applications

ora_aspnet_Users

Web Events

ora_aspnet_WebEvents

Site Map

ora_aspnet_SiteMap

ora_aspnet_Applications

Session State

ora_aspnet_SessionApplications

ora_aspnet_Sessions

1.8.2 Roles

There are, at most, three types of database roles created for each provider:

  • BasicAccess - Provides a database user with access to the provider's basic functionality.

  • ReportAccess - Provides a database user with report-oriented data gathering capabilities for a provider.

  • FullAccess - Provides a database user with access to all the database objects associated with a provider.

Table 1-4 lists the roles created for each provider.

Table 1-4 Roles and Privileges

Oracle Provider Oracle Database Role

Membership

ora_aspnet_Mem_BasicAccess

ora_aspnet_Mem_ReportAccess

ora_aspnet_Mem_FullAccess

Role

ora_aspnet_Roles_BasicAccess

ora_aspnet_Roles_ReportAccess

ora_aspnet_Roles_FullAccess

Profile

ora_aspnet_Prof_BasicAccess

ora_aspnet_Prof_ReportAccess

ora_aspnet_Prof_FullAccess

Personalization

ora_aspnet_Pers_BasicAccess

ora_aspnet_Pers_ReportAccess

ora_aspnet_Pers_FullAccess

Web Events

ora_aspnet_Wevnt_FullAccess

Site Map

ora_aspnet_Smap_FullAccess

Session

ora_aspnet_Sessn_FullAccess

1.8.3 Views

The following tables show the views that are created for each provider. The tables also list the provider-specific database roles that provide access to these views.

1.8.3.1 OracleMembershipProvider Views

Table 1-5 lists the roles and the view access that the roles provide.

Table 1-5 OracleMembershipProvider

Role View

ora_aspnet_Mem_BasicAccess

(none)

ora_aspnet_Mem_ReportAccess

ora_vw_aspnet_Applications

ora_vw_aspnet_Users

ora_vw_aspnet_MemUsers

ora_aspnet_Mem_FullAccess

ora_vw_aspnet_Applications

ora_vw_aspnet_Users

ora_vw_aspnet_MemUsers

1.8.3.2 OracleRoleProvider Views

Table 1-6 lists the roles and the view access that the roles provide.

Table 1-6 OracleRoleProvider

Role View

ora_aspnet_Roles_BasicAccess

(none)

ora_aspnet_Roles_ReportAccess

ora_vw_aspnet_Applications

ora_vw_aspnet_Users

ora_vw_aspnet_Roles

ora_vw_aspnet_UIR

ora_aspnet_Roles_FullAccess

ora_vw_aspnet_Applications

ora_vw_aspnet_Users

ora_vw_aspnet_Roles

ora_vw_aspnet_UIR

1.8.3.3 OracleProfileProvider Views

Table 1-7 lists the roles and the view access that the roles provide.

Table 1-7 OracleProfileProvider

Role View

ora_aspnet_Prof_BasicAccess

(none)

ora_aspnet_Prof_ReportAccess

ora_vw_aspnet_Applications

ora_vw_aspnet_Users

ora_vw_aspnet_Profiles

ora_aspnet_Prof_FullAccess

ora_vw_aspnet_Applications

ora_vw_aspnet_Users

ora_vw_aspnet_Profiles

1.8.3.4 OraclePersonalizationProvider Views

Table 1-8 lists the roles and the view access that the roles provide.

Table 1-8 OraclePersonalizationProvider

Role View

ora_aspnet_Pers_BasicAccess

(none)

ora_aspnet_Pers_ReportAccess

ora_vw_aspnet_Applications

ora_vw_aspnet_Users

ora_aspnet_Pers_FullAccess

ora_vw_aspnet_Applications

ora_vw_aspnet_Users

1.8.3.5 OracleSessionStateStore Views

Table 1-9 lists the roles and the view access that the roles provide.

Table 1-9 OracleSessionStateStore

Role View

ora_aspnet_Sessn_FullAccess

ora_vew_aspnet_sessions

1.8.4 Stored Procedures

The following tables list provider-specific database roles and the stored procedures for which the roles provide execution privilege. The tables also list the corresponding ASP.NET service methods that invoke the stored procedures.

1.8.4.1 OracleMembershipProvider Stored Procedures

Table 1-10 lists the service methods and stored procedures that a user with the ora_aspnet_Mem_BasicAccess role can execute.

Table 1-10 ora_aspnet_Mem_BasicAccess Role

Service Method Stored Procedure

GetNumberOfUsersOnline

ora_aspnet_Mem_GetNumOfUsersOn

GetPassword

ora_aspnet_Mem_GetPassword

GetUser

ora_aspnet_Mem_GetUserByUid

ora_aspnet_Mem_GetUserByName

GetUserNameByEmail

ora_aspnet_Mem_GetUserByEml

UpdateUser

ora_aspnet_Mem_UpdateUser

ValidateUser

ora_aspnet_Mem_GetPwdWithFmt

ora_aspnet_Mem_UpdateUserInfo

Table 1-11 lists the service methods and stored procedures that a user with the ora_aspnet_Mem_ReportAccess role can execute.

Table 1-11 ora_aspnet_Mem_ReportAccess Role

Service Method Stored Procedure

FindUsersByEmail

ora_aspnet_Mem_FindUsersByEml

FindUsersByName

ora_aspnet_Mem_FindUsersByName

GetAllUsers

ora_aspnet_Mem_GetAllUsers

GetNumberOfUsersOnline

ora_aspnet_Mem_GetNumOfUsersOn

GetUser

ora_aspnet_Mem_GetUserByUid

ora_aspnet_Mem_GetUserByName

GetUserNameByEmail

ora_aspnet_Mem_GetUserByEml

Table 1-12 lists the service methods and stored procedures that a user with the ora_aspnet_Mem_FullAccess role can execute.

Table 1-12 ora_aspnet_Mem_FullAccess Role

Service Method Stored Procedure

All Membership methods

ora_aspnet_Mem_ChangePwdQAndA

All Membership methods

ora_aspnet_Mem_CreateUser

All Membership methods

ora_aspnet_Mem_FindUsersByEml

All Membership methods

ora_aspnet_Mem_FindUsersByName

All Membership methods

ora_aspnet_Mem_GetAllUsers

All Membership methods

ora_aspnet_Mem_GetNumOfUsersOn

All Membership methods

ora_aspnet_Mem_GetPassword

All Membership methods

ora_aspnet_Mem_GetPwdWithFmt

All Membership methods

ora_aspnet_Mem_GetUserByEml

All Membership methods

ora_aspnet_Mem_GetUserByName

All Membership methods

ora_aspnet_Mem_GetUserByUid

All Membership methods

ora_aspnet_Mem_ResetPassword

All Membership methods

ora_aspnet_Mem_SetPassword

All Membership methods

ora_aspnet_Mem_UnlockUser

All Membership methods

ora_aspnet_Mem_UpdateUser

All Membership methods

ora_aspnet_Mem_UpdateUserInfo

All Membership methods

ora_aspnet_Users_DeleteUser

1.8.4.2 OracleRoleProvider Stored Procedures

Table 1-13 lists the service methods and stored procedures that a user with the ora_aspnet_Roles_BasicAccess role can execute.

Table 1-13 ora_aspnet_Roles_BasicAccess Role

Service Method Stored Procedure

GetRolesForUser

ora_aspnet_UIR_GetRolesForUser

IsUserInRole

ora_aspnet_UIR_IsUserInRole

Table 1-14 lists the service methods and stored procedures that a user with the ora_aspnet_Roles_ReportAccess role can execute.

Table 1-14 ora_aspnet_Roles_ReportAccess Role

Service Method Stored Procedure

FindUsersInRole

ora_aspnet_UIR_FindUsersInRole

GetAllRoles

ora_aspnet_Roles_GetAllRoles

GetRolesForUser

ora_aspnet_UIR_GetRolesForUser

GetUsersInRole

ora_aspnet_UIR_GetUsersInRoles

IsUserInRole

ora_aspnet_UIR_IsUserInRole

RoleExists

ora_aspnet_Roles_RoleExists

Table 1-15 lists the service methods and stored procedures that a user with the ora_aspnet_Roles_FullAccess role can execute.

Table 1-15 ora_aspnet_Roles_FullAccess Role

Service Method Stored Procedure

All Role Manager methods

ora_aspnet_Roles_CreateRole

All Role Manager methods

ora_aspnet_Roles_DeleteRole

All Role Manager methods

ora_aspnet_Roles_GetAllRoles

All Role Manager methods

ora_aspnet_Roles_RoleExists

All Role Manager methods

ora_aspnet_UIR_AddUsersToRoles

All Role Manager methods

ora_aspnet_UIR_FindUsersInRole

All Role Manager methods

ora_aspnet_UIR_GetRolesForUser

All Role Manager methods

ora_aspnet_UIR_GetUsersInRoles

All Role Manager methods

ora_aspnet_UIR_IsUserInRole

All Role Manager methods

ora_aspnet_UIR_RemUsersFmRoles

1.8.4.3 OracleProfileProvider Stored Procedures

Table 1-16 lists the service methods and stored procedures that a user with the ora_aspnet_Prof_BasicAccess role can execute.

Table 1-16 ora_aspnet_Prof_BasicAccess Role

Service Method Stored Procedure

GetPropertyValues

ora_aspnet_Prof_GetProperties

SetPropertyValues

ora_aspnet_Prof_SetProperties

Table 1-17 lists the service methods and stored procedures that a user with the ora_aspnet_Prof_ReportAccess role can execute.

Table 1-17 ora_aspnet_Prof_ReportAccess Role

Service Method Stored Procedure

GetAllProfiles

ora_aspnet_Prof_GetProfiles

GetAllInactiveProfiles

ora_aspnet_Prof_GetProfiles

GetNumberOfInactiveProfiles

ora_aspnet_Prof_GetNumOfInactPf

FindProfilesByUserName

ora_aspnet_Prof_GetProfiles

FindInactiveProfilesByUserName

ora_aspnet_Prof_GetProfiles

Table 1-18 lists the service methods and stored procedures that a user with the ora_aspnet_Prof_FullAccess role can execute.

Table 1-18 ora_aspnet_Prof_FullAccess Role

Service Method Stored Procedure

All Profile methods

ora_aspnet_Prof_DeleteInactPf

All Profile methods

ora_aspnet_Prof_DeleteProfiles

All Profile methods

ora_aspnet_Prof_GetNumOfInactPf

All Profile methods

ora_aspnet_Prof_GetProfiles

All Profile methods

ora_aspnet_Prof_GetProperties

All Profile methods

ora_aspnet_Prof_SetProperties

1.8.4.4 OraclePersonalizationProvider Stored Procedures

Table 1-19 lists the service methods and stored procedures that a user with the ora_aspnet_Pers_BasicAccess role can execute.

Table 1-19 ora_aspnet_Pers_BasicAccess Role

Service Method Stored Procedure

LoadPersonalizationState

ora_aspnet_PPU_GetPgSettings

ora_aspnet_PAU_GetPgSettings

ResetPersonalizationState

ora_aspnet_PPU_ResetPgSettings

ora_aspnet_PAU_ResetPgSettings

SavePersonalizationState

ora_aspnet_PPU_SetPgSettings

ora_aspnet_PAU_SetPgSettings

Table 1-20 lists the service methods and stored procedures that a user with the ora_aspnet_Pers_ReportAccess role can execute.

Table 1-20 ora_aspnet_Pers_ReportAccess Role

Service Method Stored Procedure

FindState

ora_aspnet_PA_FindState

GetCountOfState

ora_aspnet_PA_GetCountOfState

Table 1-21 lists the service methods and stored procedures that a user with the ora_aspnet_Pers_FullAccess role can execute.

Table 1-21 ora_aspnet_Pers_FullAccess Role

Service Method Stored Procedure

All Personalization methods

ora_aspnet_PA_FindState

All Personalization methods

ora_aspnet_PA_GetCountOfState

All Personalization methods

ora_aspnet_PA_ResetSharedState

All Personalization methods

ora_aspnet_PA_ResetUserState

All Personalization methods

ora_aspnet_PAU_GetPgSettings

All Personalization methods

ora_aspnet_PAU_ResetPgSettings

All Personalization methods

ora_aspnet_PAU_SetPgSettings

All Personalization methods

ora_aspnet_PPU_GetPgSettings

All Personalization methods

ora_aspnet_PPU_ResetPgSettings

All Personalization methods

ora_aspnet_PPU_SetPgSettings

1.8.4.5 OracleWebEventProvider Stored Procedures

Table 1-22 lists the service methods and stored procedures that a user with the ora_aspnet_Wevnt_FullAccess role can execute.

Table 1-22 ora_aspnet_Wevnt_FullAccess Role

Service Method Stored Procedure

All Web Event methods

ora_aspnet_LogWebEvents

1.8.4.6 OracleSiteMapProvider Stored Procedures

Table 1-23 lists the service methods and stored procedures that a user with the ora_aspnet_Smap_FullAccess role can execute.

Table 1-23 ora_aspnet_Smap_FullAccess Role

Service Method Stored Procedure

All Site Map methods

ora_aspnet_GetSiteMapData

1.8.4.7 OracleSessionStateStore Provider Stored Procedures

Table 1-24 lists the service methods and stored procedures that a user with the ora_aspnet_Sessn_FullAccess role can execute.

Table 1-24 ora_aspnet_Sessn_FullAccess Role

Service Method Stored Procedure

All Session State methods

ora_aspnet_SessnApp_SetAppID

All Session State methods

ora_aspnet_Sessn_InsUninitItem

All Session State methods

ora_aspnet_Sessn_RelStateItmEx

All Session State methods

ora_aspnet_Sessn_RmStateItem

All Session State methods

ora_aspnet_Sessn_ResetTimeout

All Session State methods

ora_aspnet_Sessn_UpdStateItem

All Session State methods

ora_aspnet_Sessn_InsStateItem

All Session State methods

ora_aspnet_Sessn_GetStateItem

All Session State methods

ora_aspnet_Sessn_GetStateItmEx

1.8.5 Synonyms

Public synonyms are created for all stored procedures so that they can be executed by any user in the database who is granted proper provider-specific roles by the user that owns the stored procedures.

ASP.NET Membership

Create And Install ASP.NET Membership Database (c-sharpcorner.com)

.NET Membership in ASP.NET MVC4 and Entity Framework with Oracle as Db

I am using Oracle Developer Tools for .NET (ODT), and it has been a great help. The best part: it's free! ODT includes ODP.NET and will help you do the following:

  • automatically set up ASP.NET membership tables. You'll need to create the schema first, then run the scripts provided.
  • automatically create and map EF entities (using database first); you will not need to manually map tables to tables.

Some things to consider... My membership schema is separate from the schemas used for my application. This way I can use one membership schema for several applications that may rely on different databases (schemas/users).

When configuring web.config, be sure to change the application name from "/" to something meaningful. Several config elements reference the application name, so be sure to change for all. The membership provider will automatically create the application record in the membersip database schema.

After your membership schema has been created (with the scripts), you'll need to change the web.config file's membership, profile, and roleManager elements to something like this:

<membership defaultProvider="OracleMembershipProvider">
  <providers>
    <clear />
    <add name="OracleMembershipProvider" type="Oracle.Web.Security.OracleMembershipProvider, Oracle.Web, Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342" connectionStringName="OraAspNetConnectionString" applicationName="YOUR_APP_NAME" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="5" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" passwordStrengthRegularExpression="" />
  </providers>
</membership>
<profile>
  <providers>
    <clear />
    <add name="OracleProfileProvider" type="Oracle.Web.Profile.OracleProfileProvider, Oracle.Web, Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342" connectionStringName="OraAspNetConnectionString" applicationName="YOUR_APP_NAME" />
  </providers>
</profile>
<roleManager enabled="true" defaultProvider="OracleRoleProvider">
  <providers>
    <clear />
    <add connectionStringName="OraAspNetConnectionString" applicationName="YOUR_APP_NAME" name="OracleRoleProvider" type="Oracle.Web.Security.OracleRoleProvider, Oracle.Web, Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
  </providers>
</roleManager>

This link may also help

Hope this helps.

Modular Application Framework for Blazor

March 10, 2021 14:04

Modular Application Framework for Blazor (edit)

Oqtane is the Modular Application Framework for Blazor

Modern, Flexible, and Open Source - running on .net 5.0

https://github.com/oqtane/oqtane.framework/

  • .NET 5 SDK (v5.0.100)
  • Visual Studio 2019
  • Cross Platform Database Support (Sqlite)
  • EF Core Migrations for Database Installation/Upgrade

Remote code execution, cross-site scripting, and denial of service vulnerabilities account for 2/3 of known vulnerabilities in .NET ecosystem

https://snyk.io/blog/remote-code-execution-cross-site-scripting-and-denial-of-service-vulnerabilities-account-for-2-3-of-known-vulnerabilities-in-net-ecosystem/

.NET open source security insights

https://snyk.io/blog/net-open-source-security-insights/

OWASP Top 10

January 29, 2018 16:40

The OWASP Top 10 Application Security Risks

*May be outside the developer’s control

Read more here

Tham khảo http://securitydaily.net 

Code review checklist

December 27, 2017 10:09

Code Review Checklist (edit)

https://www.guru99.com/asp-net-web-api-interview-questions.html

https://www.fullstack.cafe/blog/asp-net-web-api-interview-questions

AdminLTE.Core (HAY HAY HAY)

https://www.udemy.com/course/complete-aspnet-core-21-course/

Implementing CQRS Pattern with Vue.js & ASP.NET Core MVC

https://www.codeproject.com/Articles/5262285/Implementing-CQRS-Pattern-with-Vue-js-ASP-NET-Core

https://www.c-sharpcorner.com/article/implementing-cqrs-pattern-with-vue-js-asp-net-core-mvc/

Implementing CQRS Pattern with Vue.js & ASP.NET Core MVC

https://codeload.github.com/ColorlibHQ/AdminLTE/zip/v2.4.18 (HAY HAY HAY)

https://github.com/moemura/AdminLTE.Core (HAY HAY HAY)

https://github.com/moemura/AdminLTE.Core/releases/tag/2.0.1

https://github.com/dotnet-express/AdminLTE-Starter-Kit/releases

https://github.com/dotnet-express/AdminLTE-Starter-Kit/releases/tag/v0.8.0

https://github.com/go2ismail/adminlte-aspnetcore2-version

https://github.com/shehryarkn/Dynamic-User-Defined-Dashboards-Asp-Net-Core

https://github.com/shehryarkn/Asp-net-Core-Project-with-Admin-Template-Setup

Code Review

Checklist: https://www.michaelagreiler.com/code-review-checklist/

Google: https://blog.fullstory.com/what-we-learned-from-google-code-reviews-arent-just-for-catching-bugs/

Microsoft: https://www.michaelagreiler.com/code-reviews-at-microsoft-how-to-code-review-at-a-large-software-company/

Code Guide

https://www.cybersecuritycourses.com/course/dev544-secure-coding-in-net-developing-defensible-applications/ (HAY HAY HAY)

https://niccs.us-cert.gov/training/search/sans-institute/secure-coding-net-developing-defensible-applications (HAY HAY HAY)

Code Quality & Secure

1. Readability a.k.a. ‘Understandability’ (Khả năng đọc hoặc Khả năng hiểu được)
2. Maintainability (Bảo trì)
3. Security (Bảo mật)
4. Speed and Performance (Tốc độ và hiệu suất)
5. Documentation (Tài liệu)
6. Reinventing the Wheel (Phát minh lại bánh xe)
7. Reliability (Độ tin cậy)
8. Scalability (Khả năng mở rộng)
9. Reusability (Tái sử dụng)
10. Patterns (Mẫu)
11. Test Coverage and Test Quality (Phạm vi kiểm tra và chất lượng kiểm tra)
12. Fit for Purpose (Phù hợp cho mục đích)

https://www.enosecurity.com/training-tutorials-courses/secure-coding-in-asp-net-training/ (Tranining)

Audience / Target Group:

  • .NET Application Developers
  • C# Programmers
  • ASP.NET Developers
  • Managers, Architects and Technologists involved in deploying .NET applications

Topics: 

  • General Web Application Security Concepts
  • .NET Framework Security Features
  • Input Validation & Encoding
  • Input Driven Attacks
  • Validation Best Practices
  • Output Encoding
  • Common Authentication Weaknesses
  • Authorization Best Practices
  • Controlling Application Access
  • Password Security
  • Session Hijacking & Trapping
  • Protecting User Sessions & Tokens
  • Canonicalization Problems
  • Parameter Manipulation
  • Encryption, Confidentiality & Data Protection
  • Cookie-Based Attacks
  • Protecting Application Variables
  • Error Handling & Logging
  • Attacking via Error Messages
  • Secure Logging & Error Handling
  • Server Configuration & Code Management
  • Common App Server Misconfigurations
  • Protecting Application Code
  • XML Web Services
  • Overview of WSDL, SOAP & AJAX Security
  • Web Service Attacks
  • AJAX Pitfalls
  • Web Service Best Practices
  • Application Threat Modeling
  • Application Context
  • Identifying Attacks, Vulnerabilities & Countermeasures
  • Threat Modeling Tools
  • Cache Control Issues
  • SSL Best Practices

https://forums.asp.net/t/1926690.aspx?Secure+Coding+best+practices+guideline

https://download.microsoft.com/documents/uk/msdn/security/The Developer Highway Code.pdf

http://www.evoketechnologies.com/blog/code-review-checklist-perform-effective-code-reviews/

https://nyu-cds.github.io/effective-code-reviews/01-intro/

https://nyu-cds.github.io/effective-code-reviews/02-best-practices/

https://nyu-cds.github.io/effective-code-reviews/03-checklist/

Security Code Review

https://www.owasp.org/images/2/2e/OWASP_Code_Review_Guide-V1_1.pdf

RESTful API Lifecycle Management

https://dzone.com/refcardz/restful-api-lifecycle-management

LINQ

https://msdn.microsoft.com/en-us/library/bb308959.aspx

Code Review Checklist & Guidelines for CSharp Developers

https://www.codeproject.com/Reference/593751/Code-Review-Checklist-and-Guidelines-for-Csharp-De

Code Review Guidelines

https://www.codeproject.com/Articles/524235/Codeplusreviewplusguidelines

Assign Severity to Review Finding

The severity to find issues with code should go as below. Reviewer must focus on issues with High severity first and then to Medium severity and then Low severity issues.

    1. Naming Conventions and Coding style = Low
    2. Control Structures and Logical issues = Medium or High
    3. Redundant Code = High
    4. Performance Issues = High
    5. Security Issues = High
    6. Scalability Issues = High
    7. Functional Issues =High
    8. Error Handling = High
    9. Reusability = Medium

https://weblogs.asp.net/tgraham/44763

In my previous blog post, we discussed about “10 Simple Code Review Tips for Effective Code Reviews”. Now, let’s take this topic further and explore the code review checklist, which would help to perform effective code reviews to deliver best quality software. 

This code review checklist also helps the code reviewers and software developers (during self code review) to gain expertise in the code review process, as these points are easy to remember and follow during the code review process. 

Let’s first begin with the basic code review checklist and later move on to the detailed code review checklist. 

Basic Code Review Checklist

Let’s discuss about the basic code review checklist, which can be very handy if you are a beginner in code reviews and/or during initial code reviews.

 

While reviewing the code, ask yourself the following basic questions:

  1. Am I able to understand the code easily?
  2. Is the code written following the coding standards/guidelines?
  3. Is the same code duplicated more than twice?
  4. Can I unit test / debug the code easily to find the root cause?
  5. Is this function or class too big? If yes, is the function or class having too many responsibilities?

If you feel that the answer is not satisfactory to any of the above questions, then you can suggest/recommend code changes.

Detailed Code Review Checklist

The following code review checklist gives an idea about the various aspects you need to consider while reviewing the code:

1. Code formatting

While going through the code, check the code formatting to improve readability and ensure that there are no blockers:

a) Use alignments (left margin), proper white space. Also ensure that code block starting point and ending point are easily identifiable.

b) Ensure that proper naming conventions (Pascal, CamelCase etc.) have been followed. 

c) Code should fit in the standard 14 inch laptop screen.  There shouldn’t be a need to scroll horizontally to view the code. In a 21 inch monitor, other windows (toolbox, properties etc.) can be opened while modifying code, so always write code keeping in view a 14 inch monitor.

d) Remove the commented code as this is always a blocker, while going through the code. Commented code can be obtained from Source Control (like SVN), if required.

2. Architecture

a) The code should follow the defined architecture.

  1. Separation of Concerns followed
    • Split into multiple layers and tiers as per requirements (Presentation, Business and Data layers).
    • Split into respective files (HTML, JavaScript and CSS).
  1. Code is in sync with existing code patterns/technologies.
  2. Design patterns: Use appropriate design pattern (if it helps), after completely understanding the problem and context.

3. Coding best practices

  1. No hard coding, use constants/configuration values.
  2. Group similar values under an enumeration (enum).
  3. Comments – Do not write comments for what you are doing, instead write comments on why you are doing. Specify about any hacks, workaround and temporary fixes. Additionally, mention pending tasks in your to-do comments, which can be tracked easily.
  4. Avoid multiple if/else blocks.
  5. Use framework features, wherever possible instead of writing custom code.

4. Non Functional requirements

a) Maintainability (Supportability) – The application should require the least amount of effort to support in near future. It should be easy to identify and fix a defect.

  1. Readability: Code should be self-explanatory. Get a feel of story reading, while going through the code. Use appropriate name for variables, functions and classes. If you are taking more time to understand the code, then either code needs refactoring or at least comments have to be written to make it clear.
  2. Testability: The code should be easy to test. Refactor into a separate function (if required). Use interfaces while talking to other layers, as interfaces can be mocked easily. Try to avoid static functions, singleton classes as these are not easily testable by mocks.
  3. Debuggability: Provide support to log the flow of control, parameter data and exception details to find the root cause easily. If you are using Log4Net like component then add support for database logging also, as querying the log table is easy.
  4. Configurability: Keep the configurable values in place (XML file, database table) so that no code changes are required, if the data is changed frequently.

b) Reusability

  1. DRY (Do not Repeat Yourself) principle: The same code should not be repeated more than twice.
  2. Consider reusable services, functions and components.
  3. Consider generic functions and classes.

c) Reliability – Exception handling and cleanup (dispose) resources.

d) Extensibility – Easy to add enhancements with minimal changes to the existing code. One component should be easily replaceable by a better component.

e) Security – Authentication, authorization, input data validation against security threats such as SQL injections and Cross Site Scripting (XSS), encrypting the sensitive data (passwords, credit card information etc.)

f) Performance

  1. Use a data type that best suits the needs such as StringBuilder, generic collection classes.
  2. Lazy loading, asynchronous and parallel processing.
  3. Caching and session/application data.

g) Scalability – Consider if it supports a large user base/data? Can this be deployed into web farms?

h) Usability – Put yourself in the shoes of a end-user and ascertain, if the user interface/API is easy to understand and use. If you are not convinced with the user interface design, then start discussing your ideas with the business analyst.

5. Object-Oriented Analysis and Design (OOAD) Principles

  1. Single Responsibility Principle (SRS): Do not place more than one responsibility into a single class or function, refactor into separate classes and functions.
  2. Open Closed Principle: While adding new functionality, existing code should not be modified. New functionality should be written in new classes and functions.
  3. Liskov substitutability principle: The child class should not change the behavior (meaning) of the parent class. The child class can be used as a substitute for a base class.
  4. Interface segregation: Do not create lengthy interfaces, instead split them into smaller interfaces based on the functionality. The interface should not contain any dependencies (parameters), which are not required for the expected functionality.
  5. Dependency Injection: Do not hardcode the dependencies, instead inject them.

In most cases the principles are interrelated, following one principle automatically satisfies other principles. For e.g: if the ‘Single Responsibility Principle’ is followed, then Reusability and Testability will automatically increase.

In a few cases, one requirement may contradict with other requirement. So need to trade-off based on the importance of the weight-age, e.g. Performance vs Security. Too many checks and logging at multiple layers (UI, Middle tier, Database) would decrease the performance of an application. But few applications, especially relating to finance and banking require multiple checks, audit logging etc. So it is ok to compromise a little on performance to provide enhanced security.

Tools for Code Reviews

  1. The first step while assessing the code quality of the entire project is through a static code analysis tool. Use the tools (based on technology) such as SonarQube, NDepend, FxCop, TFS code analysis rules. There is a myth that static code analysis tools are only for managers.
  2. Use plug-ins such as Resharper, which suggests the best practices in Visual studio.
  3. To track the code review comments use the tools like Crucible, Bitbucket and TFS code review process.

Conclusion

The above code review checklist is not exhaustive, but provides a direction to the code reviewer to conduct effective code reviews and deliver good quality code. Initially, it would take some time to review the code from various aspects. After a bit of practice, code reviewers can perform effective code reviews, without much effort and time. If you would like to become an expert code reviewer, this code review checklist serves as a great starting point. Happy Code Reviewing!

Implement ASP.NET Security

November 10, 2017 17:17

Implement ASP.NET Security (edit)

Basically:

  1. Make a new user
  2. Make a new role
  3. Make a new Claim
  4. Add Claim to Role
  5. Add User to Role
  6. Make a new Policy with claim (during configure services)
  7. Check for user being authorized for policy

SQL Insert

https://stackoverflow.com/questions/41513890/creating-asp-net-identity-user-using-sql

How to create 100 users

https://stackoverflow.com/questions/41435437/creating-test-users-with-password-hash-in-asp-net-identity-2-2-1

public async Task CreateTestUsers() {

    var db = new ApplicationDbContext();
    var userStore = new UserStore<ApplicationUser>(db);
    var userManager = new ApplcationUserManager(userStore);

    for (var i = 1; i <= 100; i++) {
        var username = "User" + i;

        var user = db.Users.FirstOrDefault(u => u.UserName == username);
        if (user == null) {
            user = new ApplicationUser() {
                            UserName = username,
                            Email = username + "@" + username + "." + username,
                            EmailConfirmed = true,
                            LockoutEnabled = false
                        };

            var password = username;
            var result = await userManager.CreateAsync(user, password);
        }
    }
}

ASP.NET Web Security: Protect User Passwords with Hashing and Salt

http://www.itprotoday.com/web-development/aspnet-web-security-protect-user-passwords-hashing-and-salt

https://www.codeproject.com/Articles/844722/Hashing-Passwords-using-ASP-NETs-Crypto-Class

http://www.c-sharpcorner.com/article/hashing-passwords-in-net-core-with-tips/

http://www.c-sharpcorner.com/UploadFile/145c93/save-password-using-salted-hashing/

ASP.NET Web Security: Protect User Passwords with Hashing and Salt - Unit Test

using System;
using System.Data.SqlClient;
using System.Security.Cryptography;
using System.Text;

namespace ConsoleApp1
{
internal class Utils
{
public static Boolean ValidatePassword(String enteredPassword, String storedHash, String storedSalt)
{
// Consider this function as an internal function where parameters like
// storedHash and storedSalt are read from the database and then passed.

var hash = HashPassword(enteredPassword, storedSalt);
return String.Equals(storedHash, hash);
}

public static String HashPassword(String password, String salt)
{
var combinedPassword = String.Concat(password, salt);
var sha256 = new SHA256Managed();
var bytes = Encoding.UTF8.GetBytes(combinedPassword);
var hash = sha256.ComputeHash(bytes);
return Convert.ToBase64String(hash);
}

public static String GetRandomSalt(Int32 size = 12)
{
var random = new RNGCryptoServiceProvider();
var salt = new Byte[size];
random.GetBytes(salt);
return Convert.ToBase64String(salt);
}
}

internal class Program
{
private static void Main(string[] args)
{
var defaultAccountLockoutTimeSpan = TimeSpan.FromMinutes(15);
var lockoutEndDate = new DateTimeOffset(DateTime.Now + defaultAccountLockoutTimeSpan);

Console.WriteLine(lockoutEndDate);

const string email = "manhnv8383@gmail.com";
const string password = "Abc@123";

var salt = Utils.GetRandomSalt();

var passwordHash = Utils.HashPassword(password, salt);

using (var conn = new SqlConnection("Server=192.168.2.26;Database=IdentityServerDb;user id=sa;password=123456;"))
{
const string newUserSql = "INSERT INTO \"AspNetUsers\" (\"Id\", \"AccessFailedCount\", \"ConcurrencyStamp\", \"Email\", \"EmailConfirmed\", \"LockoutEnabled\", \"LockoutEnd\", \"NormalizedEmail\", \"NormalizedUserName\", \"PasswordHash\", \"PhoneNumber\", \"PhoneNumberConfirmed\", \"SecurityStamp\", \"TwoFactorEnabled\", \"UserName\") VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8, @p9, @p10, @p11, @p12, @p13, @p14);";

using (var insertCommand = new SqlCommand(newUserSql, conn))
{
insertCommand.Parameters.AddWithValue("@p0", Guid.NewGuid()); //Id
insertCommand.Parameters.AddWithValue("@p1", 0); //AccessFailedCount
insertCommand.Parameters.AddWithValue("@p2", Guid.NewGuid()); //ConcurrencyStamp
insertCommand.Parameters.AddWithValue("@p3", email); //Email
insertCommand.Parameters.AddWithValue("@p4", 0); //EmailConfirmed
insertCommand.Parameters.AddWithValue("@p5", 0); //LockoutEnabled
insertCommand.Parameters.AddWithValue("@p6", lockoutEndDate); //LockoutEnd
insertCommand.Parameters.AddWithValue("@p7", email.ToUpper()); //NormalizedEmail
insertCommand.Parameters.AddWithValue("@p8", email.ToUpper()); //NormalizedUserName
insertCommand.Parameters.AddWithValue("@p9", passwordHash); //PasswordHash
insertCommand.Parameters.AddWithValue("@p10", DBNull.Value); //PhoneNumber
insertCommand.Parameters.AddWithValue("@p11", 0); //PhoneNumberConfirmed
insertCommand.Parameters.AddWithValue("@p12", Guid.NewGuid()); //SecurityStamp
insertCommand.Parameters.AddWithValue("@p13", 0); //TwoFactorEnabled
insertCommand.Parameters.AddWithValue("@p14", email); //UserName

conn.Open();

insertCommand.ExecuteNonQuery();
}
}
}
}
}

 

Bảo mật

August 17, 2017 01:01

OAuth là gì?

OAuth là một chuẩn xác thực mở được rất nhiều các website và phần mềm sử dụng.

OpenID là gì?

OpenID là một tiêu chuẩn mở và là một giao thức authen được phân cấp. Được phát triển bởi tổ chức phi lợi nhuận OpenID Foundation, OpenID cho phép user có thể được authen bởi rất nhiều website (Relying Parties hoặc RP) sử dụng service của bên thứ 3

Khác nhau giữa OAuth & OpenID

http://www.codehub.vn/OpenID-va-OAuth-Khac-Nhau-Nhu-The-Nao

OAuth không phải là OpenID

OpenID cũng là một dạng xác thực danh tính dùng nick từ tài khoản xxx để đăng nhập vào trang yyy. Về nguyên tắc thì hai loại này giống nhau nhưng cách hoạt động của chúng thì lại khác nhau. OpenID đòi hỏi người dùng phải cung cấp thông tin cá nhân còn OAuth thì không.

OpenID is a protocol for authentication while OAuth is for authorization

OAuth 2.0 là gì?

OAuth 2.0 Authorization Framework [RFC6749]

OAuth 2.0 Bearer Token Usage [RFC6750]

https://blogs.msdn.microsoft.com/webdev/2016/10/27/bearer-token-authentication-in-asp-net-core/

http://kevinchalet.com/2017/01/30/implementing-simple-token-authentication-in-aspnet-core-with-openiddict/

http://kevinchalet.com/2016/07/13/creating-your-own-openid-connect-server-with-asos-introduction/

http://kevinchalet.com/2016/07/13/creating-your-own-openid-connect-server-with-asos-creating-your-own-authorization-provider/

http://kevinchalet.com/2016/07/13/creating-your-own-openid-connect-server-with-asos-implementing-the-resource-owner-password-credentials-grant/

https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Server

https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Samples/tree/master/samples/

https://github.com/aspnet/Security

Choose type of Authentication & Authorization

https://medium.com/@robert.broeckelmann/when-to-use-which-oauth2-grants-and-oidc-flows-ec6a5c00d864

https://spin.atomicobject.com/2016/05/30/openid-oauth-saml/

Bearer in ASP.NET Core

https://dev.to/samueleresca/developing-token-authentication-using-aspnet-core

https://github.com/samueleresca/Blog.TokenAuthGettingStarted

https://pioneercode.com/post/authentication-in-a-asp-dot-net-core-api-part-1-identity-access-denied

https://pioneercode.com/post/authentication-in-a-asp-dot-net-core-api-part-2-identity-access-granted

https://pioneercode.com/post/authentication-in-an-asp-dot-net-core-api-part-3-json-web-token

Area in ASP.NET Core

https://pioneercode.com/post/creating-areas-in-asp-net-core

Pagination in ASP.NET Core

https://pioneercode.com/post/asp-net-core-mvc-pagination-using-a-tag-helper

https://stackoverflow.com/questions/37708266/bearer-token-authentication-in-asp-net-core

Put app.UseMvc() at the end of your pipeline and it should work:

app.UseJwtBearerAuthentication(new JwtBearerOptions
{
    AutomaticAuthenticate = true,
    AutomaticChallenge = true,
    TokenValidationParameters = tokenValidationParameters,
    AuthenticationScheme = JwtBearerDefaults.AuthenticationScheme,
});

app.UseMvc();

OpenID Connect là gì?

http://openid.net/connect/

Bảo mật nhập môn

Sử dụng Cookie đúng cách để tránh những lỗi bảo mật không đáng có ntn?

Nếu website của bạn sử dụng RESTful API, đừng sử dụng cookie để authorize người dùng mà hãy dùng OAuth hoặc WebToken. Token này được vào Header của mỗi request nên sẽ không bị dính lỗi CRSF nhé.

Bảo mật Cookie

https://toidicodedao.com/2016/10/25/bao-mat-cookie/

Bảo mật cơ bản phần 1

https://toidicodedao.com/2016/09/13/bao-mat-co-ban-phan-1/

Ẩn giấu thông tin hệ thống

https://toidicodedao.com/2016/11/01/an-thong-tin-he-thong/

Quản lý người dùng

https://toidicodedao.com/tag/juno_okyo/

Quản lý người dùng đúng cách

https://toidicodedao.com/2016/12/20/quan-ly-user-dung-cach/

Open Web Application Security Project (OWASP) là gì?

1) SQL Injection

https://toidicodedao.com/2016/11/15/lo-hong-sql-injection-than-thanh/

2) XSS

https://toidicodedao.com/2016/10/18/lo-hong-bao-mat-xss/

3) CSRF

https://toidicodedao.com/2016/11/29/csrf-cu-lua-ngoan-muc/

4) Insecure Direct Object References

https://toidicodedao.com/2016/11/22/lo-hong-bao-mat-insecure-direct-object-references/

Security in ASP.NET Core

August 4, 2017 23:47

ASP.NET Core Custom User Manager

http://sikorsky.pro/en/blog/aspnet-core-custom-user-manager

Keep your ASP.NET Core secrets safe in production using Azure Application Settings

https://jonhilton.net/2017/06/28/keep-your-asp-net-core-secrets-safe-in-production-using-azure-application-settings/

Redis InMemory Cache in ASP.NET Core MVC - Gary Woodfine

https://garywoodfine.com/redis-inmemory-cache-asp-net-mvc-core/

https://github.com/garywoodfine/redis-mvc-core

https://garywoodfine.com/why-when-and-how-to-use-redis-in-asp-net-mvc-core/

Building a scheduled task in ASP.NET Core/Standard 2.0

https://blog.maartenballiauw.be/post/2017/08/01/building-a-scheduled-cache-updater-in-aspnet-core-2.html

C# 7.0

https://blog.xamarin.com/getting-started-c-7

Entity Framework Core - Gary Woodfine

https://garywoodfine.com/how-to-seed-your-ef-core-database/

https://garywoodfine.com/using-ef-core-in-a-separate-class-library-project/

Cutting Edge - Finding the Cheese in ASP.NET Core

https://msdn.microsoft.com/en-us/magazine/mt784659.aspx

API Testing with Postman

http://blog.getpostman.com/2017/07/28/api-testing-tips-from-a-postman-professional/

http://blog.getpostman.com/2015/09/03/how-to-write-powerful-automated-api-tests-with-postman-newman-and-jenkins/

XML & JSON in ASP.NET Core

https://andrewlock.net/formatting-response-data-as-xml-or-json-based-on-the-url-in-asp-net-core/

Serialize all errors as JSON in ASP.NET Core

https://www.recaffeinate.co/post/serialize-errors-as-json-in-aspnetcore/

Adding Azure AD authentication to an ASP.NET Core web site is almost too easy!

https://sparre.io/2/adding-azure-ad-authentication-to-an-aspnet-core-web-site-is

Angular 2 - Gary Woodfine

https://garywoodfine.com/building-angular2-basic-application/

https://garywoodfine.com/angular-2-reactive-forms/

Security Asp.Net Core

July 16, 2017 00:55

https://andrewlock.net/introduction-to-authentication-with-asp-net-core/

https://stormpath.com/blog/tutorial-policy-based-authorization-asp-net-core

https://social.technet.microsoft.com/wiki/contents/articles/36804.asp-net-core-mvc-authentication-and-role-based-authorization-with-asp-net-core-identity.aspx

https://jonhilton.net/2017/05/03/login-authentication-asp-net-core-web-api-big-picture/

Hacker

May 19, 2017 10:41

Một số kỹ thuật tấn công web

Một số kỹ thuật tấn công web mà hacker hay sử dụng để lấy cắp thông tin, phá hỏng dữ liệu trên hệ thống đó là:

  • XSS (Cross-Site Scripting):
    Là một trong những kĩ thuật tấn công phổ biến nhất hiện nay, đồng thời nó cũng là một trong những vấn đề bảo mật quan trọng đối với các nhà phát triển web và cả những người sử dụng web. XSS là một kỹ thuật tấn công bằng cách chèn vào các website động những thẻ HTML hay những đoạn scrip nguy hiểm có thể gây hại cho những người sử dụng khác. Trong đó, những đoạn mã nguy hiểm được chèn vào hầu hết được viết bằng các Client-Site Scrip như JavaScrip, Jscrip.. và cũng có thể là các thẻ HTML.

  • CSRF (Cross-site Request Forgery):
    Là kỹ thuật tấn công bằng cách sử dụng quyền chứng thực của người dùng đối với một website. Nó là kỹ thuật tấn công vào người dùng, dựa vào đó hacker có thể thực thi những thao tác phải yêu cầu sự chứng thực.

  • SQL injection:
    SQL Injection là một kỹ thuật lợi dụng những lỗ hổng về câu truy vấn lấy dữ liệu của những website không an toán, đây là một kỹ thuật tấn công rất phổ biến và sự thành công của nó cũng tương đối cao.

I. Cách thực hiện

1. XSS

Cho phép kẻ tấn công nhúng mã đọc Javacsript, VBScript, ActiveX, HTML, hoặc Flash vào một trang năng động, dễ bị đánh lừa người sử dụng, thực hiện kịch bản trên máy tính của mình để thu thập dữ liệu. Kỹ thuật này không tấn công vào CSDL hệ thống như SQL injection mà chúng tấn công trực tiếp từ phía người dùng bằng cách xâm nhập hệ thống bằng các đoạn mã đơn giản để lấy cắp cookies và session từ đó chúng có thể thao túng người dùng cướp quyền truy cập tài khoản mà không cần tới mật khẩu.

  • Non-persistent(Reflected) là loại phổ biến nhất: Loại này xuất hiện khi dữ liệu được cung cấp từ một web client nào đó. Hacker khi muốn tấn công thì điều đầu tiên là sẽ phải tìm ra lỗ hổng bảo mật trên website bằng cách gắn một đoạn mã test vào web client để web client gửi đến server và chờ phản hồi của web server để tìm ra lỗ hổng bảo mật.Hacker tấn công dựa vào sự thiếu chú ý về việc lọc dữ liệu vào từ URL vủa website và gắn thêm những đoạn mã độc vào đây để thực hiện hành vi tấn công website. Loại này thì chỉ có tác dụng trong một lần.

    Ví dụ : Có thể một request được gửi từ các form dữ liệu hoặc cũng có thể chỉ là các URL: http://www.example.com/search?query=alert('XSS was found !');

  • Stored XSS: Là một biến thể tàn phá gây hậu quả rất nặng nề. Loại này xảy ra khi dữ liệu do các hacker cung cấp được lưu trữ trên các máy chủ thông qua một số chức năng trên website và từ đó về sau thì các dữ liệu này hiển nhiên được hiển thị một cách bình thường trên các trình duyệt của người dùng mà không cần tới HTML riêng nữa. Và khi người dùng click vào những phần bị gắn mã độc thì đã bị dính XSS. Đoạn mã chèn thêm vào được lưu trữ vào CSDL trên server dưới dạng các comment trong blog, mesage, forum hay visitor log

    Ví dụ: Khi đăng ký thành viên, phần giới thiêu về bản thân, nếu hacker nhập vào mã XSS và website không kiểm tra kỹ dữ liệu đầu vào, thì mỗi khi truy cập trang thành viên của hacker đó, bạn sẽ bị khai thác.

    Mô hình XSS

    123.png

Từ những điều này có thể thấy Stored XSS nguy hiểm hơn Reflected XSS rất nhiều, đối tượng bị ảnh hưởng có thế là tất cả nhưng người sử dụng ứng dụng web đó. Và nếu nạn nhân có vai trò quản trị thì còn có nguy cơ bị chiếm quyền điều khiển web.

2. CSRF

Tấn công sử dụng kỹ thuật này dành cho người am hiểu về hệ thống, có thể đã từng phát triển hệ thống đó, hoặc một mã nguồn mở, hoặc một mã nguồn nào đó đã được công khai code. Hacker thực hiện gửi tin nhắn dến Admin, khi admin đọc tin nhắn này trình duyệt sẽ request đến link đó và lấy cookie của trình duyệt và tiến hành active. Trường hợp không gửi được mail, giả sử ta biết rằng admin đang login hacker có thể send 1 trang web mà hacher lập ra, trong đó có đoạn code độc hại rồi send qua yahoo hay gì gì đó, khi đó admin viếng thăm vào và thực hiện các thao tác trên. Như vậy hacker thực hiện một truy vấn trái phép dựa vào chính người dùng

3. SQl Injection

Chắc hẳn các bạn đã biết mô hình hoạt động của website rồi nhỉ? Khi một request được gửi từ client thì ngôn ngữ SERVER như PHP sẽ lấy các thông tin từ request đó. Nhưng bản thân nó không hề phát hiện ra những thông tin đó có chứa những câu SQL độc, vì thế công việc này ta phải đổ trách nhiệm tới kinh nghiệm của lập trình viên.
- Giả sử tôi có một trang đăng nhập với hai thông tin là tên đăng nhập và mật khẩu. Và đoạn code xử lý tấn công sql injection của tôi có dạng như sau:
Selection_108.png

 Nếu nhập ” ‘ OR 1=1″ vào ô text user và pass thì câu lệnh SQL sẽ có dạng:
`SELECT * FROM T_USERS WHERE username=” OR 1=1 and password=” OR 1=1;`

Chạy câu truy vấn này lên thì kết quả nó trả về là danh sách user nên nếu code cùi cùi thì login được luôn.

Trên đây là một ví dụ điển hình thôi, chứ thực tế thì hacker còn rất nhiều mưu mẹo khác. Tuy nhiên chung quy lại với kỹ thuật tấn công SQL Injection ta vẫn có thể không chế được nó.

II. Cách phòng chống:

1. XSS

Cách phòng chống tốt nhất XSS là theo nguyên tắc filter input và escape output. Để làm việc này thì hiện tại có khá nhiều bộ lọc để chúng ta lựa chọn. Dựa vào cách khắc phục đó bạn có thể dùng một thư viện viết bằng PHP cho phép filter HTML để ngăn chặn kẻ xấu post mã độc XSS thông qua website của bạn. Thư viện có sẵn đó là HTML Purifier. Đây là bộ thư viện rất mạnh dùng triển kahi trong code của mình để chống XSS. Được xây dựng theo mô hình ÔP nên sử dụng rất dễ, sau thao tác include file thư viện, chỉ cần tạo instance của đối tượng HTML Purifier và gọi phương thức purify() là có thể filter được dữ liệu đầu vào

2. CSRF

Thông thường để tránh tấn công ta sẽ chia làm hai đối tượng, một là đối tượng coder và hai là đối tượng người dùng cuối (user).
- Với đối tượng người dùng cuối thì:
- Hạn chế sử dụng login vào hệ thống khi nói chuyện tiếp xúc với những người lạ qua các kênh khác nhau, những email không rõ nguồn gốc. Khi không dùng hệ thống thì lập tức logout.
- Nên login vào một máy riêng và không cho người thứ 2 tiếp xúc với máy đó.
- Thay đổi mật khẩu liên tục, và chọn những mật khẩu khó đoán, có kỹ tự đặc biệt. Vì hiện nay có rất nhiều phần mềm dò pass.
- Với đối tượng coder:
- Thực hiện tạo những token auto và random với từng máy, từng trình duyệt và thiết lập thời gian sống cho token đó.
- Không sử dụng phương thức GET với những request mà có ảnh hưởng đến CSDL.
- Khi lấy dữ liệu từ người dùng thì kiểm tra chặt chẽ.
- URL trong admin càng khó nhớ càng bí hiểm càng tốt.

3. SQL Injection

  • Nhận dữ liệu kiểu INT
  • Viết lại đường dẫn có thể chống SQL Injection
  • Sử dụng hàm sprintf và mysql_real_escape_string để các định kiểu dữ liệu cho câu truy vấn.

Trên đây là 3 cách mà hacker thường dùng để có thể xâm nhập vào hệ thống. Vì vậy Coder thì nên biết để phòng tránh và Tester nên biết để tìm ra các lỗi này để hacker khó có thể xâm nhập được vào hệ thống.

Web Security

May 19, 2017 10:36

Agenda:

Có thể bạn nghĩ rằng, trang web của bạn không có bất kỳ thông tin có giá trị nào để mà bị tin tặc (hacker) tấn công, nhưng bạn đã nhầm, các trang web bị xâm nhập mọi lúc. Phần lớn các xâm nhập an ninh web này không phải là để ăn cắp dữ liệu hoặc phá hỏng website của bạn. Thay vào đó, tin tặc cố gắng sử dụng máy chủ của bạn như là một địa chỉ email để gửi thư rác hoặc sử dụng máy chủ của bạn để thiết lập một máy chủ web tạm thời, thường để phục vụ các tệp tin có tính chất bất hợp pháp. Các cách tấn công rất phổ biến này nhìn chung là nhằm mục đích lạm dụng các máy chủ bị xâm nhập, sử dụng chúng như một phần của một mạng botnet (mạng lưới các máy tính cá nhân bị nhiễm phần mềm độc hại và được điều khiển theo nhóm mà không hề biết, ví dụ như lợi dụng để gửi thư rác), hoặc mỏ cho Bitcoin. Thậm chí bạn có thể bị nhiễm ransomware - một loại phần mềm độc hại được thiết kế để chặn truy cập vào hệ thống máy tính cho đến khi một khoản tiền được trả.

Hacker thực hiện hack thường xuyên bằng các script tự động được viết để quét Internet nhằm cố gắng khai thác những vấn đề về bảo mật trang web đã biết trong phần mềm. Dưới đây là một số tip giúp bạn và trang web của bạn an toàn hơn trên mạng.

1. Keep software up to date (Cập nhật phần mềm thường xuyên)

Điều này có vẻ như là hiển nhiên, nhưng việc đảm bảo tất cả phần mềm được cập nhật là rất quan trọng trong việc giữ cho trang web của bạn an toàn. Điều này áp dụng cho cả hệ điều hành máy chủ và bất kỳ phần mềm nào đang chạy trên trang web của bạn, ví dụ như một CMS hoặc diễn đàn. Khi tìm thấy lỗ hổng bảo mật của trang web trong phần mềm, tin tặc nhanh chóng cố gắng lạm dụng chúng.

Nếu bạn đang sử dụng một giải pháp quản lý lưu trữ (hosting) thì bạn không cần phải lo lắng quá nhiều về việc áp dụng các bản cập nhật bảo mật cho hệ điều hành vì công ty hosting sẽ lo điều này.

Nếu bạn đang sử dụng phần mềm của bên thứ ba trên trang web của bạn ví dụ như một CMS hoặc diễn đàn, bạn nên đảm bảo rằng bạn có thể nhanh chóng áp dụng bất kỳ phần bảo mật nào. Hầu hết các nhà cung cấp đều có một danh sách gửi thư hoặc RSS feed nêu rõ bất kỳ vấn đề bảo mật nào trên trang web. WordPress, Umbraco và nhiều CMS khác sẽ thông báo cho bạn về những cập nhật hệ thống có sẵn khi bạn đăng nhập.

Nhiều developer sử dụng các tool như Composer, npm, hoặc RubyGems để quản lý các phụ thuộc phần mềm của họ, các lỗ hổng bảo mật có thể xuất hiện trong 1 package nào đó trong đây. Các lỗ hổng bảo mật nào đã bị công bố của hệ điều hành, máy chủ Web, máy chủ ứng dụng và các phần mềm của hãng thứ ba khác thì hầu hết đều có phần sửa lỗi bổ sung, tuy vậy những hệ thống không được cập nhật thường xuyên sẽ là miếng mồi ngon cho hacker. Chính vì vậy hãy luôn đảm bảo rằng phần mềm/ hệ thống của bạn được cập nhật thường xuyên, bạn cũng có thể sử dụng các tool thông báo tự động khi xuất hiện lỗ hổng bảo mật để kiểm soát lỗi, ví dụ như Gemnasium

2. SQL injection

SQL injection là một kỹ thuật cho phép những kẻ tấn công lợi dụng lỗ hổng của việc kiểm tra dữ liệu đầu vào trong các ứng dụng web và các thông báo lỗi của hệ quản trị cơ sở dữ liệu trả về để inject (tiêm vào) và thi hành các câu lệnh SQL bất hợp pháp (chèn các câu lệnh SQL bất hợp pháp vào 1 input field của form trên trang web hoặc vào param URL, nhằm mục đích truy cập hoặc thao tác trên cơ sở dữ liệu của bạn). SQL injection có thể cho phép những kẻ tấn công thực hiện các thao tác như một người quản trị web như delete, insert, update,… trên cơ sỡ dữ liệu của ứng dụng, thậm chí là server mà ứng dụng đó đang chạy. Lỗi này thường xảy ra trên các ứng dụng web có dữ liệu được quản lý bằng các hệ quản trị cơ sở dữ liệu như SQL Server, MySQL, Oracle, DB2, Sysbase…

SQL Injection là một trong những lớp ứng dụng phổ biến nhất tại các cuộc tấn công đang được sử dụng trên Internet. Mặc dù thực tế rằng tương đối dễ dàng để chống lại SQL Injection, nhưng vẫn có số lượng lớn các trang web đối mặt với nguy cơ bị tấn công injection.
Khi bạn sử dụng các câu giao dịch truy vấn chuẩn (standard Transact SQL) bạn sẽ rất dễ vô tình chèn các mã rogue vào truy vấn của bạn, các mã này có thể được sử dụng để thay đổi bảng, lấu thông tin và xóa dữ liệu trong DB. Bạn có thể dễ dàng phòng tránh điều này bằng cách sử dụng các câu truy vấn đã được tham số hóa (parameterised queries), hầu hết các ngôn ngữ lập trình web đều có tính năng này và dễ dàng sử dụng.

Do gần đây các khái niệm framework đã và đang được sử dụng rất nhiều. Các framework đều đã được test cẩn thận để phòng tránh các lỗi, trong đó có SQL Injection nên các lỗi SQL injection đã được giảm đi nhiều.

2.1. Ví dụ tấn công

Hãy xem truy vấn sau:

SELECT * FROM table WHERE column = '" + parameter + "';

Nếu kẻ tấn công thay đổi điều kiện truy vấn bằng cách thay param bằng OR '1'='1' để có 1 câu truy vấn luôn luôn đúng:

SELECT * FROM table WHERE column = ' ' OR '1'='1';

-Và nó sẽ còn tệ hại hơn khi mà người dùng chèn thêm một câu lệnh truy vấn phía sau:

SELECT * FROM table WHERE column = ' ' OR '1'='1'; Drop table users;

Các bạn nhìn vào thì đủ biết chuyện gì sẽ xảy ra đúng không nào.

2.2. Cách phòng chống

Cách phòng trống đối với dạng này thì cũng khá đơn giản. Các bạn chỉ cần ràng buộc thật kỹ dữ liệu người dùng nhập vào và luôn luôn phải có quan điểm 'Đừng bao giờ tin vào những thứ người dùng nhập vào là đúng'.

Luôn ràng buộc kiểu dữ liệu
Trong ứng dụng thì bạn luôn phải nhớ ràng buộc dữ liệu thật cẩn thận.
VD: Như đối với phương thức get url: http://domain.com?id=5.

//Thông thường
$id = $_GET['id'];
//Ràng buộc cẩn thận
$id = isset($_GET['id'])?(string)(int)$_GET['id']:false;

Regular Expression
Hoặc bạn có thể dùng Regular Expression để loại bỏ đi các ký tự lạ hoặc các ký tự cấm. Ví dụ trên:

$id = isset($_GET['id']) ? $_GET['id'] : false;
$id = str_replace('/[^0-9]/', '', $id);

Dùng các hàm có sẵn để giảm thiểu lỗi.
Mỗi khi truy vấn thì mọi người nên sử dụng thêm hàm mysqli_real_escape_string để chuyển đổi một chuỗi thành một query an toàn. Ví dụ:

$id = isset($_GET['id'])?(string)(int)$_GET['id']:false;
$sql= 'SELECT * FROM tbl_user WHERE id= ' . mysqli_real_escape_string($id);

Để đảm bảo tránh được 100% các lỗi liên quan đến SQL injection thì bạn nên sử dụng các framework thay vì code thuần.

3. XSS (Cross-Site Scripting)

Cross-site Scripting (XSS) là lỗ hổng bảo mật cho phép hacker có thể chèn những đoạn mã client-script (thường là Javascript hoặc HTML) vào trang web, khi người dùng vào những trang web này, mã độc sẽ được thực thi trên máy của người dùng (Nói cách khác XSS là một kỹ thuật tấn công buộc 1 trang Web phải hiển thị các đoạn mã độc, sau đó các mã này sẽ được thực thi trên trình duyệt web của người dùng nhờ vào mã javascript, nhằm mục đích thay đổi nội dung trang hoặc ăn cắp thông tin để gửi lại cho kẻ tấn công).
Khác với SQL Injection tấn công vào CSDL của website, XSS tấn công trực tiếp vào người dùng. Lợi dụng lỗi XSS, hacker có thể lừa đảo quản trị của website, ăn cắp cookie, chiếm sesion… từ đó có thể đăng nhập chiếm quyền điều khiển website.
Ví dụ : bạn có 1 bài đăng và các bình luận trong 1 trang web không có validation thì kẻ tấn công có thể vào gửi các bình luận có chứa các thẻ script hoặc các lệnh Javascript. Chúng có thể chạy khắp nơi trong trình duyệt của mọi người dùng khác và ăn cắp cookie đăng nhập của họ, cho phép cuộc tấn công kiểm soát tài khoản của tất cả những người dùng đã xem bình luận chứa mã độc đó.
Để ngăn chặn điều này, bạn cần đảm bảo rằng người dùng không thể đưa bất kỳ nội dung JavaScript nào vào các trang của bạn.

Đây là mối quan tâm đặc biệt trong các ứng dụng web hiện đại, nơi các trang được xây dựng chủ yếu từ nội dung người dùng và đa phần là HTML- sau này được thông dịch sang các framework front-end như Angular và Ember. Các framework này cung cấp nhiều biện pháp bảo vệ XSS, nhưng sự qua lại giữa máy chủ và client lại tạo ra các tuyến tấn công mới và phức tạp hơn : không đơn thuần chỉ là tiêm JavaScript vào HTML, mà còn có thể chèn nội dung sẽ chạy mã bằng cách chèn các chỉ thị Angular hoặc sử dụng Ember helpers.

Cách khắc phục :
Người ta không lường hết được mức độ nguy hiểm của XSS nhưng cũng không quá khó khăn để ngăn ngừa XSS. Giống như SQL Injection, bản chất của lỗi XSS là không kiểm soát kỹ dữ liệu nhập đầu vào, vì thế biện pháp hiệu quả nhất là kiểm tra kỹ dữ liệu nhập vào từ người dùng, chặn các từ khóa nguy hiểm, chỉ chấp nhận những dữ liệu hợp lệ.

Một trong những cách khác hay sử dụng mà không cần kiểm soát đầu vào từ người dùng là mã hoá các kí tự đặc biệt trước khi in ra website, nhất là những gì có thể gây nguy hiểm cho người sử dụng. Để phòng chống XSS tốt nhất là theo nguyên tắc FIEO (Filter Input, Escape Output). Để làm việc này thì hiện tại có khá nhiều bộ lọc để chúng ta lựa chọn. Ví dụ bộ thư viện viết bằng PHP cho phép filter HTML để ngăn chặn kẻ xấu post mã độc XSS thông qua website của bạn.

  • Viết mã lọc nội dung theo nguyên tắc FIEO (Filter Input, Escape Output) - vì các đoạn mã độc bắt đầu với “<script>” và kết thúc với “</script>” . Thay : “<” và “>” = “>” và “<” (các thực thể html) như vậy nó sẽ vẫn được in ra màn hình đúng định dạng mà không hề gây nguy hiểm cho người sử dụng.Ta có đoạn code sau :
str_replace("<",">",$info);str_replace(">","<",$info);str_replace("'","&apos;",$info);str_replace(""",""",$info);
str_replace("&","&",$info);  
  • Mã hóa các ký tự đặc biệt của HTML với hàm htmlentities()
include("../../connect.php");
$query = "select * from message order by time desc";
$result = mysql_query($query);
$numRow = mysql_num_rows($result);
if ($numRow != 0){
 while($row = mysql_fetch_array($result))
 echo $row["content"];
}

Ta thấy ở đoạn code trên biến $row["content"] được in trực tiếp ra mà không qua xử lý. Trường content được nhập vào từ người dùng nên đoạn code này chắc chắn có lỗi XSS. Để khắc phục ta sẽ mã hóa các ký tự đặc biệt của HTML với hàm htmlentities(). Mã nguồn được chỉnh sửa lại như sau:

echo htmlentities($row["content"]);

  • Dùng thư viện có sẵn : HTML Purifier
    Nói sơ qua về HTML Purifier thì đây là bộ thư viện rất mạnh dùng triển khai trong code để chống XSS. Được xây dựng theo mô hình OOP nên sử dụng rất dễ, sau thao tác include file thư viện, chỉ cần tạo instance của đối tượng HTML Purifier và gọi phương thức purify() là có thể filter được dữ liệu đầu vào.
phprequire_once '/path/to/htmlpurifier/library/HTMLPurifier.auto.php';$purifier = new HTMLPurifier();$clean_html = $purifier->purify($dirty_html);

4. Error messages (Thông báo lỗi)

Hãy cẩn thận với lượng thông tin bạn đưa ra trong các thông báo lỗi của mình. Chỉ nên cung cấp lỗi nhỏ cho người dùng, để đảm bảo rằng họ không làm rỏ rỉ bí mật trên máy chủ của bạn (ví dụ như các key API hoặc các password của DB). Không cung cấp đầy đủ chi tiết ngoại lệ vì những điều này có thể làm cho các cuộc tấn công phức tạp như SQL injection trở nên dễ dàng hơn. Giữ các lỗi chi tiết trong nhật ký server và chỉ cung cấp cho user thông tin họ cần.

5. Server side validation/form validation

Validation nên được thực hiện ở cả bên trình duyệt (validate dưới client/user - UI) và server side (server). Phía trình duyệt có thể bắt các lỗi đơn giản như bỏ trống ở các trường bắt buộc hoặc nhập văn bản vào một trường yêu cầu số. Tuy nhiên có thể vẫn sẽ bỏ sót lỗi (mã độc pass), vì vậy bạn cần phải thực hiện validation sâu hơn ở phía máy chủ vì không thực hiện như vậy có thể dẫn đến mã độc hại hoặc mã kịch bản được chèn vào cơ sở dữ liệu hoặc có thể gây ra các kết quả không mong muốn trong trang web của bạn. Tuy vậy, việc đã thực hiện validation ở bên trình duyệt trước rồi cũng sẽ giảm tải công việc cho bên server.

6. Password

Ai cũng biết là nên sử dụng mật khẩu phức tạp thì sẽ bảo mật tốt hơn nhưng không phải ai cũng làm điều đó. Sử dụng mật khẩu mạnh (strong password) ở server và admin là điều rất quan trọng nhưng việc sử dụng mật khẩu mạnh cho người dùng cũng quan trọng không kém để bảo mật tài khoản người dùng được tốt hơn. Nhiều người dùng có thể không thích strong password này vì nó gây ra sự khó khăn trong việc đăng ký hoặc khó để nhớ nhưng mà nó sẽ giúp bảo vệ thông tin trong thời gian dài. Một số yêu cầu có thể gặp để có được 1 strong password : phải lớn hơn hoặc bằng 8 ký tự, có ít nhất 1 chữ in hoa, có ít nhất 1 chữ số, có ít nhất 1 ký tự đặc biệt, bắt đầu bằng ký tự đặc biệt ....

Mật khẩu phải luôn được lưu trữ dưới dạng các giá trị đã được mã hóa, tốt hơn cả là sử dụng thuật toán hàm băm (hash) một chiều như SHA. Sử dụng phương pháp này có nghĩa là khi bạn xác thực người dùng, bạn chỉ cần so sánh các giá trị được mã hóa. Để bảo mật trang web tốt hơn, bạn nên hash password bằng salt để khắc phục weak password. Người dùng có thể chọn một mật khẩu yếu, đó là chuyện bình thường. Tuy nhiên, là người xây dựng hệ thống các bạn cần phải khắc phục điều này. Giải pháp là sử dụng thêm một chuỗi mà thường được gọi là salt.
Hiểu đơn giản như thế này : trong cấu hình của ứng dụng, các bạn lưu trữ một chuỗi (phức tạp dài dòng) được gọi là salt. Trước khi lưu trữ mật mã vào cơ sở dữ liệu chúng ta thực hiện việc kết hợp salt với mật mã. Có nhiều kiểu kết hợp khác nhau, đơn giản nhất là nối chúng lại (ví dụ với PHP):

$crypPassword = md5($rawPassword.$salt);

Sau đó mật mã mới này được lưu vào cơ sở dữ liệu. Khi đó, dù ai đó có toàn bộ dữ liệu của chúng ta cũng không dễ dàng để dò ra mật khẩu dựa vào weak password dictionary được.
Ngoài ra, có thể làm cho hệ thống tốt hơn bằng việc sử dụng salt duy nhất cho mỗi mật mã. Thông thường hệ thống sẽ có rất nhiều thành viên, và việc các thành viên dùng mật khẩu giống nhau là phổ biến. Hãy đặt tình huống hacker có cả hai thông tin là dữ liệu và salt. Nếu chúng ta sử dụng một salt duy nhất, khi ấy tất cả các tài khoản dùng chung mật mã thì mật mã được mã hóa (crypPassword) đều sẽ giống nhau. Kẻ tấn công sẽ chỉ cần brute force một trong số đó là cũng có các tài khoản còn lại mà không tốn thêm công sức gì. Để tránh rủi ro này và làm tăng thêm khó khăn cho kẻ tấn công, hệ thống nên sử dụng các salt duy nhất cho mỗi mật mã. Lúc ấy, mỗi crypPassword sẽ là khác nhau và tất nhiên hacker sẽ không có được danh sách các tài khoản có mật mã giống nhau. Trường hợp xấu nhất là một kẻ tấn công nào đó sẽ làm một cuộc tấn công bằng từ điển hoặc tấn công brute force, về cơ bản nó sẽ đoán (dò) mọi sự kết hợp cho đến khi nó tìm thấy một match (kết quả). Hacker sẽ phải brute force từng tài khoản một -> rất khó khăn cho việc tính toán + dò mật khẩu.
Có nhiều cách để tạo salt độc nhất. Việc này sẽ dễ dàng nếu bạn có kiến thức về các hàm entropy trong ngôn ngữ lập trình đang dùng.

Nhiều CMS cung cấp cho người dùng quản lý với rất nhiều tính năng bảo mật trang web đã được xây dựng bên trong nó, mặc dù một số module cấu hình hoặc module mở rộng có thể được yêu cầu sử dụng password đã được salt hoặc đã thiết lập mật khẩu mạnh tối thiểu. Nếu bạn đang sử dụng .NET, bạn nên sử dụng các nhà cung cấp thành viên vì cấu hình của chúng có sẵn bảo mật trang web và cung cấp các điều khiển readymade để đăng nhập và đặt lại mật khẩu.

7. File uploads

Cho phép người dùng tải file lên trang web của bạn có thể là nguy cơ gây rủi ro lớn cho bảo mật trang web, ngay cả khi chỉ là tính năng đơn giản như thay đổi avatar của người dùng. Rủi ro ở đây là có tệp tin nào đó được tải lên nhìn tưởng chừng như vô hại nhưng có thể có thể chứa một script mà khi thực hiện trên máy chủ sẽ mở ra trang web của bạn. Ví dụ như : khi người dùng của bạn tải lên 1 file ảnh, bạn không thể chỉ dựa vào extension hoặc mime type của file đó để xác minh rằng file đó là một file ảnh vì chúng có thể dễ bị giả mạo. Thậm chí ngay cả khi bạn mở tệp tin và đọc phần header hoặc sử dụng các hàm kiểm tra kích thước ảnh thì cũng không phải là bằng chứng đầy đủ. Hầu hết các định dạng ảnh đều cho phép lưu trữ một phần comment, phần comment này có thể sẽ chứa mã độc và được thực hiện trên server.

Vậy làm sao để ngăn chặn điều này?
Theo mặc định, các máy chủ web sẽ không thực thi các file có extension là ảnh nhưng cũng không nên chỉ dựa vào việc kiểm tra phần extension của file. Một số tùy chọn là đổi tên tệp khi tải lên để đảm bảo phần extension của tệp là chính xác hoặc để thay đổi quyền truy cập tệp, ví dụ chmod 0666 do đó không thể thực hiện được. Nếu sử dụng *nix bạn có thể tạo tệp tin .htaccess sẽ chỉ cho phép truy cập vào tập các file, ngăn chặn cuộc tấn công extension kép được đề cập trước đó.

deny from all
    <Files ~ "^\w+\.(gif|jpe?g|png)$">
    order deny,allow
    allow from all
    </Files>

Nên lưu trữ các ảnh được tải lên ở một thư mục bên ngoài webroot hoặc trong cơ sở dữ liệu dưới dạng blob. Không thể truy cập trực tiếp tới các file này, bạn cần phải tạo một script để fetch từ thư mục riêng (hoặc trình xử lý HTTP trong .NET) và đưa chúng tới trình duyệt. Các thẻ ảnh hỗ trợ thuộc tính scr chứ không phải là URL trực tiếp vào image, src có thể trỏ đến tập lệnh phân phối tập tin của bạn, cung cấp cho bạn đặt đúng loại nội dung trong tiêu đề HTTP. Ví dụ:

<img src="/imageDelivery.php?id=1234" />
     
<?php
      // imageDelivery.php
     
      // Fetch image filename from database based on $_GET["id"]
      ...
     
      // Deliver image to browser
       Header('Content-Type: image/gif');
      readfile('images/'.$fileName);  
     
?>

Hầu hết các nhà cung cấp dịch vụ lưu trữ đều phải cấu hình máy chủ cho bạn, nhưng nếu bạn đang lưu trữ trang web của bạn trên máy chủ của riêng bạn thì có vài điều bạn sẽ muốn kiểm tra. Đảm bảo rằng bạn có một thiết lập tường lửa, và đang chặn tất cả các cổng không cần thiết. Nếu có thể thiết lập DMZ (Demilitarised Zone) chỉ cho phép truy cập vào cổng 80 và 443 từ thế giới bên ngoài. Mặc dù điều này có thể không khả thi nếu bạn không có quyền truy cập vào máy chủ của mình từ mạng nội bộ vì bạn cần phải mở cổng để cho phép tải tệp lên và đăng nhập từ xa vào máy chủ của bạn qua SSH hoặc RDP.

Nếu bạn cho phép các tệp được tải lên từ Internet thì chỉ nên sử dụng các phương thức truyền tải an toàn đến máy chủ của bạn như SFTP hoặc SSH.
Nếu cơ sở dữ liệu của bạn đang chạy trên một máy chủ khác với máy chủ web của bạn. Làm điều này có nghĩa là không thể truy cập trực tiếp máy chủ cơ sở dữ liệu từ thế giới bên ngoài, chỉ có máy chủ web của bạn có thể truy cập vào nó, giảm thiểu nguy cơ dữ liệu của bạn bị lộ. Cuối cùng, đừng quên giới hạn quyền truy cập vào máy chủ của bạn.

8. HTTPS

HTTPS là một giao thức được sử dụng để cung cấp bảo mật qua Internet. HTTPS đảm bảo với người dùng rằng họ đang nói chuyện với máy chủ họ mong đợi và không ai khác có thể đánh chặn hoặc thay đổi nội dung mà họ đang nhìn thấy khi chuyển tiếp.
Nếu có bất cứ thứ gì mà người dùng của bạn muốn riêng tư, bạn chỉ nên sử dụng HTTPS để phân phối nó. Tất nhiên điều này có nghĩa là áp dụng cho thẻ tín dụng và các trang đăng nhập (và URL mà họ gửi đến). Ví dụ một form đăng nhập thường sẽ thiết lập một cookie sẽ được gửi cùng với mọi yêu cầu khác đến trang của bạn mà người dùng đăng nhập tạo ra và được sử dụng để xác thực các yêu cầu đó. Một kẻ tấn công ăn cắp được thông tin này sẽ có thể bắt chước (giả mạo) người dùng một cách hoàn hảo và tiếp quản phiên đăng nhập của họ. Để đánh bại các loại tấn công này, bạn hầu như luôn muốn sử dụng HTTPS cho toàn bộ trang web của mình.
Điều đó không còn khó khăn và tốn kém như trước nữa. Hãy để Encrypt cung cấp các xác nhận hoàn toàn miễn phí và tự động, bạn sẽ cần HTTPS, các tool cộng đồng hiện có sẵn cho một loạt các nền tảng và framework chung để tự động thiết lập điều này cho bạn.

9. Website security tools

Bận có thể bảo mật cho trang web của mình bằng cách sử dụng một số tool bảo mật trang web. Có rất nhiều sản phẩm thương mại và miễn phí để giúp bạn việc này. Chúng hoạt động trên cơ sở tương tự như các tập lệnh mà các hacker sử dụng để kiểm tra tất cả các hành vi khai thác và cố gắng thỏa hiệp trang web của bạn bằng cách sử dụng một số phương pháp đã đề cập trước đó chẳng hạn như SQL injection.
Một số tool miễn phí như:

  • Netsparker : tốt cho kiểm tra SQL injection và XSS
  • OpenVAS
  • SecurityHeaders.io (free online check)
  • Others

Lời kết

Còn rất nhiều các loại tấn công khác và các cách phòng chống khác nhau mà không đề cập trong bài. Có gì thiếu sót mong mọi người góp ý thêm (yeah)

Link tham khảo

Categories

Recent posts