TỔNG QUAN
Lý do chọn đề tài
Ngày nay, với sự phát triển mạnh mẽ của công nghệ đặt biệt công nghệ thông tin và viễn thông nhằm tiên phong tạo ra một nền tảng hỗ trợ cho lập trình fullstack và IoT Nên nhóm đề nghiên cứu nền tảng fullstackmqtt dành cho kỹ sư Nhằm phục vụ cho mục đích nghiên cứu và học tập Nhóm rất mong muốn được nhiều nhà phát triển cùng nhau xây dựng FullstackMQTT trở thành nền tảng mạnh mẽ, có thể trợ giúp cho sự phát triển IoT, AIoT và IioT của nước nhà.
Tính cấp thiết của đề tài
Ngày nay, công nghệ mới luôn luôn được ra đời và công việc liên quan cũng được sinh ra, như Facebook ra đời kéo theo đó các lĩnh vực lập trình tự động marketing,
… cũng ra đời Đồng thời, cũng rất nhiều công nghệ cũ cùng với công việc liên quan cũng bị mất đi Chúng ta sẽ rất tốn thời gian nếu như vô tình tìm hiểu về những công nghệ đó Thay vào đó, chúng ta tự tạo ra nền tảng riêng biệt và từ tạo ra cơ hội việc làm thì thật tuyệt vời Nhưng dám nghĩ và dám làm thì vẫn chưa đủ nếu như chúng ta thiếu đi nền tảng kiến thức đến từ sách, các đoạn phim liên quan Đề tài này được xây dựng từ nền kiến thức mà nhóm học tập được từ các sách, bài báo khoa học, các bài học trực tuyến miễn phí và có trả phí trên các nền tảng học tập trực tuyến Đề tài xây dựng ra nền tảng lập trình mới và cũng đặc biệt chứng minh rằng tự học, tự đọc sách và chi trả chi phí cho việc nâng cấp kiến thức bản thân sẽ quan trọng như thế nào đối với mọi người nói chung và học sinh cùng sinh viên nói riêng.
Mục tiêu
Mục tiêu và sản phẩm nhóm hướng tới sau khi hoàn thành dự án là:
Nền tảng fstkmqtt (Fullstack MQTT) dưới dạng module package dành cho python; và đặt biệt cải tiến Broken ở lớp thứ 7 trong mô hình OSI Tài liệu hướng dẫn tích hợp bản thuyết mình Mẫu thử nghiệm.
Phương pháp nghiên cứu và đối tượng nghiên cứu
Các phương pháp nghiên cứu nhóm sử dụng là: Đọc tài liệu đề cập đến mạng OSI Đặc biệt, nghiên cứu sâu tới TCP/IP và các ứng dụng của nó. Đọc tài liệu liên quan đến các chuẩn giao tiếp của giao thức MQTT V3.1 và V5.0.
Xem và học hỏi từ các nguồn chia sẽ kiến thức như youtube, facebook, … Tham gia các cuộc tra đổi học thuật online qua các phần mềm như Messenger,
Trao đổi với giảng viên trợ dẫn để hướng dẫn, đưa lời khuyên. Đối tượng nghiên cứu:
Nghiên cứu về hạ tầng mạng với mô hình OSI Nghiên cứu giao thức mạng TCP/IP
Nghiên cứu giao thức HTTP.
Nghiên cứu giao thức MQTT.
Các sản phẩm tương tự hoặc sản phẩm tiền nhiệm
Hình 1.1 Hình Django dành cho Python.
Django là một trong những nền tảng tốt bậc nhất dành cho python hỗ trợ cho lập trình viên trong lập trình. Ưu điểm:
Bảo mật của Django khá tốt.
Hỗ trợ người dùng mở rộng thoải mái với lưu lượng traffic lớn Dễ sử dụng với Python và mô hình MVC
Dễ học tập với nguồn tài liệu học tập phổ biến dễ tìm
Không đưa ra cảnh báo khi có lỗi.
Tạo bộ định tuyến tương đối khó và phức tạp.
Hình 1.2 Hình nền tảng Flask dành cho Python.
Dễ dàng học tập và nắm bắt.
Dễ dàng tiềm kiếm thông tin tài liệu Có thể phòng chống XSS.
Cần lập trình viên am hiểu về an ninh mạng, hiểu rõ được cách phòng chống các lỗ hổng.
Không thể xem mô tả lỗi.
Khó triển cho việc triển khai.
Phạm vi đề tài
- Triển khai dự án lên các nền tảng mã nguồn mở khác bao gồm hệ thống dịch vụ pip và sourceforce
- Phạm vi sử dụng: Quốc tế.
CƠ SỞ LÝ THUYẾT
Mô hình mạng OSI
2 Lớp liên kết dữ liệu
Là nơi tương tác giữ người dùng với các phần mềm trên thiết bị có thể truy cập mạng.
Là nơi mã hoá dữ liệu từ dữ liệu từ kết quả ở lớp 7 (Lớp ứng dụng).
Là nơi tạo ra các kênh liên lạc qua cổng thông tin (port) có giá trị trong vùng 1 ÷ (2 − 1)
Là nơi vận chuyển dữ liệu qua các giao thức TCP, UDP, ATP, CUDP, RUDP
Quyết định con đường vật lý mà gói dữ liệu sẽ được gửi đi.
Xác định cấu trúc của dữ liệu trên mạng.
Vận chuyển dòng bit thô (0 1) trên phương tiện vật lý.
Lớp ứng dụng: Là nơi có các tương tác giữa người dùng và máy tính qua các ứng dụng mà có thể truy cập dịch vụ mạng tới các hệ thống máy chủ khác nhau trên máy tính của người dùng. Lớp trình bày: Khi người dùng thao tác với phần mềm sinh ra các dữ liệu có thể sử dụng được thì các dữ liệu đó sẽ được chuyển tới lớp trình bày để được xử lý qua các quá trình như mã hoá dữ liệu. Lớp phiên: Là nơi tạo ra kênh để trao đổi giữa 2 máy (2 thực thể) khác nhau qua môi trường mạng, hay gọi là một phiên Lớp này đóng vai trờ quan trọng và chịu trách nhiệm cho việc mở phiên và đảm bảo duy trình hoạt động của một cổng đảm bảo rằng các gói dữ liệu đều được gửi trước khi một trong 2 bên yêu cầu ngắt quá trình do các yếu tố khác ảnh hưởng
Lớp vận chuyển: Đây là lớp mạng đóng vai trò phân rã gói tin từ lớp phiên thành nhiều gói tin phù hợp với tốc độ truyền, phù hợp với lớp phiên tại thiết bị đầu cuối, tạo và kiểm tra tính đúng đắn gói tin nếu không đúng sẽ yêu cầu lại gói đó.
Lớp mạng: Giữ 2 vai trò quan trọng Một là định danh địa chỉ cuối cần nhận Hai là tìm đường đi đến điểm cuối ngắn nhất (Mô hình đồ thị) Các dữ kiện trên sẽ được đính kèm vào gói tin từ lớp vận chuyển đề xuất tới và tạo ra các gói
Lớp liên kết dữ liệu: Từ các gói lớp này sẽ phân chia thành các khung và thực hiện gửi từ nguồn tới đích Lớp này có 2 phần chính bao gồm điều khiển liên kết Logical (LLC) nhằm xác định phương thức mạng, kiểm tra và động bộ
4 hoá các khung dữ liệu Hai là MAC (Media Access Control), địa chỉ MAC đóng vai trò cung cấp kết nối thiết bị và xác định đặc quyền để gửi và nhận dữ liệu.
Lớp vật lý: là nơi tín hiệu số được chuyển đổi thành các tính hiện vật lý học như sóng, điện, cơ, … Một số thiết bị ở lớp vật lý như Ăng-ten của router (Sóng điện trường), Cáp quang, vệ tinh, dây điện, ….
Giao thức mạng TCP
Phương thức TCP xuất hiện ở lớp thứ 4 trong mô hình OSI TCP viết tắt cho cụm từ Transmission Control Protocol.
2.2.1 Lịch sử của giao thức TCP:
Phương thức mạng TCP lần đầu tiên được công bố vào năm
1974 bởi nhà phát triển Vint Cetf và Bob Kahn.
TCP xuất hiện rất nhiều trong thực tế, vì cơ chế của giao thức TCP giúp nó trong nhiều giao thức cao cấp hơn như Telnet, BGP, DHCP, FTP, HTTP, HTTPS, IMAP, IRC, MQTT, XMPP, ….
Trong thực tế giao thức TCP xuất hiện rất nhiều trong thực tế, từ những trang website mà chúng ta tìm kiếm hằng ngày, từ những phần mềm thiết kế như Adobe, phần mềm văn phòng của Microsoft, … Đâu đâu chúng ta cũng đều có thể thấy giao thức TCP xuất hiện.
Trong lập trình, TCP chúng ta có thể tìm bất cứ ở đâu, như socket trong python, winsock trên C, websocket.io trên javascript, ….
2.2.3 Cách hoạt động giao tiếp của phương thức TCP
Hình 2.1 Mô hình giao tiếp giữa máy khách và máy chủ qua giao thức TCP
Ta có cái trạng thái trên hình 3 lần lượt là:
LISTEN: Trạng thái lắng nghe (Chỉ có trên máy chủ).
ESTABLISHED: Trạng thái được thành lập, ở trạng thái này máy khách và máy chủ có thể giao tiếp với nhau qua các khung dữ liệu
FIN_WAIT_1, FIN_WAIT_2: Trạng thái chờ hoàn tất.
CLOSEWAIT: Trạng thái chờ đóng khi hoàn tất tất cả tác vụ truyền nhận giữ hai thiết bị.
LAST_ACK: Trạng thái chờ gói ACK cuối cùng từ nguồn bạn. TIMEWAIT: Trạng thái chờ, thông thường là 2 mili giây.
Ví dụ minh hoạ, máy chủ (Server) có địa chỉ IP là 43.122.32.123 và cổng port được mở là 43226, máy khách (Client) có địa chỉ IP là 213.213.43.123
Khi máy khách kết nối tới máy chủ thì cổng port được mở trên máy khách sẽ là 65322 Ta có các thông tin như sau: Địa chỉ khách: 213.213.43.123/65322 ở trạng thái CLOSED Địa chỉ máy chủ: 43.122.32.123/43226 ở trạng thái LISTEN
Quá trình kết nối như sau:
Client sẽ gửi một gói đồng bộ hoá (SYN) đến Server và chuyển sang trạng thái SYN_SENT.
Khi Server nhận được gói SYN và gửi đến Client SYN + đoạn mã thừa nhận (ACK), đồng thời chuyển trạng thái từ LISTEN sang trạng thái
SYN_RECD Client sẽ gửi trả ACK.
Kết thúc quá trình kiểm tra kết nối Client và Server sẽ kết nối với nhau qua cổng 43226 tại 213.213.43.123 (Đối với Server) với cổng 65322 tại 213.213.43.123 (đối với Client) đồng thời, cả Client và Server sẽ chuyển sang trạng thái ESTABLISHED Sau đó giữa Client và Server sẽ có các đường truyền trao đổi dữ liệu với nhau.
Khi Client muốn chấm dứt kết nối Nó thực hiện điều đó bằng cách gửi FIN và chuyển sang trạng thái FIN_WAIT_1 Khi máy chủ nhận được vây đó, nó sẽ trả lời với ACK và di chuyển đến trạng thái CLOSE_WAIT Khi ACK này được Client nhận được, nó sẽ di chuyển đến trạng thái FIN_WAIT_2, chờ Server đóng kết nối Khi Server đóng kết nối nó cũng gửi một FIN, di chuyển đến trạng thái LAST_ACK Khi Client nhận được gói FIN đó nó sẽ gửi một ACK và chuyển đến trạng thái TIME_WAIT Sau đó sau khoảng 2ms, nó sẽ chuyển sang đến trạng thái đón CLOSED Đồng thời, khi server nhận được gói ACK từ Client thì Server cũng đóng kết nối tới Client
Nếu Client không muốn đóng kết nối thì mối liên hệ giữa Client và Server sẽ duy trì vĩnh viễn (cho đến khi một trong hai bên đóng kết nối hoặc bị gián đoạn kết nối mạng).
Nền tảng WWW (world wide web)
Trước khi hiểu về HTTP chúng ta cùng nhau đi đến khởi nguyên cũng là lý do ra đời của HTTP Đó là WWW (World Wide Web) nền tảng phần mềm đầu tiên hỗ trợ quản lý các tệp siêu văn bản HTML mà chúng ta sẽ tìm hiểu ở mục sau HTTP sinh ra giống như một vị cứu tinh trong việc hỗ trợ tìm kiếm và truy xuất đến các tệp siêu văn bản thông qua các máy chủ trên thế giới được kết nối mạng.
Giao thức HTTP
HTTP viết tắt cho cụm từ Hypertext Transfer Protocol (Giao thức truyền siêu văn bản) được xây dựng trên phương thức có sẵn là TCP
2.4.2 Cách hoạt động của phương thức HTTP trên hạ tầng mạng: Đối với các hồi tiếp tại các trạng thái LISTEN, SYN_SENT,
SYN_RECD của máy khách và máy chủ giống với giao thức TCP. Tại đầu trạng thái ESTABLISHED máy khách sẽ gửi đến máy chủ một gói SYN chứa thông điệp “hello server”.
Khi máy chủ nhận được thông điệp trên thì gửi một gói FIN kèm theo thông điệp “Hello client” và hoàn tất quá trình kết nối.
2.4.3 Các phương thức của giao thức mạng HTTP:
Giao thức HTTP có các phương thức phổ biến sau:
GET: Phương thức GET được dùng để truy xuất thông tin từ máy chủ đã cho bằng URL.
HEAD: Phương thức HEAD cũng tương tự GET, tuy nhiên phương thức này dùng để vận chuyển dòng trạng thái và phần tiêu đề
POST: Phương thức POST dùng để gửi dữ liệu tới Server, ví dụ như hình ảnh, thông tin của người dùng, ….
PUT: Chuyển đổi tất cả đại diện hiện tại của đối tượng nguồn thành nội dụng được tải lên.
DELETE: Xoá toàn bộ đại diện hiện tại của đối tượng nguồn được cung cấp bởi một URL.
CONNECT: Thiết lập một đường hầm đến với máy chủ được xác định bởi một URL.
OPTIONS: Mô tả các thiết lập giao tiếp cho nguồn đối tượng.
Mã hoá dữ liệu
Ngày nay, với sự phát triển mạnh mẽ của công nghệ thông tin và công cuộc số hoá, tự động hoá các thiết bị công, nông nghiệp và nhà thông minh thì chúng ta sẽ không thể không nhắc đến dữ liệu và kho lưu trữ dữ liệu Vấn đề sẽ là làm sao để dữ liệu phải đảm bảo tính toàn vẹn và an toàn đặc biệt có thể vô hiệu hoá gây cản trở đến tin tặc khi họ lấy được dữ liệu? Đó chính là một câu hỏi khó trả lời, đôi lúc một cuộc tấn công an ninh mạng sẽ xảy ra với một công ty, tổ chức nào đó với nhiều cách tấn công như Brute Force, SQLInjection, DLL Injection, tấn công xã hội Cách tấn công nào cũng rất nguy hiểm đối với dữ liệu người dùng và khách hàng Vì vậy, ngay từ thời xa xưa họ đã nghĩ ra một cách tuyệt vời để mê hoặc đi trí thông minh của kẻ tấn công, đó chính là mã hoá Phương pháp mã hoá được sử dụng ở khắp mọi nơi, nó đóng vai trò không thể thiếu trên các lĩnh vực liên quan đến dữ liệu
Một số thuật toán mã hoá đơn giản mà chúng ta có thể đã biết như Mouse Code, MD5… Chúng ta sẽ tìm hiểu sâu hơn ở những phần kế tiếp.
Mã hoá bất đối xứng
Chúng ta đã biết về mã hoá dữ liệu và quá trình hình thành của nó, ở phần này chúng ta sẽ tìm hiểu về mã hoá bất đối xứng Trong kỹ thuật bảo mật dữ liệu, mã
7 hoá bất đối xứng là một dạng mã hoá mạnh nhất, bởi vì đôi khi có một vài thuật toán sẽ băm nhỏ dữ liệu ra tạo thành những đoạn mã vô nghĩa Tuy nhiên, cũng có một số thuật toán mã hoá 2 chiều với các chìa khoá hoàn toàn khác nhau như RSA,
… Mã hoá bất đối xứng đối với dữ liệu thì sẽ tạo ra sự an toàn gần như là tuyệt đối Nhưng, một vài thuật toán có thể làm tăng độ dài của dữ liệu (tốn nhiều không gian ô nhớ máy chủ để lưu trữ hơn) Có thể kể tên đến các loại mã hoá bất đối xứng như SHA, SHA-2 được dùng trong công nghệ Blockchain, MD5, ….
Mã hoá đối xứng
Ở mục 2.6 ở trước chúng ta đã tìm hiểu về mã hoá bất đối xứng, ở phần này chúng ta sẽ tìm hiểu về một dạng mã hoá mà ngắn hơn phần trước một ký tự Mã hoá đối xứng khác với mã hoá bất đối xứng ở chỗ nó có một chìa khoá để mã hoá và giải mã Tuy nhiên, tuỳ thuộc vào độ dài của key mà chúng ta có các đánh giá về độ bảo mật và an toàn của nó Nếu như quá ngắn thì hệ thống có thể bị kẻ tấn công sử dụng các kỹ thuật như Brute force tấn công vào hệ thống thông qua mật khẩu yếu Và, nghiêm trọng hơn là họ có thể xem và giải mã được những tệp tin quan trọng Nhưng hình dưới đây là bảng thuộc tính thời gian tấn công giải mã của hacker đối với độ dài của mật khẩu
Hình 2.2 Thời gian cần thiết để một hacker Brute force mật khẩu của bạn
Như hình 4 ta thấy được độ dài và dạng ký tự của mật khẩu sẽ ảnh hưởng tới thời gian tấn công của một hacker. Điểm mạnh:
Không ảnh hưởng nhiều đến không gian lưu trữ Tiện lợi. Điểm yếu:
Dễ bị tấn công khi mật khẩu yếu.
Phương thức HTTPS
Phương thức HTTPS là một phiên bản khác của phương thức mạng HTTP cùng với sự kết hợp mã hoá dữ liệu Quá trình truyền nhận các gói tin của phương thức HTTPS được đánh giá an toàn và uy tín hơn so với phương thức mạng HTTP Dạng mã hoá phổ biến được sử dụng cho phương thức này là RSA1024 RSA1024 chúng ta sẽ được tìm hiểu ở phần sau
Không mã hoá dữ liệu người dùng Có mã hoá dữ liệu người dùng
Nhanh hơn Chậm hơn vì có mã hoá dữ liệu
Bảng 2.1 So sánh giữa HTTP và HTTPS
Các khái niệm Python cơ bản
2.9.1 Cách thực thi một lệnh Python: Đối với viết mã trực tiếp trên command line:
Hình 2.3 Thực thi lệnh python trên command line. Đối với một tệp tin python
Hình 2.4 Thực thi lệnh python qua một tệp tin *.py 2.9.2 Khái niệm Indentation (Thụt lề) trong Python.
Indentation chỉ đến khoảng trắng trước một dòng code Đối với ngôn ngữ khác như C, Java, Javascript, Cpp, C#, … thì khái niệm indentation chỉ giúp cho chúng ta dễ đọc các mã lệnh hơn Tuy nhiên, đối với Python, khái niệm Indentation là không thể thiếu Indentation sẽ giúp trình biên dịch ngôn ngữ Python hiểu rằng đâu là một khối mã phụ thuộc
Biến trong Python là một dạng có kiểu dữ liệu là Object, tức là, chúng ta có thể thay đổi giá trị của nó theo các kiểu dữ liệu khác nhau mà chúng ta sẽ tìm
9 hiểu ở phần in đậm sau Biến trong Python sẽ được tạo ra khi và khi chúng ta gán giá trị cho nó.
Hình 2.5 Cách tạo ra một biến trong Python (trong command line).
Ghi chú là một phần không thể thiếu trong lúc chúng ta viết một chương trình, nó sẽ giúp chúng ta hiểu hơn về chương trình, hàm con hay một đoạn mã nào đó giúp tổng quan chương trình làm nhiệm vụ gì Ta có hai dạng ghi chú:
Ghi chú trên một dòng:
Hình 2.6 Ghi chú trên một dòng.
Ghi chú trên nhiều dòng: Đối với ghi chú cho các Object hay Hàm thì chúng ta hay sữ dụng bằng cách sau:
Hình 2.7 Ghi chú trên nhiều dòng.
Ta có thể thay dấu nháy đơn thành dấu nháy kép để thức hiện ghi chú nhiều lần.
2.9.5 Các nguyên tắc đặt tên biến
Bắt đầu với các ký tự chữ hoặc “_”.
Trong tên biến có thể có chữ, “_” và số Có phân biệt chữ hoa chữ thường
2.9.6 Các kiểu dữ liệu trong Python:
Kiểu số: int, float, complex.
Kiểu mảng: list, tuple, range.
Kiểu phân loại: set, frozenset.
Kiểu nhị phân: bytes, bytearray và memoryview.
2.9.7 Kiểu văn bản trong Python (str):
Kiểu văn bản trong Python được định nghĩa trong cặp dấu nháy đơn hoặc dấu nháy kép Ví dụ “hello” và ‘hello’, chúng đều là dữ liệu kiểu văn bản trong Python Chúng ta có thể hiển thi dữ liệu ra màn hình console thông qua hàm print().
Hình 2.8 Ví dụ về hàm print trong python.
Ngoài ra, chúng ta có thể tạo ra một biến có kiểu văn bản có dữ liệu nhiều dòng:
Hình 2.9 Ví dụ về biến có dữ liệu là văn bản chứa nhiều dòng thông tin
2.9.8 Cắt văn bản (str) trong Python:
Ta có một biến str sau: a = "Hello python code!" print(a[2:5])
Khi thực thi câu lệnh print(a[2:5]) ta sẽ thu được kết quả là “llo”.
2.9.9 Cắt văn bản từ vị trí đầu tiên trong Python: a = "Hello python code!" print(a[:2])
Khi thực thi câu lệnh trên ta thu được “He”.
2.9.10 Cắt văn bản đến vị trí cuối trong Python: a = "Hello python code!" print(a[5:])
Khi thực thi ta thu được kết quả sau “ python code!”.
2.9.11 Chỉ mục âm: a = "Hello python code!" print(a[-5:-1])
Khi thực thi ta thu được kết quả sau “code” Chúng ta sẽ tìm hiểu chỉ mục âm này kỹ hơn ở phần “Mảng trong Python”
2.9.12 Chuyển đổi dữ liệu sang dạng viết hoa trong Python: a = "Hello python code!" print(a.upper())
Khi thực thi ta thu được kết quả sau “HELLO PYTHON CODE!”
2.9.13 Chuyển đổi dữ liệu sang dạng viết hoa trong Python (với casefold): a = "Hello python code!" print(a.casefold())
Khi thực thi ta thu được kết quả sau “HELLO PYTHON CODE!”
2.9.14 Chuyển đổi dữ liệu sang dạng viết thường trong Python: a = "Hello python code!" print(a.lower())
Khi thực thi ta thu được kết quả sau “hello python code!”
2.9.15 Xoá khoảng trắng thừa trong
Python: a = " Hello python code! " print(a.strip())
Khi thực thi ta thu được kết quả sau “Hello python code!”
2.9.16 Thay thế văn bản trong Python: a = "Hello python code!" print(a.replace(“o”, “a”, 1))
Ta có cấu trúc sau: S.replace(ord_sub, new_sub,) Vì vậy kết quả thu được là “Hella python code!”
2.9.17 Tách văn bản và tạo thành một mảng trong Python: a = "Hello python code!" print(a.split())
Ta có cấu trúc *.split([Ký tự làm mốc tách mặc định là “ ”], Số lần tách) Vì vậy kết quả thu được là [“Hello”, “python”, “code!”]
2.9.18 Nối văn bản trong Python:
Trong Python, chúng ta có thể dùng toán tử cộng đối với các văn bản hoặc biến có kiểu dữ liệu văn bản với nhau Ví dụ: a = "Hello python code!" b = "Python" print(a+b)
Kết quả sẽ là “Hello python code!Python”.
2.9.19 Cấu trúc sắp xếp sẵn cho văn bản trong Python (Phần 1): a = "My name is Bao, I’m {} young!”
Kết quả thu được là “My name is Bao, I’m 18 young!”.
2.9.20 Cấu trúc sắp xếp sẵn cho văn bản trong Python (Phần 2): a = "My name is {1}, I’m {0} young!” print(a.format(18, “Bao”))
Kết quả vẫn sẽ giống ở trên.
2.9.21 Cấu trúc sắp xếp sẵn cho văn bản trong Python (Phần 3): a = "My name is {name}, I’m {age} young!” print(a.format(age = 18, name = “Bao”))
Kết quả vẫn sẽ giống ở trên.
2.9.22 Cấu trúc sắp xếp sẵn cho văn bản trong Python (Phần 4): a = "My name is {name}, I’m {age} young!” print(a.format(age = 18, name = “Bao”))
Kết quả vẫn sẽ giống ở trên.
2.9.23 Cấu trúc sắp xếp sẵn cho văn bản trong Python (Phần 5 – với %): a = "My name is %s, I’m %d young!” print(a%(“Bao”, 18))
Kết quả vẫn sẽ giống ở trên.
2.9.24 Chuyển đổi chữ cái đầu tiên thành chữ viết hoa trong Python: a = "hello code python!” print(a.capitalize())
Kết quả thu được sẽ là “Hello code python!”
2.9.25 Canh đều lề trong Python: a = "Yolo” print(a.center(20))
Ta có cấu trúc hàm như sau *.center(số lượng ký tự, ký tự cần lắp đầy mặc định là “ ”) Vậy nên kết quả thu được sẽ là “ Yolo ”.
2.9.26 Đếm số lần xuất hiện của một văn bản con trong văn bản gốc – Python: a = "Yolo” print(a.count(“o”))
Cấu trúc hàm như sau S.count(sub[, start[, end]]) với sub là văn bản cần đếm, start là vị trí bắt đầu, end là vị trí kết thúc Ta có thể hiểu rằng sẽ tìm trong văn bản S[start: end] Vậy nên kết quả cuối cùng của chương trình trên là 2.
2.9.27 Chuyển đổi văn bản sang chuẩn UTF-8 trong Python: a = "Yolo” print(a.encode())
Kết quả sẽ thu được là b“Yolo” chữ b phía trứa có nghĩa là bytes.
2.9.28 Tìm vị trí của một văn bản con trong Python: a = "Yolo” print(a.index(“o”))
Cấu trúc chúng của hàm là S.index(sub[start, [end]]) với S là một văn bản, start là vị trí bắt đầu (mặc định là 0) và end là vị trí kết thúc (mặc định là cuối văn bản) Tuy nhiên, hàm trên không tìm toàn bộ vị trí mà nó sẽ trả về
13 đầu tiên gặp được Nên kết quả của mẫu trên là 1 Lưu ý, nếu không tìm được sẽ trả về là -1.
2.9.29 Kiểm tra tất cả ký tự có thuộc bảng Alphabet: a = "Yolo” print(a.isalpha())
Cấu trúc S.isalpha() với S là một văn bản, hàm isalpha sẽ trả về True nếu tất cả ký tự đều thuộc trong bảng chữ cái latin (a-Z), còn lại, hàm sẽ trả về False Vì vậy kết quả trên sẽ là True.
2.9.30 Kiểm tra tất cả ký tự có phải là số: a = "Yolo” print(a.isdecimal())
Cấu trúc S.isdecimal() với S là một văn bản, hàm isdecimal sẽ trả về True nếu tất cả ký tự đều thuộc trong bảng số (0-9), còn lại, hàm sẽ trả về False Vì vậy kết quả trên sẽ là False.
2.9.31 Kiểm tra tất cả ký tự có phải là số (Phần 2):
Chúng ta sẽ sử dụng bult-in function của văn bản là isdigit(). Khác với isdecimal, isdigit phạm vi tìm sẽ rộng hơn, trong khi isdecimal chỉ chấp nhận các ký tự số (0-9) nhưng không chấp nhận khi các số đó là cơ số mũ Nhưng với isdigit thì rộng hơn chấp nhận tất cả chỉ cần thoả mãn rằng nó là một số từ 0 đến 9. Boolean trong Python:
Boolean trong Python được biểu diễn dưới 2 loại giá trị True (đúng) và False (sai).
Số nguyên trong Python (int):
Từ khoá trong ngôn ngữ lập trình Python là int, số nguyên trong Python có độ lớn là vô cùng.
Ví dụ khởi tạo biến số nguyên: a = 23123 b = -42389752983475982 c = 75298347598242389752983475982
2.9.34 Số thực trong Python (float):
Từ khoá trong ngôn ngữ lập trình Python là float, số thực trong Python giới hạn số chữ số sau dấu “.” là 15 chữ số Ví dụ về số thực: a = 23. b = -423.12341 c = 8.13e10
Từ khoá trong ngôn ngữ lập trình Python là complex, cấu trúc một số phức là a+bj với a và b là hai số bất kỳ, j là ký tự bắt buộc có ở phần ảo
Ví dụ về số phức: a = 2+3j b = -423.12341j c = 8.13e10j
2.9.36 Toán tử trong Python – Giới thiệu:
Trong Python, toán tử đóng vai trò rất quan trọng vậy nên ở ngôn ngữ lập trình này sẽ được phân chia thành 7 loại toán tử khác nhau:
Trong số học Trong Python
Luỹ thừa của mười AeB với A và B là 2 số
Bảng 2.2 Bảng toán tử số học.
Thực hiện cộng và gán +=
Thực hiện trừ và gán -=
Thực hiện nhân và gán *=
Thực hiện chia và gán /=
Thực hiện luỹ thừa và gán **=
Thực hiện chia lấy dư và gán %=
Thực hiện toán tử bitwise and và gán &=
Thực hiện toán tử bitwise or và gán |=
Thực hiện toán tử bitwise xor và gán ^=
Thực hiện dần sang trái x bit và gán = x
Bảng 2.3 Bảng toán tử chuyển nhượng
Tên toán tử Toán tử
So sánh lớn hơn hoặc bằng >=
So sánh bé hơn hoặc bằng Dần về phải Dần về phải x bit và điền thêm x bit 0 vào vị trí MSB Bảng 2.8 Bảng toán tử bitwise 2.9.44 Danh sách trong Python
Cú pháp tạo một danh sách: Với dữ liệu chúng ta có thể bỏ trống. Tên biến = [dữ liệu]
Ví dụ: a = [“Banana”, “Cherry”, “Kiwi”]
2.9.45 Truy xuất dữ liệu qua chỉ số mục:
Chỉ số trong mảng chúng ta sẽ tìm hiểu ở “2.9.46 Chỉ số trong một mảng” Để truy xuất dữ liệu qua chỉ số mục ta có cấu trúc như sau:
Ví dụ về truy xuất và in dữ liệu tại chỉ số 1 của mảng a:
Kết quả sẽ là “Cherry”
2.9.46 Chỉ số trong một mảng:
Phân tích chỉ số của các phần tử của biến danh sách a ở mục ví dụ trong phần Danh sách trong Python ta được.
Phần tử Banana Cherry Kiwi
Bảng 2.9 Bảng mẫu về chỉ số trong một mảng 2.9.47 Thay đổi giá trị phần tử:
Chúng ta sẽ sử dụng chỉ số để thay đổi giá trị của một phần tử
List Bằng cú pháp [] = .
2.9.48 Thêm phần tử từ một đối tượng: Để thêm một phần tử từ một đối tượng List ta sẽ sử dụng builti- function là l.append() Giá trị mới sẽ được thêm vào vị trí cuối của một mảng.
Ví dụ mẫu: a.append(“Apple”)
Javascript cơ bản
Javascript được viết tắt là Js là một ngôn ngữ đầy đủ tính năng của một loại ngôn ngữ gọi là ngôn ngữ động Được tích hợp và nhúng trong HTML giúp website sống động hơn “HTML chúng ta sẽ tìm hiểu ở phía sau”
Có thể nói một cách cụ thể hơn Javascript có thể làm được nhiều tác vụ như :
+ Cập nhật và thay đổi là HTML và CCS của trang web. Ứng dụng của loại ngôn ngữ này là vô cùng lớn Không chỉ ở việc lập trình website Javascript còn có thể xây dựng ứng dụng cho máy chủ hoặc ứng dụng di động, các apps, game,… Hàm Alert, console.log, comment:
Hàm alert() Hàm alert() trong Javascript có nhiệm vụ hiển thị ra màn hình một hộp thoại kèm theo nội dung do chính chúng ta tạo ta giống với hàm print() Cú pháp:: alert(content)
Ví dụ : alert(‘hello”) Màn hình sẽ hiển thị ra hộp thoại như sau:
Hình 2.14 Hộp thoại sau khi sử dụng hàm alert.
Hàm console.log() Hàm này đươc dùng để debug (sử dụng trong Javascript), nhiệm vụ của nó là show ra giá trị của tất cả các loại dữ liệu như number, interger, array, object.
Cú pháp: console.log(value) Ví dụ: var student = “Binh” console.log(student) // Binh
Có 2 kiểu comment được hiển thị trong Javascript: // Chào bạn mình là Binh
/* Hi bạn mình là Binh*/
Biến dùng để lưu trữ một giá trị dữ liệu.
Có 7 kiểu dữ liệu cơ bản:
String: Ví dụ: var name = “Nguyễn Nam Bình”
Number: Ví dụ: var phone = 0987654321 Boolean: Là một đối tượng đại diện giá trị cho 2 trạng thái TRUE hoặc FALSE trong Javascript. var study = true console.log(study) // true
Undefined: Ý nghĩa là không xác định Khi bản thân người viết không gán bất kỳ giá trị nào cho nó thì khi đó giá trị của biến đó là Undefined
Ví dụ: var a; console.log(a) // Undefined Null:Có nghĩa là giá trị rỗng hoặc giá trị không tồn tại, có thể sử dụng gán cho một biến như một đại diện không có giá trị.
Ví dụ: var test = null; console.log(test) // Null Function:
Var click = function () { Arlert(‘Hello’);
} Object: Là một danh sách các item, mỗi một item là một cặp name-value, tỏng đó value là các kiểu dữ liệu cơ bản, function.
Ví dụ: var person = { name: ‘Binh’, age: 24
} Array cũng là một Object Ví dụ:
Hàm, chức năng gọi là trương trình con (subprogram) có thể được gọi ở bên ngoài hoặc trong chính nó Cú pháp: function nameFuntion (parameter1, parameter2){
Ví dụ: function sum (number1, number2) { return number1 + numbers 2
Function không có tham số và không trả về bất cứ giá trị gì Ví dụ: function hello()
Function có một tham số và trả về một giá trị cụ thể Ví dụ function square(number))
Function self-invoking là function có thể gọi chính nó Ví dụ:
Function vô danh (Anonymous function)
Là hàm ẩn danh, là một hàm được sinh ra đúng vào lúc chương trình bắt đầu chạy Thông thường khi bạn khai báo một hàm thì có thể nằm trên hay dưới vị trí khai báo hàm đều được bởi vì trình biên dịch sẽ lưu lại ở trong bộ nhớ, nhưng với hàm ẩn danh thì nó sẽ hiện ra khi trình biên dịch xử lý tới vị trí của nó.
Ví dụ: var func = function () { console.log(‘Hello function’);
//here if condition true } else {
Ví dụ: so sánh nếu 3>2 thì sẽ in ra True còn không sẽ in ra False. if(3>2) { console.log(‘True’);
Vòng lặp for trong Javascript dùng để lặp một khoảng (min max) nào đó nhằm mục đích xử lý vấn đề của bài toán Ví dụ:
/ Bước nhảy +1 sau mỗi lần lặp là i++ for (i=0; i để thông báo cho trình duyệt web về loại tài liệu Đối với HTML5, khai báo công khai HTML kiểu tài liệu là:
Cấu trúc thẻ HTML và phần tử HTML hay sử dụng:
HTML tags có 2 loại chính là: block-level tags (Phần tử cấp khối) và inline tags (Phần tử nội tuyến).
Database là gì? Vai trò?
Chúng ta sẽ gặp từ database trong nhiều lĩnh vực liên qua đến dữ liệu như công nghệ thông tin, khoa học máy tính, trí tuệ nhân tạo, … Database là một hệ cơ sở dữ liệu giúp lưu lại những giá trị thông tin dưới dạng các tệp trong hệ thống cơ sở dữ liệu.
Database đóng vai trò hết sức quan trọng trong việc làm việc trược tiếp hay gián tiếp với hệ thống cơ sở dữ liệu Database giúp lập trình viên/ người dùng dễ dàng truy xuất đến dữ liệu trong hệ thống cơ sở dữ liệu.
SQLInjection
SQLInjection là các thức tấn công trực tiếp vào quá trình excute query của một hệ thống cơ sở dữ liệu Đây là một lỗ hổng nguy hiểm bậc nhất đối với một cá nhân hay một tổ chức bởi vì khi tin tặc tấn công vào hệ thống cơ sở dữ liệu thì hay trăm hoặc hàng nghìn thậm chí là hàng triệu thông tin nhạy cảm của các khách hàng, nhân viên, quản lý các cấp của tổ chức hoặc thông tin của một cá nhân nào đó sẽ bị rò rỉ ra ngoài.
Vì vậy, rất nguy hiểm đúng không vậy chúng ta sẽ cùng nhau tìm hiểu cách tấn công một hệ cơ sỡ dữ liệu bị lỗi SQLInjection này nhé.
Giả sử, A là người đã tạo ra hệ backend của một trang web làm về lĩnh vực ngân hàng tuy nhiên trong code để xác nhận đăng nhập của anh ta là: SELECT COUNT(*) FROM AccoutTable WHERE user = ‘tài khoản’ AND password = ‘mật khẩu’
Sau đó A dùng kết quả khi execute trên so sánh với số 1 Tuy nhiên đây cũng chính là nơi bắt đầu của bi kịch tại ngân hàng anh A làm.
B là một tin tặc anh ấy thực hiện tấn công như sau:
Và ngân hàng trên đã thực hiện hàng trăm cuộc chuyển tiền không xác định điểm đến sau khi B phát hiện SQLInjection có tồn tại.
Chúng ta sẽ phân tích tại sao cuộc tấn công trên lại thành công Với cách execute của anh A tạo ra thì dòng lệnh thực thi cuối cùng sẽ là: SELECT COUNT(*) FROM AccoutTable WHERE user = ‘admin’ AND password = ‘’ or 1 = 1
Vậy có cách nào để ngăn chặn hành vi tấn công SQLInjection hay không? Câu trả lời là có, chỉ cần trong quá trình trước khi chúng ta truy vấn đến hệ cơ sở dữ liệu thì hãy chuyển đổi tất cả ký tự như “-”, dấu nháy đơn, dấu nháy kép, dấu phẩy thành dữ liệu khác Hoặc đơn giản hơn là chúng ta cấm chúng (ví dụ như facebook năm 2016).
TRIỂN KHAI ĐỒ ÁN
Mã hoá
Mã hoá là một trong những phần không thể thiếu trong một dự án liên quan đến IoT hay liên quan đến các vấn đề trong công nghệ thông tin Mã hoá giúp cho dữ liệu từ người dùng đến máy chủ được an toàn bởi những phương pháp toán học nhằm thay đổi cấu trúc và ngữ nghĩa của một dữ liệu
Lưu đồ giải thuật RSA.
Hình 3.1 Lưu đồ giải thuật thuật toán mã hoá RSA.
Mã tượng trưng: p, q = random.Generate(1024) với 1024 là độ dài key mong muốn
48 p, q = (q, p) if p > q else (p, q) n = p * q CFn = math.lcm(p-1, q-1) e = random.GenerateFrom(1, CFn) for i in range(CFn + e,1, -1): if (e*i) % CFn = 1: d = i break
Sử dụng encoding.decode(format=”PEM”) để mã hoá e và d sau đó lưu thành 2 file có định dạng là *.PEM
Trình bày rõ ràng hơn ở tập bản vẽ lưu đồ - Mục RSA.
Giao thức TCP/IP với Socket
Hình 3.2 Lưu đồ giải thuật TCP/IP với thư viện socket trong python.
Lưu ý: Hình về lưu đồ rõ hơn ở hình “Lưu đồ giải thuật TCP/IP” trong tập đính kèm “TẬP LƯU ĐỒ GIẢI THUẬT”. Đối với TCP/IP với máy chủ socket có 4 hàm chính:
- Hàm tạo một máy chủ với phương thức mạng là TCP/IP.
- Hàm gửi một gói thông tin tới một máy khách.
- Hàm đọc một gói tin được gửi tới máy khách.
- Hàm ngắt kết nối. Đối với hàm tạo một máy chủ với phương thức mạng TCP/IP:
- Thông số đầu vào: bao gồm 4 tham số
+ host: đây có thể là tên miền DNS, hoặc địa chỉ IPv4.
+ port: đây là cổng mạng Lưu ý, giá trị nên nằm từ 1 đế 65535. + listen: Giá trị số lượng truy cập được duy trì tối đa Mặc định là 20
+ timeout: Giá trị thời gian ngắt kết nối khi không có một máy khách nào kết nối đến Mặc định là None.
- Cách chương trình hoạt động:
+ Bước 1: sử dụng hàm thuộc tính gethostbyname() của module socket để lấy địa chỉ IPv4 chính xác.
+ Bước 2: Xác định giá trị đầu vào Port có nằm trong đoạn [1;
65535] hay không Nếu không tới bước 7
+ Bước 3: Khởi tạo một kênh socket với phương thức TCP/IP với các thuộc tính AF_INET và SOCK_STREAM trong hàm thuộc tính socket của module socket.
+ Bước 4: Sau khi khởi tạo máy chủ thì ta sử dụng hàm thuộc tính bind() của module socket với tham số đầu vào là một tuple (ip, port) nhằm mở cổng port của máy chủ có địa chỉ IPv4 là ip.
+ Bước 5: Sau đó, tiến hành thiết lập lắng nghe cho máy chủ TCP/IP và thiết lập thông số timeout.
+ Bước 6 trả về máy chủ TCP/IP đã tạo.
- Code mẫu: def CREATE_SERVER(host, port, listen : int = 20, timeout: int| None = None): ip = socket.gethostbyname(host) if not (1