30/09/2018, 17:21

Làm sao để lấy được CSRF TOKEN của DNH

Em đang định thêm chức năng login/comment/… cho cái diễn đànconsole nhưng vướng ngay đoạn đăng nhập:

Đây là POST, GET của diễn đàn khi log in:

Em không biết làm sao để có được con số khoanh xanh lá cây đó

Mà qua được cái đó mới lấy được cái CSRF TOKEN

Nguyễn Phú viết 19:36 ngày 30/09/2018
[URL] http://daynhauhoc.com/session/csrf
[METHOD] GET
[REQUEST HEADER]
Content-Type:application/json
X-Requested-With:XMLHttpRequest

Làm tốt nhé

Thành Phạm viết 19:33 ngày 30/09/2018

Wow, csrf bung ra ầm ầm nhưng mà không dùng được ạ hình như csrf nó phải dựa vào thông tin của user (hoặc ít nhất là có liên quan đến con số dạng 1434510080908 kia)

Vì lúc em thử login tài khoản vào firefox xong lấy cái token lấy từ trong network monitor cho vào python thì login được , xong khi em logout ở firefox ra thì cái token đó mất tác dụng trên python luôn

Em xem source html của trang chủ thì thấy cái này có vẻ liên quan (đều là 1434):

Nguyễn Phú viết 19:32 ngày 30/09/2018

Mình dùng 2 requests -> lấy token -> post login thấy bình thường. Bạn thử lại như mình thử xem:

Bước 1 lấy CRFS TOKEN: 1434510080908 -> timestamp dạng milliseconds nhé.

[URL] http://daynhauhoc.com/session/csrf?_=1434510080908
[METHOD] GET
[HEADER]
Content-Type:application/json
X-Requested-With:XMLHttpRequest
[RESPONSE ]  nhận được 
{
    "csrf": "StU+CWQeJ+zWEySUcn2m4Q3sP25CwlDPs62T21PRza8="
}

Bước 2 Login

[URL] http://daynhauhoc.com/session
[METHOD] POST
[REQUEST HEADER]
X-Requested-With:XMLHttpRequest
X-CSRF-Token:StU+CWQeJ+zWEySUcn2m4Q3sP25CwlDPs62T21PRza8=
[REQUEST DATA] (form-data)
login=username|email
password=password

Lưu ý là bước 2 là submit form bình thường, nên phải bỏ content type là json đi nhé.

P/S: Hy vọng không ai dùng cách này để phá hoại forum

Thành Phạm viết 19:26 ngày 30/09/2018

Thế là số này 1434510080908 lấy từ giờ của máy client đổi ra milisecond hay là giờ của máy chủ ạ em gà web lắm :

Mai Anh Dũng viết 19:27 ngày 30/09/2018

@thangngoc89 hình như mình cần một cái API Key để login đúng không?

Thành Phạm viết 19:30 ngày 30/09/2018

@thangngoc89 hình như mình cần một cái API Key để login đúng không?

Em đọc bên discourse thấy hình như muốn dùng api thì phải “kinh động” đến admin để tạo api_key nên em mới phải làm kiểu này, nếu dùng được api thì có sẵn thư viện pydiscourse luôn

Nguyễn Phú viết 19:24 ngày 30/09/2018

API Key

discourse có cho phép admin tạo API Key đó anh. Nếu anh cung cấp thì bạn ấy thoải mái hơn. nhưng cũng hơi nguy hiểm. Nếu discourse cho phép sử dụng chuẩn OAuth để mọi người viết app thì hay quá.

Thành Phạm viết 19:29 ngày 30/09/2018

discourse có cho phép admin tạo API Key đó anh. Nếu anh cung cấp thì bạn ấy thoải mái hơn. nhưng cũng hơi nguy hiểm. Nếu discourse cho phép sử dụng chuẩn OAuth để mọi người viết app thì hay quá.

Alô alô chim sẻ gọi đại bàng, giúp em nốt đoạn timestamp phát em không biết lấy số đấy ở đâu

Nguyễn Phú viết 19:28 ngày 30/09/2018

Mình không chắc, nhưng mình test trên diễn đàn thì đổi timestamp ra thì khớp với thời gian trên máy mình, phút,giây luôn.
Nên bạn cứ thử giờ của client luôn xem. Chú ý request header cho đúng thôi. Thành công thì giữ cookie lại.

Đinh Quốc Hân viết 19:31 ngày 30/09/2018

API Key chỉ sử dụng các thao tác như tạo, xóa, close, thay đổi topics, categories, users và truy cập thông tin Users, cũng như thông báo thiết lập hệ thống. Nó chưa cho phép OAuth. Shared API key rất nguy hiểm dễ dàng thay đổi hệ thống và quản trị.

P/s: @ltd em đang xây dựng mô hình chát chém gió cho diễn đàn mà ko cần đăng ký mới, lấy thông tin thành viên từ diễn đàn Forum thôi

Thành Phạm viết 19:33 ngày 30/09/2018

Mình không chắc, nhưng mình test trên diễn đàn thì đổi timestamp ra thì khớp với thời gian trên máy mình, phút,giây luôn.Nên bạn cứ thử giờ của client luôn xem. Chú ý request header cho đúng thôi. Thành công thì giữ cookie lại.

API Key chỉ sử dụng các thao tác như tạo, xóa, close, thay đổi topics, categories, users và truy cập thông tin Users, cũng như thông báo thiết lập hệ thống. Nó chưa cho phép OAuth. Shared API key rất nguy hiểm dễ dàng thay đổi hệ thống và quản trị.

P/s: @ltd em đang xây dựng mô hình chát chém gió cho diễn đàn mà ko cần đăng ký mới, lấy thông tin thành viên từ diễn đàn Forum thôi

2 anh có bài tut/video/ebook… nào hay nói về vụ dùng get/post để đăng nhập, csrf với timestamp không, cho em xin để nghiên cứu với, tình hình là cứ làm mò mẫm thế này không ổn (tiếng việt thì càng tốt, không cần quá sâu, chỉ cần cơ bản thôi)

Đinh Quốc Hân viết 19:22 ngày 30/09/2018

Anh cũng đang nghiên cứu cái này

null viết 19:31 ngày 30/09/2018
$.ajax({
  url: 'http://daynhauhoc.com/session/csrf',
  type: 'get',
  dataType: 'json',
  cache: false,
  success: function (response) {
    alert(response.csrf)
  }
});

Cái số bác hỏi, get json nó tự sinh ra hay sao ấy, em dùng hay gặp nó mà cũng chả biết ở đâu ra

Thành Phạm viết 19:23 ngày 30/09/2018

Cái số bác hỏi, get json nó tự sinh ra hay sao ấy, em dùng hay gặp nó mà cũng chả biết ở đâu ra

Em tạo được cái số đấy rồi nhưng đưa vào python thì chưa được, còn chạy bằng add-on firefox httprequester thì ok rồi

Em thấy là toàn bộ quá trình get/post đều không thấy server response cái số đó => số đó được tạo ra trên client => số đó chính là timestamp miliseconds của client => có thể lấy giờ của client để tạo ra số đó

Khoa Nguyen viết 19:28 ngày 30/09/2018

@thangngoc89 hình như mình cần một cái API Key để login đúng không?

1 là cần API key
2 là cần csrf token

Nếu discourse cho phép sử dụng chuẩn OAuth để mọi người viết app thì hay quá.

Gửi request cho Discourse team đi bạn

Thành Phạm viết 19:22 ngày 30/09/2018

2 là cần csrf token

Em đang định đi theo hướng này, nhưng mà không rõ là với điều kiện nào thì csrf token được chấp nhận, em toàn bị BAD CSRF

Nguyễn Phú viết 19:30 ngày 30/09/2018

bạn dùng python sao không thì hỏi bác @ltd về cách gửi request trong python

