Hiển thị các bài đăng có nhãn Web Developer. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn Web Developer. Hiển thị tất cả bài đăng

[Tutorial] Race condition attack trên ứng dụng web


Race condition là một vấn đề không mới, mình cũng đã biết từ lâu nhưng toàn trên linux. Để hiểu race condition trên web ta xem 1 ví dụ như sau :
Người A có 10000 $ trong tài khoản, anh ta thực hiện rút 5 lần cùng lúc từ internet banking (bỏ qua 1 số token bảo vệ nhé), mỗi lần 10$, nhưng trong tài khoản chỉ trừ 10$ thôi (lẽ ra phải trừ 50). Vậy lỗi xảy ra ở đâu ?
Xem xét đoạn code sau của ngân hàng trong việc trừ tiền :

Khi tiến trình 1 đang thực hiện câu lệnh $tongtien = $tongtien – $sotien thì một tiến trình 2 của người A đang đòi rút chèn ngang, lúc này hệ thống sẽ tạm dừng tiến trình 1 đang xử lý để quay sang xử lý tiến trình 2 :

Lúc này khi bắt đầu xử lý tiến trình 2, tổng tiền chưa được cập nhật bởi tiến trình 1 đã tạm dừng. Do đó số tiền trong tk lúc này vẫn là 10000 và sau khi thực hiện xong cả 2 tiến trình thì tổng tiền vẫn là 9990 mặc dù đã rút 2 lần. Như vậy race condition đã xảy ra khi mà 1 tiến trình chèn ngang tiến trình khác trong lúc các tham số vẫn chưa kịp cập nhật.
Ở đây mình tạo 1 đoạn code lấy tiền với khá nhiều việc, làm cho thời gian xử lý nó lên tới tận 1,2s và cố thử rút 8 lần mà chỉ bị trừ 10$
B1, kiểm tra tài khoản ban đầu và xem access log , lúc này ta đang có 10000:

B2, Xử dụng 1 đoạn python để cùng 1 lúc gửi 8 request, mỗi request đều rút 10$ trong cùng 1 thời gian và xem kết quả trả về :
Như vậy sau 10 request, tổng tiền chỉ bị trừ 10$ trong khi đã rút đến 8 lần.
B3. Kiểm tra log file ta thấy 8 request này tới cùng lúc. Và bởi vì server phải đòi hỏi đến 1 giây để xử lý 1 giao dịch, do đó 8 request này đã làm xuất hiện race condition và bị chèn ngang lẫn nhau.


Nguồn Blog
http://antoanthongtin.wordpress.com

Xem Thêm

 

Các lỗi thường gặp khi viết mã HTML và CSS



Dưới đây là các lỗi thường gặp khi viết mã HTML & CSS mà bạn cần chú ý để có thể validate HTML và CSS

HTML - Sai DOCTYPE
DOCTYPE sẽ nói cho trình duyệt loại mã HTML mà trang web sử dụng, ở HTML 4.01 có 3 loại DOCTYPE chính:

  • HTML 4.01 Strict
  • HTML 4.01 Transitional
  • HTML 4.01 Frameset

Bạn có thể tìm hiểu thêm về DOCTYPE trên w3schools

HTML - Sử dụng id giống nhau
Trên một trang web, class có thể dùng nhiều lần nhưng bạn chỉ được dùng id cho 1 element riêng. Điều này đặc biệt quan trọng khi áp dụng javascript, ajax.

Sử dụng sai:

Code:
<div id="idabc">Information</div> <div id="idabc">Other information</div>
Sử dụng đúng:

Code:
<div id="infomation">Information</div> <div id="otherinfo">Other information</div>
HTML - Đóng thẻ không đúng thứ tự
Việc đóng thẻ đúng thứ tự là rất quan trọng, ví dụ thẻ div chỉ được đóng sau khi tất cả các thẻ trong nó đóng

Sử dụng sai:
Code:
<div><strong>Information</div></strong>
Sử dụng đúng:
Code:
<div><strong>Information</strong></div>

HTML - Viết hoa các tags
Bạn sẽ không validate được mã HTML của mình nếu viết như sau
Code:
<DIV></DIV>

HTML - Sử dụng style ngay trên thẻ (inline style)
Sử dụng style ngay trong thẻ HTML bao giờ cũng nhanh hơn việc đưa chúng vào file CSS riêng, nhưng việc đó làm cho bạn rất vất vả khi thay đổi các thẻ giống nhau và khó gỡ lỗi
Code:
<a href="link.html" style="color: #000; text-decoration: none;">link name</a>
HTML - Sử dụng các kí tự đặc biệt
Hãy chắc chắn rằng bạn sử dụng ký tự đặc biệt đúng cách trong mã HTML vì không phải lúc nào trình duyệt cũng có thể hiểu và xử lý chúng

Sử dụng sai:
Code:
<p> ©, & Stuff</p>
Sử dụng đúng:
Code:
<p>&copy;, &amp; Stuff</p>

HTML - Sử dụng header là ảnh
Khi trong thiết kế có những font không có trong hệ thống, thì bạn cũng không nên dùng như sau:
Code:
<img src="Header.jpg"  alt="Header title" />
Cách sử dụng đúng phải là kết hợp với CSS:
Code:
<h1 class="header">Header Title</h1>
Và style cho header:

