OutSystems Security (Part 1)
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ácký 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ộtEncodeSql
call:values = EncodeSql(name1 + "," + name2 + "," + name)
Thay vào đó, sử dụng BuildSafe_InClauseIntegerList và BuildSafe_InClauseTextList functions để build
WHERE column IN (@values)
clauses.
Đố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:
Request bao gồm header X-CSRF-Token.
Request chứa hai cookie xác thực.
Thông tin cookie là xác thực và không giả mạo.
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:
Cookie nr1 <User Provider Name>:
Máy chủ sử dụng cookie để thực thi hết hạn phiên khi cần.
Chứa thông tin cần thiết để đảm bảo tính xác thực của phiên.
Cờ HttpOnly của nó được đặt thành true và không thể truy cập cookie thông qua JavaScript.
Cookie nr2 <User Provider Name>:
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.
Chứa thông tin cần thiết để tránh các cuộc tấn công CSRF.
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 applicationsVớ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
: