Tại sao việc đặt mã thông báo ngăn chặn CSRF trong cookie lại phổ biến?

310
metamatt 2013-12-11 10:45.

Tôi đang cố gắng hiểu toàn bộ vấn đề với CSRF và các cách thích hợp để ngăn chặn nó. (Các tài nguyên tôi đã đọc, hiểu và đồng ý với: OWASP CSRF Prevention CHeat Sheet , Câu hỏi về CSRF .)

Theo tôi hiểu, lỗ hổng xung quanh CSRF được đưa ra bởi giả định rằng (theo quan điểm của máy chủ web) cookie phiên hợp lệ trong một yêu cầu HTTP đến phản ánh mong muốn của người dùng đã xác thực. Nhưng tất cả cookie cho miền gốc đều được trình duyệt đính kèm một cách kỳ diệu vào yêu cầu, vì vậy thực sự tất cả những gì máy chủ có thể suy ra từ sự hiện diện của cookie phiên hợp lệ trong một yêu cầu là yêu cầu đến từ trình duyệt có phiên được xác thực; nó không thể giả định thêm bất cứ điều gì về đang chạy trong trình duyệt đó hay nó có thực sự phản ánh mong muốn của người dùng hay không. Cách để ngăn chặn điều này là bao gồm thông tin xác thực bổ sung ("mã thông báo CSRF") trong yêu cầu, được thực hiện bằng một số phương tiện khác với việc xử lý cookie tự động của trình duyệt. Nói một cách dễ hiểu thì cookie phiên xác thực người dùng / trình duyệt và mã thông báo CSRF xác thực mã đang chạy trong trình duyệt.

Tóm lại, nếu bạn đang sử dụng cookie phiên để xác thực người dùng ứng dụng web của mình, bạn cũng nên thêm mã thông báo CSRF vào mỗi phản hồi và yêu cầu mã thông báo CSRF phù hợp trong mỗi yêu cầu (thay đổi). Sau đó, mã thông báo CSRF thực hiện một vòng từ máy chủ đến trình duyệt trở lại máy chủ, chứng minh với máy chủ rằng trang đưa ra yêu cầu được chấp thuận bởi (được tạo bởi, thậm chí) bởi máy chủ đó.

Đối với câu hỏi của tôi, đó là về phương thức vận chuyển cụ thể được sử dụng cho mã thông báo CSRF trên khứ hồi đó.

Có vẻ như phổ biến (ví dụ: trong AngularJS , Django , Rails ) gửi mã thông báo CSRF từ máy chủ đến máy khách dưới dạng cookie (tức là trong tiêu đề Set-Cookie) và sau đó Javascript trong máy khách sẽ loại bỏ nó ra khỏi cookie và đính kèm dưới dạng tiêu đề XSRF-TOKEN riêng biệt để gửi trở lại máy chủ.

(Một phương pháp thay thế là phương pháp được đề xuất bởi Express , trong đó mã thông báo CSRF do máy chủ tạo ra được bao gồm trong nội dung phản hồi thông qua mở rộng mẫu phía máy chủ, được đính kèm trực tiếp vào mã / đánh dấu sẽ cung cấp lại cho máy chủ, ví dụ: dưới dạng đầu vào biểu mẫu ẩn. Ví dụ đó là một cách hoạt động web 1.0 ish hơn, nhưng sẽ tổng quát tốt cho một ứng dụng khách JS nặng hơn.)

Tại sao việc sử dụng Set-Cookie làm phương tiện truyền tải xuôi dòng cho mã thông báo CSRF lại rất phổ biến / tại sao đây là một ý tưởng hay? Tôi tưởng tượng rằng tác giả của tất cả các khuôn khổ này đã cân nhắc các lựa chọn của họ một cách cẩn thận và không hiểu sai điều này. Nhưng thoạt nhìn, việc sử dụng cookie để giải quyết vấn đề về cơ bản là một giới hạn thiết kế trên cookie có vẻ hơi khó. Trên thực tế, nếu bạn sử dụng cookie làm phương tiện truyền tải khứ hồi (Set-Cookie: header xuống dòng cho máy chủ để thông báo cho trình duyệt mã thông báo CSRF và Cookie: header ngược dòng để trình duyệt trả nó về máy chủ) bạn sẽ giới thiệu lại lỗ hổng bảo mật. đang cố gắng sửa chữa.

Tôi nhận thấy rằng các khung công tác ở trên không sử dụng cookie cho toàn bộ quy trình cho mã thông báo CSRF; họ sử dụng Set-Cookie xuống dòng, sau đó sử dụng thứ gì đó khác (ví dụ như tiêu đề X-CSRF-Token) ngược dòng và điều này sẽ đóng lỗ hổng bảo mật. Nhưng ngay cả việc sử dụng Set-Cookie làm phương tiện truyền tải xuôi dòng cũng có thể gây hiểu lầm và nguy hiểm; trình duyệt bây giờ sẽ đính kèm mã thông báo CSRF cho mọi yêu cầu bao gồm cả các yêu cầu XSRF độc hại chính hãng; tốt nhất là làm cho yêu cầu lớn hơn mức cần thiết và tệ nhất là một số đoạn mã máy chủ có ý nghĩa tốt nhưng sai lầm có thể thực sự cố gắng sử dụng nó, điều này thực sự tồi tệ. Và hơn nữa, vì người nhận dự định thực sự của mã thông báo CSRF là Javascript phía máy khách, điều đó có nghĩa là cookie này không thể được bảo vệ chỉ bằng http. Vì vậy, việc gửi mã thông báo CSRF xuống dòng trong tiêu đề Set-Cookie có vẻ không tối ưu đối với tôi.

4 answers

281
SilverlightFox 2013-12-12 01:48.

Một lý do chính đáng mà bạn đã đề cập là khi cookie CSRF đã được nhận, nó sẽ có sẵn để sử dụng trong toàn bộ ứng dụng trong tập lệnh ứng dụng khách để sử dụng ở cả dạng thông thường và AJAX POST. Điều này sẽ có ý nghĩa trong một ứng dụng nặng JavaScript, chẳng hạn như ứng dụng được AngularJS sử dụng (sử dụng AngularJS không yêu cầu ứng dụng đó phải là một ứng dụng trang duy nhất, vì vậy nó sẽ hữu ích khi trạng thái cần chuyển giữa các yêu cầu trang khác nhau trong đó giá trị CSRF thường không thể tồn tại trong trình duyệt).

Hãy xem xét các tình huống và quy trình sau trong một ứng dụng điển hình để biết một số ưu và nhược điểm của từng cách tiếp cận mà bạn mô tả. Chúng dựa trên Mẫu mã thông báo đồng bộ hóa .

Yêu cầu Phương pháp Tiếp cận Cơ quan

  1. Người dùng đăng nhập thành công.
  2. Máy chủ phát hành cookie xác thực.
  3. Người dùng nhấp để điều hướng đến một biểu mẫu.
  4. Nếu chưa được tạo cho phiên này, máy chủ sẽ tạo mã thông báo CSRF, lưu trữ mã này so với phiên người dùng và xuất nó vào một trường ẩn.
  5. Người dùng gửi biểu mẫu.
  6. Máy chủ kiểm tra trường ẩn khớp với mã thông báo được lưu trữ phiên.

Ưu điểm:

  • Đơn giản để thực hiện.
  • Hoạt động với AJAX.
  • Làm việc với các biểu mẫu.
  • Cookie thực sự có thể là Chỉ HTTP .

Nhược điểm:

  • Tất cả các biểu mẫu phải xuất trường ẩn trong HTML.
  • Bất kỳ AJAX POST nào cũng phải bao gồm giá trị.
  • Trang phải biết trước rằng nó yêu cầu mã thông báo CSRF để nó có thể đưa nó vào nội dung trang, do đó tất cả các trang phải chứa giá trị mã thông báo ở đâu đó, điều này có thể làm cho việc triển khai cho một trang web lớn mất thời gian.

Tiêu đề HTTP tùy chỉnh (xuống dòng)

  1. Người dùng đăng nhập thành công.
  2. Máy chủ phát hành cookie xác thực.
  3. Người dùng nhấp để điều hướng đến một biểu mẫu.
  4. Trang tải trong trình duyệt, sau đó yêu cầu AJAX được thực hiện để truy xuất mã thông báo CSRF.
  5. Máy chủ tạo mã thông báo CSRF (nếu chưa được tạo cho phiên), lưu trữ mã này so với phiên người dùng và xuất nó ra tiêu đề.
  6. Người dùng gửi biểu mẫu (mã thông báo được gửi qua trường ẩn).
  7. Máy chủ kiểm tra trường ẩn khớp với mã thông báo được lưu trữ phiên.

Ưu điểm:

  • Hoạt động với AJAX.
  • Cookie có thể là Chỉ HTTP .

Nhược điểm:

  • Không hoạt động nếu không có yêu cầu AJAX để nhận giá trị tiêu đề.
  • Tất cả các biểu mẫu phải có giá trị được thêm động vào HTML của nó.
  • Bất kỳ AJAX POST nào cũng phải bao gồm giá trị.
  • Trang phải thực hiện yêu cầu AJAX trước để nhận mã thông báo CSRF, vì vậy mỗi lần trang sẽ có thêm một chuyến đi khứ hồi.
  • Cũng có thể chỉ cần xuất mã thông báo đến trang sẽ lưu yêu cầu bổ sung.

Tiêu đề HTTP tùy chỉnh (ngược dòng)

  1. Người dùng đăng nhập thành công.
  2. Máy chủ phát hành cookie xác thực.
  3. Người dùng nhấp để điều hướng đến một biểu mẫu.
  4. Nếu chưa được tạo cho phiên này, máy chủ sẽ tạo mã thông báo CSRF, lưu trữ mã này so với phiên người dùng và xuất nó trong nội dung trang ở đâu đó.
  5. Người dùng gửi biểu mẫu qua AJAX (mã thông báo được gửi qua tiêu đề).
  6. Máy chủ kiểm tra tiêu đề tùy chỉnh khớp với mã thông báo được lưu trữ phiên.

Ưu điểm:

  • Hoạt động với AJAX.
  • Cookie có thể là Chỉ HTTP .

Nhược điểm:

  • Không hoạt động với các biểu mẫu.
  • Tất cả các AJAX POST phải bao gồm tiêu đề.

Tiêu đề HTTP tùy chỉnh (ngược dòng và xuôi dòng)

  1. Người dùng đăng nhập thành công.
  2. Máy chủ phát hành cookie xác thực.
  3. Người dùng nhấp để điều hướng đến một biểu mẫu.
  4. Trang tải trong trình duyệt, sau đó yêu cầu AJAX được thực hiện để truy xuất mã thông báo CSRF.
  5. Máy chủ tạo mã thông báo CSRF (nếu chưa được tạo cho phiên), lưu trữ mã này so với phiên người dùng và xuất nó ra tiêu đề.
  6. Người dùng gửi biểu mẫu qua AJAX (mã thông báo được gửi qua tiêu đề).
  7. Máy chủ kiểm tra tiêu đề tùy chỉnh khớp với mã thông báo được lưu trữ phiên.

Ưu điểm:

  • Hoạt động với AJAX.
  • Cookie có thể là Chỉ HTTP .

Nhược điểm:

  • Không hoạt động với các biểu mẫu.
  • Tất cả AJAX POST cũng phải bao gồm giá trị.
  • Trang phải thực hiện yêu cầu AJAX trước để nhận mã thông báo CRSF, vì vậy mỗi lần trang sẽ có thêm một chuyến đi khứ hồi.

Set-Cookie

  1. Người dùng đăng nhập thành công.
  2. Máy chủ phát hành cookie xác thực.
  3. Người dùng nhấp để điều hướng đến một biểu mẫu.
  4. Máy chủ tạo mã thông báo CSRF, lưu trữ nó với phiên người dùng và xuất nó thành cookie.
  5. Người dùng gửi biểu mẫu qua AJAX hoặc qua biểu mẫu HTML.
  6. Máy chủ kiểm tra tiêu đề tùy chỉnh (hoặc trường biểu mẫu ẩn) khớp với mã thông báo được lưu trữ phiên.
  7. Cookie có sẵn trong trình duyệt để sử dụng trong AJAX bổ sung và các yêu cầu biểu mẫu mà không cần yêu cầu bổ sung tới máy chủ để truy xuất mã thông báo CSRF.

Ưu điểm:

  • Đơn giản để thực hiện.
  • Hoạt động với AJAX.
  • Làm việc với các biểu mẫu.
  • Không nhất thiết phải yêu cầu AJAX để nhận giá trị cookie. Bất kỳ yêu cầu HTTP nào cũng có thể truy xuất nó và nó có thể được thêm vào tất cả các biểu mẫu / yêu cầu AJAX thông qua JavaScript.
  • Sau khi mã thông báo CSRF đã được truy xuất, vì nó được lưu trữ trong cookie, giá trị có thể được sử dụng lại mà không cần yêu cầu bổ sung.

Nhược điểm:

  • Tất cả các biểu mẫu phải có giá trị được thêm động vào HTML của nó.
  • Bất kỳ AJAX POST nào cũng phải bao gồm giá trị.
  • Cookie sẽ được gửi cho mọi yêu cầu (tức là tất cả GET cho hình ảnh, CSS, JS, v.v., không liên quan đến quá trình CSRF) tăng kích thước yêu cầu.
  • Cookie không được là Chỉ HTTP .

Vì vậy, phương pháp tiếp cận cookie khá động cung cấp một cách dễ dàng để truy xuất giá trị cookie (bất kỳ yêu cầu HTTP nào) và sử dụng nó (JS có thể tự động thêm giá trị vào bất kỳ biểu mẫu nào và nó có thể được sử dụng trong các yêu cầu AJAX dưới dạng tiêu đề hoặc dưới dạng giá trị hình thức). Khi mã thông báo CSRF đã được nhận cho phiên, không cần tạo lại nó vì kẻ tấn công sử dụng khai thác CSRF không có phương pháp lấy mã thông báo này. Nếu người dùng độc hại cố gắng đọc mã thông báo CSRF của người dùng bằng bất kỳ phương pháp nào ở trên thì điều này sẽ bị ngăn chặn bởi Chính sách nguồn gốc tương tự . Nếu người dùng độc hại cố gắng truy xuất phía máy chủ mã thông báo CSRF (ví dụ: thông qua curl) thì mã thông báo này sẽ không được liên kết với cùng một tài khoản người dùng vì cookie phiên xác thực của nạn nhân sẽ bị thiếu trong yêu cầu (nó sẽ là của kẻ tấn công - do đó nó đã thắng không được liên kết phía máy chủ với phiên của nạn nhân).

Cũng như Mẫu mã thông báo đồng bộ hóa , còn có phương pháp ngăn chặn Double Submit Cookie CSRF, tất nhiên phương pháp này sử dụng cookie để lưu trữ một loại mã thông báo CSRF. Điều này dễ thực hiện hơn vì nó không yêu cầu bất kỳ trạng thái phía máy chủ nào cho mã thông báo CSRF. Trên thực tế, mã thông báo CSRF có thể là cookie xác thực tiêu chuẩn khi sử dụng phương pháp này và giá trị này được gửi qua cookie như bình thường với yêu cầu, nhưng giá trị cũng được lặp lại trong trường hoặc tiêu đề ẩn, trong đó kẻ tấn công không thể sao chép như họ không thể đọc giá trị ngay từ đầu. Tuy nhiên, bạn nên chọn một cookie khác, không phải cookie xác thực để cookie xác thực có thể được bảo mật bằng cách được đánh dấu HttpOnly. Vì vậy, đây là một lý do phổ biến khác khiến bạn tìm cách ngăn chặn CSRF bằng phương pháp dựa trên cookie.

69
Tongfa 2016-10-08 13:15.

Việc sử dụng cookie để cung cấp mã thông báo CSRF cho máy khách không cho phép một cuộc tấn công thành công vì kẻ tấn công không thể đọc giá trị của cookie và do đó không thể đặt nó ở nơi mà xác thực CSRF phía máy chủ yêu cầu.

Kẻ tấn công sẽ có thể gây ra một yêu cầu đến máy chủ với cả cookie mã thông báo xác thực và cookie CSRF trong tiêu đề yêu cầu. Nhưng máy chủ không tìm kiếm mã thông báo CSRF dưới dạng cookie trong tiêu đề yêu cầu, nó đang tìm kiếm trọng tải của yêu cầu. Và ngay cả khi kẻ tấn công biết nơi đặt mã thông báo CSRF trong tải trọng, họ sẽ phải đọc giá trị của nó để đặt nó ở đó. Nhưng chính sách nguồn gốc chéo của trình duyệt ngăn không cho đọc bất kỳ giá trị cookie nào từ trang web mục tiêu.

Logic tương tự không áp dụng cho cookie mã thông báo xác thực, vì máy chủ mong đợi nó trong tiêu đề yêu cầu và kẻ tấn công không phải làm bất kỳ điều gì đặc biệt để đặt nó ở đó.

10
metamatt 2013-12-11 10:53.

Dự đoán tốt nhất của tôi về câu trả lời: Hãy xem xét 3 tùy chọn này để biết cách tải mã thông báo CSRF từ máy chủ xuống trình duyệt.

  1. Trong phần thân yêu cầu (không phải tiêu đề HTTP).
  2. Trong tiêu đề HTTP tùy chỉnh, không phải Set-Cookie.
  3. Dưới dạng cookie, trong tiêu đề Set-Cookie.

Tôi nghĩ rằng phần đầu tiên, phần nội dung yêu cầu (trong khi được trình bày bằng hướng dẫn Express mà tôi đã liên kết trong câu hỏi ), không phù hợp với nhiều tình huống; không phải tất cả mọi người đều tạo động mọi phản hồi HTTP; nơi cuối cùng bạn cần đặt mã thông báo trong phản hồi được tạo có thể rất khác nhau (trong một đầu vào biểu mẫu ẩn; trong một đoạn mã JS hoặc một biến có thể truy cập bằng mã JS khác; thậm chí có thể trong một URL mặc dù điều đó nói chung là một nơi tồi tệ để đặt mã thông báo CSRF). Vì vậy, mặc dù khả thi với một số tùy chỉnh, nhưng # 1 là một nơi khó để thực hiện phương pháp một kích thước phù hợp với tất cả.

Cái thứ hai, tiêu đề tùy chỉnh, hấp dẫn nhưng không thực sự hoạt động, bởi vì trong khi JS có thể lấy tiêu đề cho một XHR mà nó gọi ra, nó không thể lấy tiêu đề cho trang mà nó đã tải .

Điều đó để lại cái thứ ba, một cookie được mang bởi tiêu đề Set-Cookie, như một cách tiếp cận dễ sử dụng trong mọi tình huống (máy chủ của bất kỳ ai cũng có thể đặt tiêu đề cookie theo yêu cầu và không quan trọng loại dữ liệu nằm trong phần thân yêu cầu). Vì vậy, bất chấp những mặt trái của nó, nó là phương pháp dễ dàng nhất để các framework triển khai rộng rãi.

2
Stephan van Hoof 2019-01-24 02:15.

Ngoài cookie phiên (loại tiêu chuẩn), tôi không muốn sử dụng thêm cookie.

Tôi đã tìm thấy một giải pháp phù hợp với tôi khi xây dựng Ứng dụng web một trang (SPA), với nhiều yêu cầu AJAX. Lưu ý: Tôi đang sử dụng Java phía máy chủ và JQuery phía máy khách, nhưng không có gì kỳ diệu vì vậy tôi nghĩ nguyên tắc này có thể được thực hiện trong tất cả các ngôn ngữ lập trình phổ biến.

Giải pháp của tôi mà không có thêm cookie rất đơn giản:

Phía khách hàng

Lưu trữ mã thông báo CSRF được máy chủ trả về sau khi đăng nhập thành công trong một biến chung (tất nhiên là nếu bạn muốn sử dụng lưu trữ web thay vì lưu trữ chung). Hướng dẫn JQuery cung cấp tiêu đề X-CSRF-TOKEN trong mỗi lệnh gọi AJAX.

Trang "chỉ mục" chính chứa đoạn mã JavaScript này:

// Intialize global variable CSRF_TOKEN to empty sting. 
// This variable is set after a succesful login
window.CSRF_TOKEN = '';

// the supplied callback to .ajaxSend() is called before an Ajax request is sent
$( document ).ajaxSend( function( event, jqXHR ) {
    jqXHR.setRequestHeader('X-CSRF-TOKEN', window.CSRF_TOKEN);
}); 

Phía máy chủ

Khi đăng nhập liên tục, hãy tạo một mã thông báo CSRF ngẫu nhiên (và đủ dài), lưu trữ mã này trong phiên phía máy chủ và gửi lại cho máy khách. Lọc các yêu cầu đến (nhạy cảm) nhất định bằng cách so sánh giá trị tiêu đề X-CSRF-TOKEN với giá trị được lưu trữ trong phiên: các yêu cầu này phải khớp.

Các lệnh gọi AJAX nhạy cảm (POST dữ liệu biểu mẫu và NHẬN dữ liệu JSON) và bộ lọc phía máy chủ bắt chúng, nằm trong đường dẫn / dataservice / *. Yêu cầu đăng nhập không được chạm vào bộ lọc, vì vậy chúng nằm trên một đường dẫn khác. Các yêu cầu về tài nguyên HTML, CSS, JS và hình ảnh cũng không có trên đường dẫn / dataservice / *, do đó không được lọc. Những thứ này không có gì bí mật và không thể gây hại, vì vậy điều này là tốt.

@WebFilter(urlPatterns = {"/dataservice/*"})
...
String sessionCSRFToken = req.getSession().getAttribute("CSRFToken") != null ? (String) req.getSession().getAttribute("CSRFToken") : null;
if (sessionCSRFToken == null || req.getHeader("X-CSRF-TOKEN") == null || !req.getHeader("X-CSRF-TOKEN").equals(sessionCSRFToken)) {
    resp.sendError(401);
} else
    chain.doFilter(request, response);
}   

Related questions

MORE COOL STUFF

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett đã bất chấp những lời khuyên hẹn hò điển hình khi cô gặp chồng mình.

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Michael Sheen là một diễn viên phi lợi nhuận nhưng chính xác thì điều đó có nghĩa là gì?

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Ngôi sao của Hallmark Colin Egglesfield chia sẻ về những cuộc gặp gỡ với người hâm mộ ly kỳ tại RomaDrama Live! cộng với chương trình INSPIRE của anh ấy tại đại hội.

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Bạn sẽ phải phủi sạch đầu đĩa Blu-ray hoặc DVD để xem tại sao Northern Exposure trở thành một trong những chương trình nổi tiếng nhất của thập niên 90.

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

8 công dụng tuyệt vời của Baking Soda và Giấm

8 công dụng tuyệt vời của Baking Soda và Giấm

Bạn biết đấy, hai sản phẩm này là nguồn điện để làm sạch, riêng chúng. Nhưng cùng với nhau, chúng có một loạt công dụng hoàn toàn khác.

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Thủy điện rất cần thiết cho lưới điện của Hoa Kỳ, nhưng nó chỉ tạo ra năng lượng khi có nước di chuyển. Bao nhiêu nhà máy thủy điện có thể gặp nguy hiểm khi các hồ và sông cạn kiệt?

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Tóc tỉa từ các tiệm và các khoản quyên góp cá nhân có thể được tái sử dụng như những tấm thảm thấm dầu và giúp bảo vệ môi trường.

Đây là Tổng thống Trump đe dọa 'trợ cấp' xe điện của GM vì đóng cửa nhà máy

Đây là Tổng thống Trump đe dọa 'trợ cấp' xe điện của GM vì đóng cửa nhà máy

Trump và Giám đốc điều hành GM Mary Barra vào năm 2017. Kể từ khi tin tức nổ ra ngày hôm qua rằng General Motors đang cắt giảm việc làm ở Bắc Mỹ để chuẩn bị cho tương lai điện / xe tự hành / khủng khiếp có thể xảy ra của chúng tôi, gần như tất cả mọi người đã tự hỏi: Tổng thống Trump, người đã vận động tranh cử trên một nền tảng sẽ như thế nào của việc mang lại và duy trì việc làm ô tô của Mỹ, phải nói gì về điều này? Bây giờ chúng ta biết.

Bản vá lỗi tiếp theo của Fallout 76 sẽ mang lại một số bản sửa lỗi cần thiết

Bản vá lỗi tiếp theo của Fallout 76 sẽ mang lại một số bản sửa lỗi cần thiết

Bethesda cho biết ngày hôm nay trên Reddit, Fallout 76 sẽ có một bản vá lớn khác vào ngày 4 tháng 12, sẽ bắt đầu cố gắng khắc phục một số vấn đề lớn hơn của trò chơi. Ngoài ra, công ty cho biết họ có kế hoạch giao tiếp nhiều hơn trong tương lai về những gì nhóm Fallout 76 đang làm việc và khi nào các bản cập nhật mới cho trò chơi sẽ ra mắt.

Mạng lưới bệnh viện Công giáo sẽ không cho phép nhân viên phá thai tại phòng khám ngoài giờ làm việc

Mạng lưới bệnh viện Công giáo sẽ không cho phép nhân viên phá thai tại phòng khám ngoài giờ làm việc

Bạn có biết rằng một trong sáu bệnh nhân ở bệnh viện ở Hoa Kỳ được điều trị tại một cơ sở Công giáo? Và bạn có biết rằng quyền sở hữu của Công giáo hạn chế sâu sắc việc thiết lập các thủ tục y tế có thể được thực hiện trong các bệnh viện này, rõ ràng nhất là khi nói đến chăm sóc sức khỏe sinh sản? Bây giờ NPR báo cáo rằng sự gia tăng của các bệnh viện thuộc Công giáo đang gây khó khăn hơn cho các bác sĩ — những người bị cấm bởi các quy định do Hoa Kỳ viết.

Khói từ đám cháy rừng ở California đã đến tận thành phố New York

Khói từ đám cháy rừng ở California đã đến tận thành phố New York

Đường chân trời San Francisco bị che khuất bởi khói và khói mù do cháy rừng phía sau Đảo Alcatraz, Thứ Tư, ngày 14 tháng 11 năm 2018, ở San Francisco.

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Rothschild's luggage got lost, but luckily she has an incredible closet to shop: Sister Paris Hilton's!

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa. Từ Hollywood đến New York và mọi nơi ở giữa, hãy xem các ngôi sao yêu thích của bạn đang làm gì!

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

Các nhà điều tra đang xem xét liệu nhóm và nghi phạm có biết nhau trước vụ tấn công hay không

Thanh thiếu niên, Gia đình Florida Hội đồng quản trị trường học về Luật 'Không nói đồng tính': 'Buộc chúng tôi tự kiểm duyệt'

Thanh thiếu niên, Gia đình Florida Hội đồng quản trị trường học về Luật 'Không nói đồng tính': 'Buộc chúng tôi tự kiểm duyệt'

Vụ kiện, nêu tên một số học khu, lập luận rằng dự luật "Không nói đồng tính" được ban hành gần đây của Florida "có hiệu quả im lặng và xóa bỏ học sinh và gia đình LGBTQ +"

Đường băng hạ cánh

Đường băng hạ cánh

Cuối hè đầu thu là mùa hoài niệm. Những chiếc đèn đường chiếu ánh sáng của chúng qua những con đường đẫm mưa, và những chiếc lá dưới chân - màu đỏ cam tắt trong bóng chạng vạng - là lời nhắc nhở về những ngày đã qua.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Vào năm 2021, tôi khuyến khích bạn suy nghĩ lại mọi thứ bạn biết về khách hàng mà bạn phục vụ và những câu chuyện bạn kể cho họ. Lùi lại.

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Vào ngày sinh nhật thứ 9 của Felix The Cat, tôi nhớ về một trong những mất mát lớn nhất trong cuộc đời trưởng thành của tôi - Sophie của tôi vào năm 2013. Tôi đã viết bài luận này và chia sẻ nó trên nền tảng này một thời gian ngắn vào năm 2013.

Khi bạn không thể trở thành người mà Internet muốn bạn trở thành

Khi bạn không thể trở thành người mà Internet muốn bạn trở thành

Tôi ghét từ "tàu đắm". Mọi người cảm thấy thoải mái trong la bàn đạo đức của riêng mình, và khi làm như vậy, họ thấy mình vượt qua sự phán xét.

Language