Thành Phạm viết 19:27 ngày 30/09/2018

Em đang mò lúc nữa không được chắc phải đăng bài hỏi anh em thôi

Em dùng cái thư viện requests của python để làm, nhưng do em không hiểu về nguyên lý get/post với mấy cái liên quan như session, cookies, … nên là khả năng gửi request thiếu thành phần gì đó đang nghi ngờ chỗ cookies hoặc session, từ đầu đến giờ em chưa động đến nó. (hình như diễn đàn dựa vào session_id/cookies và timestamp để tạo token)

Thành Phạm viết 19:31 ngày 30/09/2018

Ầu yeah!!!, lần đầu tiên đăng nhập thành công trên python, muốn khóc quá

c:\>python a.py


/session/csrf.json?_=1434560923287
http://daynhauhoc.com/session/csrf.json
1434560923287
FA2rK3Zv2PzJSMLCDhJBUBNnFFKPAZKZ41MelCTs9Q8=
{"user_badges":[{"id":5011,"granted_at":"2015-05-17T00:46:54.577Z","badge_id":4,
"user_id":2046,"granted_by_id":-1},{"id":4553,"granted_at":"2015-04-29T04:01:01.
360Z","badge_id":3,"user_id":2046,"granted_by_id":-1},{"id":5712,"granted_at":"2
015-05-26T02:06:19.722Z","post_id":34636,"post_number":3,"badge_id":6,"user_id":
2046,"granted_by_id":-1,"topic_id":7648}],"badges":[{"id":4,"name":"Leader","des
cription":null,"grant_count":14,"allow_title":true,"multiple_grant":false,"icon"
:"fa-user","image":null,"listable":true,"enabled":true,"badge_grouping_id":4,"sy
stem":true,"badge_type_id":1},{"id":3,"name":"Regular","description":null,"grant
_count":27,"allow_title":true,"multiple_grant":false,"icon":"fa-user","image":nu
ll,"listable":true,"enabled":true,"badge_grouping_id":4,"system":true,"badge_typ
e_id":2},{"id":6,"name":"Nice Post","description":null,"grant_count":24,"allow_t
itle":false,"multiple_grant":true,"icon":"fa-certificate","image":null,"listable
":true,"enabled":true,"badge_grouping_id":3,"system":true,"badge_type_id":3}],"b
adge_types":[{"id":1,"name":"Gold","sort_order":9},{"id":2,"name":"Silver","sort
_order":8},{"id":3,"name":"Bronze","sort_order":7}],"users":[{"id":2046,"usernam
e":"thanhmssl10","uploaded_avatar_id":2345,"avatar_template":"/user_avatar/daynh
auhoc.com/thanhmssl10/{size}/2345_1.png"},{"id":-1,"username":"system","uploaded
_avatar_id":1,"avatar_template":"/user_avatar/daynhauhoc.com/system/{size}/1_1.p
ng"}],"topics":[{"id":7648,"title":"[Tß╗öNG Hß╗óP] - C├íc k├¬nh Youtube hay nhß║
Ñt m├á bß║ín n├¬n th─âm ├¡t nhß║Ñt mß╗Öt lß║ºn trong ─æß╗¥i","fancy_title":"[Tß╗
öNG Hß╗óP] - C├íc k├¬nh Youtube hay nhß║Ñt m├á bß║ín n├¬n th─âm ├¡t nhß║Ñt mß╗Öt
 lần trong đời","slug":"tong-hop-cac-kenh-youtube-hay-nhat-ma-ban-nen-tham-
it-nhat-mot-lan-trong-doi","posts_count":11}],"user":{"id":2046,"username":"than
hmssl10","uploaded_avatar_id":2345,"avatar_template":"/user_avatar/daynhauhoc.co
m/thanhmssl10/{size}/2345_1.png","name":"Thành Phạm","last_posted_at":"2015-0
6-17T15:59:26.407Z","last_seen_at":"2015-06-17T17:04:58.030Z","bio_raw":"Email:
thanhmssl10@gmail.com\n[Zít húp][2]\nSkype:   thanhmssl10\n\n:blush:  :sunglas
ses: :smile:\n\n\n  [1]: http://facebook.com/thanhconsl\n  [2]: http://github.co
m/thanhmssl10","bio_cooked":"<p>Email: thanhmssl10@gmail.com<br><a href=\"http:/
/github.com/thanhmssl10\">Zít húp</a><br>Skype:   thanhmssl10</p>\n\n<p><img s
rc=\"/images/emoji/emoji_one/blush.png?v=0\" title=\":blush:\" class=\"emoji\" a
lt=\"blush\">  <img src=\"/images/emoji/emoji_one/sunglasses.png?v=0\" title=\":
sunglasses:\" class=\"emoji\" alt=\"sunglasses\"> <img src=\"/images/emoji/emoji
_one/smile.png?v=0\" title=\":smile:\" class=\"emoji\" alt=\"smile\"></p>","crea
ted_at":"2015-03-11T15:02:12.934Z","website":"http://","profile_background":"/up
loads/default/3273/406d7176adedfc2e.png","card_background":"/uploads/default/327
3/406d7176adedfc2e.png","can_edit":false,"can_edit_username":false,"can_edit_ema
il":false,"can_edit_name":false,"stats":[{"action_type":4,"count":78,"id":null},
{"action_type":5,"count":761,"id":null},{"action_type":6,"count":412,"id":null},
{"action_type":1,"count":1625,"id":null},{"action_type":2,"count":897,"id":null}
,{"action_type":7,"count":33,"id":null},{"action_type":9,"count":43,"id":null},{
"action_type":11,"count":35,"id":null}],"can_send_private_messages":false,"can_s
end_private_message_to_user":false,"bio_excerpt":"Email: thanhmssl10@gmail.com<b
r><a href=\"http://github.com/thanhmssl10\">Zít húp</a><br>Skype:   thanhmssl1
0<br>\n\n[blush]  [sunglasses] [smile]<br>","trust_level":4,"moderator":false,"a
dmin":false,"title":null,"badge_count":15,"custom_fields":{},"pending_count":0,"
invited_by":null,"custom_groups":[],"featured_user_badge_ids":[5011,4553,5712],"
card_badge":null}}

Đúng như dự đoán, “thủ phạm” là thằng cookies , bổ sung thêm vào câu trả lời của bác @mrphu3074

Bước 1: lấy CRFS TOKEN: 1434510080908 -> timestamp dạng milliseconds nhé. (lấy từ time của client)

[URL] http://daynhauhoc.com/session/csrf?_=1434510080908
[METHOD] GET
[HEADER]
Content-Type:application/json
X-Requested-With:XMLHttpRequest
[RESPONSE ]  nhận được 

{
    "csrf": "StU+CWQeJ+zWEySUcn2m4Q3sP25CwlDPs62T21PRza8="
}

Nhận cookie từ server response về

Bước 2: Login

[URL] http://daynhauhoc.com/session
[METHOD] POST
[REQUEST HEADER]
X-Requested-With:XMLHttpRequest
X-CSRF-Token:StU+CWQeJ+zWEySUcn2m4Q3sP25CwlDPs62T21PRza8=
[REQUEST DATA] (form-data)
login=username|email
password=password

Gửi lại cookie về cho server
Nguyễn Phú viết 19:23 ngày 30/09/2018

Đúng như dự đoán, “thủ phạm” là thằng cookies , bổ sung thêm vào câu trả lời của bác @mrphu3074

Vì nguyên tắc khi làm login kiểu thủ công này là phải giữ lại cookie để gửi request.

Thành công thì giữ cookie lại.

mình có comment đấy thôi.

Chúc mừng thành công rồi nhá. Tự mò ra lúc nào cũng thấy hưng phấn hơn

Bài liên quan
0