OutSystems Security (Part 1)

·

5 min read

OutSystems là gì?

OutSystems là một nền tảng Low-code trực quan, giúp tạo ra các ứng dụng có thể tùy chỉnh và xử lý toàn bộ vòng đời phát triển phần mềm.

Outsystems hỗ trợ tích hợp với nhiều cơ sở dữ liệu, các hệ thống bên ngoài, các kết nối mã nguồn mở, API và các dịch vụ đám mây phổ biến. Outsystems đi kèm với nhiều mẫu giao diện người dùng được tạo sẵn cho máy tính để bàn (PC), máy tính bảng (tablet) và ứng dụng di động (mobile).

Web Security

SQL Injection

Outsystems cung cấp các chức năng để thực hiện encode/sanitize để escape và các nội dung độc hại.

Mặc định Outsystems đã sử dụng prepare statement để thực thi truy vấn SQL mà đã define trong SQL elements. Tuy nhiên, SQL injection có thể xảy ra khi Expand Inline property được Enable (Yes). Vì vậy có thể sử dụng EncodeSql() để tránh các ký tự nhất định (').

Ví dụ:

" ' " + EncodeSql(Variable) + " ' "

Attacker có thể sửa đổi parameter Id thành DUMMYSTR OR 1 = 1 và nếu điều đó xảy ra, attacker sẽ có quyền truy cập vào cơ sở dữ liệu.

Note: Nếu Expand Inline được set là Yes , nó sẽ hủy escape content mặc định của outsystems. Vì vậy cần cần thận và có thể sử dụng các funtions VerifySqlLiteral() hoặc EncodeSql() từ Sanitization Extension.

Tuy nhiên, nếu cần phải sử dụng Expand Inline, cần triển khai đúng cách.

  • Không sử dụng EncodeSql để encode toàn bộ contents của một SQL parameter:

      myparameter = EncodeSql("WHERE surname = " + @myVariable1 + " OR name = " + @myVariable2)
    

    Cách này sai hầu hết trong hầu hết các trường hợp và sẽ nhận được cảnh báo nếu thực hiện. Chỉ sử dụng EncodeSql để encode các ký tự chuỗi chứ không phải các fragments của một SQL statement.

  • Không build WHERE column IN (@values) bằng cách wrapping tất cả các giá trị vào trong một EncodeSql call:

      values = EncodeSql(name1 + "," + name2 + "," + name)
    

    Thay vào đó, sử dụng BuildSafe_InClauseIntegerListBuildSafe_InClauseTextList functions để build WHERE column IN (@values) clauses.

    Tham khảo: Building Dynamic SQL Statements the Right Way

Đối với trường hợp sort order trong SQL Queries khi mà cần enbale Expand Inline, có thể tham khảo: How to enable dynamic sorting in a table fed by a SQL query

Cross Site Scripting và HTML Injection

Mặc định, OutSystems đã escapes tất cả các contents trước khi hiển thị tới người dùng.

Tuy nhiên, dev vẫn có thể disbale cơ chế này để custome HTML hoặc javascript. Trong trường hợp này, EncodeJavascript() function sẽ được dùng để đảm bảo an toàn cho ứng dụng khỏi cuộc tấn công này.

Ví dụ: Dev deactivates tính năng escape và không sử dụng hàm EncodeHtml().

Authentication và Session

OutSystems đi kèm với sáu phương thức authentication:

Flow:

Authentication Cookies

Khi thực hiện lệnh call tới server, ứng dụng sẽ gửi cookie xác thực đến máy chủ cùng với một CSRF token trong X-CSRF-Token header.

Server xác thực yêu cầu bằng cách kiểm tra các điều kiện sau:

  1. Request bao gồm header X-CSRF-Token.

  2. Request chứa hai cookie xác thực.

  3. Thông tin cookie là xác thực và không giả mạo.

  4. Login chưa hết hạn.

Hai cookie được sử dụng trong cơ chế xác thực của ứng dụng OutSystems:

  1. Cookie nr1 <User Provider Name>:

    1. Máy chủ sử dụng cookie để thực thi hết hạn phiên khi cần.

    2. Chứa thông tin cần thiết để đảm bảo tính xác thực của phiên.

    3. Cờ HttpOnly của nó được đặt thành true và không thể truy cập cookie thông qua JavaScript.

  2. Cookie nr2 <User Provider Name>:

    1. Cung cấp thông tin cho ứng dụng về mã định danh người dùng thông qua hàm tích hợp GetUserId.

    2. Chứa thông tin cần thiết để tránh các cuộc tấn công CSRF.

    3. Cờ HttpOnly của nó được đặt thành false và cookie có thể được truy cập thông qua JavaScript. Không thay đổi cờ HttpOnly của cookie nr2 thành true, vì điều đó có thể gây ra hành vi không mong muốn của ứng dụng.

Cấu hình session

OutSystems hỗ trợ các cấu hình session như sau:

Cross Site Request Forgery

  • Nếu web được build trên traditional web applications view state được signed với osVisitor cookie. Khi thực hiện requests, view state signature được match với osVisitor. Tham khảo: Cookie usage in OutSystems applications

  • Với trường hợp web sử dụng reactive web applications , cơ bản OutSystems đã có chế chế phòng chống ở X-CSRFToken ở request header và nr2 trong cookie.

  • Với trường hợp phát triển qua API, anti-CSRF tokens không được bật mặc định, vì vậy có thể thực hiện:

Trường hợp sử dụng

Hành động

GET method

- Don't run actions in the Preparation. - When designing your REST API, don't use cookies.

POST method

- Make sure there is a unique token in your request. - Validate against the expected value in the session.

Authorization

OutSystems hỗ trợ kiểm soát truy cập dựa trên role. Các roles cần được tạo từ đội thiết kế một ứng dụng và nó cho phép một nhóm hoặc cá nhân có quyền hoặc không có quyền truy cập vào màn hình hoặc một chức năng cụ thể.

Tạo Role

Tạo một role mới khi phát triển ứng dụng:

Sau khi role được đặt, dev hoặc thành viên khác trong nhóm có thể hạn chế quyền truy cập vào chức năng dựa trên role đó.

Trong hình, page NetworkHome chỉ có thể truy cập được qua các role được chọn qua Roles. Nếu người dùng không có quyền mà cố tình truy cập sẽ được redirect về login page.

Quản lý permissions

Sau khi ứng dụng đang chạy, quản lý users và permissions bằng cách sử dụng back-office hoặc thông qua các API có sẵn cho dev.

Open redirect

Content Security Policy (CSP)

Trong OutSystems bạn kích hoạt tính năng này thông qua Service Center/Administration/Security: