Press enter to see results or esc to cancel.

Session, mày sống được bao lâu?

Chào các mẹ ,

Như bữa trước đã nói trong bài “hack” hệ thống captcha của truờng, ta có thể bypass được việc nhập captcha do lỗi của nguời lập trình liên quan đến Session.

Mình cũng đã viết một con bot nhỏ nhỏ để lấy data thời khoá biểu về. Mọi việc diễn ra khá trơn tru mà không cần đến dầu nhớt , tuy nhiên, sau khi ngủ một giấc, chạy lại thì con bot méo get được data. WTF???  Chả lẽ hôm qua chạy đuợc mà hôm nay không chạy được ah

it-ran-last

Ah, vậy đơn giản

problem

Em thử rồi, không đuợc đâu các bác ạ 

Sau một hồi mày mò StackOverFlow thì em cũng biết được nguyên nhân của vấn đề đó là Thời gian sống của session.

Nghĩa là sao? Nghĩa là data mà thằng Session lưu cho từng user sẽ chỉ tồn tại trong một khoảng thời gian và sau đó sẽ bị bác gom phế liệu (garbage collection) thu dọn đi bán ve chai. Tuỳ vào từng ngôn ngữ khác nhau mà Session sẽ có khoảng thời gian sống mặc định khác nhau. Như trường mình dùng PHP thì mình nghĩ chắc để mặc định là 24 phút, cũng chả có nhiều thằng quan tâm đến cái này mấy đâu .

; After this number of seconds, stored data will be seen as 'garbage' and
; cleaned up by the garbage collection process.
session.gc_maxlifetime = 1440

Các bác có thể thay thế giá trị ấy trong file php.ini để Session của mình có thể sống thọ hơn đuợc một tí.

Thử nghiệm

Tuy nhiên đấy chưa phải là tất cả? Mình có thử một đoạn test Session như sau

File setSession.php

<?php
session_start();
$t = time();
$_SESSION['cuthanh'] = $t;
echo "Session cuthanh set with value: ".$t;
?>

File getSession.php

<?php
session_start();
if (isset($_SESSION['cuthanh'])) {
    echo "We got session cuthanh contains value :".$_SESSION['cuthanh']." at ".time();
} else {
    echo "Sorry, all sessions gone!";
}
?>

Khá đơn giản nên em không giải thích gì thêm nha. Okey bây giờ test thử nhé

  • Chạy thử file setSession.php
  • Chạy file getSession.php để xem đã nhận Session chưa
  • Okey, bây giờ ra Find Match trận Dota hoặc làm tập JAV ngắn ngắn (nói chung làm sao trên 24 phút là được)
  • Bây giờ load thử lại getSession.php xem sao nhé.

Theo các bác thì kết quả ra sao? “Sorry, all sessions gone!” hả? Nếu đúng như vậy thì các bác đi mua vé số, lô đề, chơi Dota thì pick PA hoặc OM đi nhé. Tại vì chỉ có 1% cơ hội các bác ra đuợc kết quá như vậy thôi 

Ủa, sao nãy bảo thời gian sống của nó được có 24 phút thôi mà. Nếu các bác đọc kĩ trong chỗ setting php.ini mà mình nói hồi nãy sẽ có dòng

After this number of seconds, stored data will be seen as 'garbage' and cleaned up by garbage collection proccess

Nghĩa là, sau chừng ấy thời gian, Session sẽ được coi như là phế liệu và sẽ bác thu gom phế liệu dọn dẹp.

Vấn đề ở đây là bác thu gom phế liệu bận đi bar rồi  nên lâu lâu rảnh rỗi mới qua nhà các bác lấy phế liệu thôi nhé.

Và tỉ lệ này theo mặc định là 1% nhé. Trong php.ini có đề cập đến vấn đề này như sau

; Define the probability that the 'garbage collection' process is started
; on every session initialization.
; The probability is calculated by using gc_probability/gc_divisor,
; e.g. 1/100 means there is a 1% chance that the GC process starts
; on each request.

session.gc_probability = 1
session.gc_divisor     = 100

Đây chính là lý do mà, sau khi xem tập JAV vào lại getSession.php chỉ có 1% cơ hội là Session sẽ chết, còn lại 99% là nó vẫn còn sống. Vì vậy nếu các bác muốn bác phế liệu chăm chỉ thu gom, không đi quẩy bar bủng các kiểu nữa thì chỉ cần chỉnh lại 2 thông số trên.

Ngoài ra thì các bác có thể lưu Session ở một folder riêng không cho bác ve chai nhìn ngó tới. Cách này cũng khá đơn giản, lại không phải chỉnh lại php.ini nên các bác tự search Google hay StackOverFlow đi nha

Tại sao hôm nay mình lại nói đến vấn đề này?