Code:
h1.Header{     /*     Mã CSS để ẩn text và hiện background     */ }
HTML - Không có thuộc tính alt
Tại sao phải thêm alt vào trong thẻ img khi không hề có khác biệt? Alt sẽ giúp người đọc xem được thông tin về ảnh khi họ không tải được ảnh đó, nó còn giúp các bộ máy tìm kiếm hiểu bức ảnh hơn (SEO)

Sử dụng sai:
Code:
<img src="image.jpg"  />
Sử dụng đúng:

Code:
<img src="image.jpg"  alt="image alt tag" />
CSS - Không sử dụng cách viết tắt
Code:
border-top:1px solid #00f;  border-right:1px solid #00f;  border-bottom:1px solid #00f;  border-left:1px solid #00f;
Khi cả 4 border như nhau, tại sao bạn không dùng:
Code:
border:1px solid #00f;
CSS - Sử dụng đơn vị cho giá trị bằng 0
Bạn không cần phải điền đơn vị cho các giá trị bằng 0 vì 0px, 0pt, 0em đều bằng nhau.

Code:
/* Thay vì */ padding:0px 0px 5px 0px; /* Bạn nên dùng */ padding:0 0 5px 0;
CSS - Sử dụng mã màu
Bạn có thể khai báo dùng màu 'white', 'black', 'red'... nhưng tốt nhất hãy cho trình duyệt biết chính xác màu hiển thị bằng cách sử dụng mã màu. Và với các mã màu lặp lại như #ffffff, #000000 bạn cũng có thể viết tắt thành #fff hoặc #000
Code:
color: #000; color: #e6a; /* Tương đương với màu #ee66aa */
CSS - Sử dụng sai Position
Khi bạn mới bắt đầu học CSS thì position khá khó hiểu. Bạn có thể sử dụng: static, relative, absolute và fixed. Giá trị mặc định của position là static. Bạn có thể xem cách sử dụng chi tiết tại w3school


Tham khảo ntuts

Xem Thêm

 

PHP - Những điều có thể bạn chưa biết

Thủ thuật khi lập trình PHP
1- Khi echo thay thế print:

Echo luôn luôn hoạt động nhanh hơn print, vì echo không có return gì cả, trong khi print thì luôn return true hay false ( 0 | 1)



<?php
print('Hello, xxxx');

echo "Hello, xxxx";
?>

2- Nháy đơn luôn nhanh hơn nháy kép:
Xét ví dụ sau:

<?php
$abc = 'bbb';
$a = 'abcdef'. $abc;
$b = "abcdef $abc";
?>
Vì nháy kép luôn kiểm tra nội dung bên trong có cái nào là biến hay không. Trong khi nháy đơn thì không kiểm tra, vì nội dung bên trong nháy đơn chắc chắn là chuỗi.


3- Vòng lặp for trong PHP
Mỗi khi thực hiện vòng lặp for() để duyệt một phần tử mảng. Ta thường sử dụng hàm count để đếm số lượng của các phần tử trong mảng. Điều này sẽ làm cho ứng dụng của chúng ta trở nên chậm chạp. Vì lý do mỗi lần thực hiện việc kiểm tra điều kiền thì ta lại phải gọi lại hàm count để đếm số phần tử trong mảng.
Cụ thể:

<?php
for($i=0; $i<=count($a); $i++){
// Hành Động...
}
?>
Cải tiến:

<?php$b = count($a);
for($i=0; $i<=$b; $i++){
// Hành động...
}

?>
4- Đừng back folder khi gọi lại file:
Thói quen back folder của một số lập trình viên cần phải xem xét lại vì. Khi back folder. Hệ thống phải cần thời gian tìm kiếm và định hình đường dẫn. Điều đó sẽ làm cho ứng dụng tốn tài nguyên trong việc thực hiện thao tác này.
Cụ thể:
<?php
include '../../path/a.php';

?>
mã cải tiến

<?php
include BASE.'/path/a.php';

?>
BASE là 1 hằng được định nghĩa từ đầu để chỉ ra đường dẫn vật lý tới thư mục của ứng dụng.

5- Nối chuỗi bằng dấu "," sẽ nhanh hơn dấu "."
Thói quen khi lập trình PHP thường là nối chuỗi và biến bằng dấu “.”. Nhưng thực tế là khi nối chuỗi bằng dấu “,” thì tốc độ xử lý của ứng dụng sẽ được cải tiến và nhanh hơn rất nhiều. Tác giả của bài viết này cũng đã thực hiện ứng dụng để chứng minh điều đó.
http://www.electrictoolbox.com/php-e...concatenation/

<?php
echo $str1 . $str2;
echo $str1 , $str2; // Nhanh hơn

?>
6- Luôn dùng dấu nháy để truy cập khóa của 1 mảng:
Thực tế là các lập trình viên hay bỏ qua điều này vì sự rườm rà của cách viết. Nhưng nếu không có nó thì ứng dụng sẽ lại chậm đi một chút. Vì khi đó nó sẽ xem khóa đó là 1 hằng, và tìm xem có hằng nào định nghĩa hay ko? như vậy sẽ làm code chạy chậm đi do phải mất thời gian xử lý tác vụ biên dịch hằng.
Ví dụ:
<?php
$a = $b['abc']; // nhanh hơn


$a = $b[abc];

?>

Xem Thêm

 

Copyright © Dương-UG Blog's - Nguyễn Bình Dương