Tại vì khi code con bot lấy giữ liệu thời khoá biểu của truờng mình thì vấp phải vấn đề thời gian sống của Session khiến cho con bot của mình hôm qua chạy mà hôm nay nó nghỉ. Cho dù mình có chỉnh lại System Time nhưng nó vẫn đình công.

Và với lượng truy cập của hơn 5k sinh viên bách khoa thì 1% cũng khiến cho Session không thế sống quá thọ đuợc

screen-shot-2016-09-29-at-11-26-01-pm

Quả hình để cho các bác khỏi nói em chém gió 

Làm sao để vuợt qua được

Thì nó chết thì kiếm con khác thôi. Ez, huh? Nghĩa là nếu Session cũ của mình chết, mình sẽ xin lại con session mới. Nếu làm như vậy thì cứ sau 24 phút thì mình lại phải “mồi” lại captcha một lần. Mà captcha lại phải nguời nhập, cũng chả khá hơn bao nhiêu nhỉ? 

Theo các bạn, hướng đi nào để mình có thể tiếp tục viết app xem thời khoá biểu đây? Comment bên duới nhé.

Mình đã có cách riêng của mình rồi những chưa chắc là tốt ưu nhất, có gì mình sẽ chia sẻ ở bài viết sau nhé. Thân ái!

Like
Like Love Haha Wow Sad Angry
6
Comments

11 Comments

tuyenvv

Theo như mình tìm hiểu thì cái session.gc_maxlifetime = 1440 là sau 1 thời gian nó đánh dấu cái session kia thành có thể xóa, rồi khi ai đó tạo 1 request đến thì nó cũng tính xác xuất là 1% như ví dụ trên để clear session, nếu như ít ng truy cập thì điều này gần như là khó sảy ra nhưng nếu nhiều ng truy cập thì khả năng khá là cao.

Cách giải quyết của mình là nếu nó ko lấy được thì mình sẽ hiển thị captcha cho người dùng để họ nhập vào rồi chạy tiếp. Coi như là mình đang chống spam trên app của mình.
🙂
Phần session life time này config trên server nên mình nghĩ khả năng giữ lại đc session là không khả thi lắm, nếu bạn có cao kiến thì thử đưa lên mọi ng xem.

Minh Thành

Bạn hiểu về life time của session đúng rồi đấy ^^. Cách giải quyết của bạn thì y chang mấy trang lừa nạp thẻ game hồi truớc, bây giờ không biết còn không.
Tuy nhiên mình muốn xây dựng con bot trả về dữ liệu thuần mà không phải quan tâm đến captcha. Mình sẽ viết cách giải quyết của mình ở bài viết sắp tới, cảm ơn bạn đã quan tâm nhé!

Mạnh Long

Chạy cronjob đều đặn để kéo dài session trước khi nó hết hạn được mà bác nhỉ. :v

Minh Thành

Để mình test thử xem. Cảm ơn ý kiến của bác

tuyenvv

Mình cũng đã nghĩ đến cách này nhưng mà như cái trên sau 1 thời gian x nào đó thì nó sẽ đánh dấu là có thể xóa, mình ko chắc liệu cái life time có bị reset và tính lại từ đầu khi mình vào lại không, theo suy luận của mình chắc là được vì 1 user đăng nhập trên trình duyệt thì ko thể nào đang làm việc lại bị out ra được. Nên mình nghĩ chắc cron là giải pháp dùng được đó.

Minh Thành

Để tối nay mình test thử luôn. Mình cũng có nghĩ tới cách này nhưng chưa biết nó chạy được hay không :p

Duc Nguyen

Hiện tai minh thấy có 1 cái captcha hiện khá nổi tiếng là cái BotDetect captcha, ơ trang captcha.com, mình cũng đang sư dụng nó trong trang login của mình, không biết nó ngon ko nữa. Hay vọng bạn co bài đánh giá hay hack nó xem thế nào.

Minh Thành

Trang này khá Ok trừ việc captcha xấu quá :v. Mình khuyên bạn nên sài hàng của Google https://www.google.com/recaptcha/intro/index.html.
Đối với mình captcha chỉ cần đơn giản 2-3 chữ là để phân biệt giữa người và bot là được rồi. Khi nào dịch vụ của mình lớn lên, nhiều đứa nhòm ngó thì mới cần đầu tư vào captcha.
Tôn trọng người dùng là tốt nhất.

foly

Không nên phí thời gian tìm cách kéo dài session vì captcha này khá dễ đọc, mặc dù cần một chút kiến thức về Image Processing. Anh có viết một PoC bằng python ở đây (http://pastebin.com/qDfmGsPv), tỉ lệ đọc đúng là ~7/10, em có thể tham khảo. Sau khi extract được đoạn captcha thì em có thể kết hợp với lỗ hổng session mà em tìm thấy và chỉ extract lại khi nào session hết hiệu lực.

foly

NB: for educational purposes only 😜

Minh Thành

Đúng cách mà em đang triển khai.
Thanksssssssssssssssss a.


Leave a Comment