Từ chối thực thi một tập lệnh JavaScript. Mã nguồn của tập lệnh được tìm thấy trong yêu cầu


81

Trong WebKit, tôi gặp lỗi sau trên JavaScript của mình:

Từ chối thực thi một tập lệnh JavaScript. Mã nguồn của tập lệnh được tìm thấy trong yêu cầu.

Mã dành cho trình quay JavaScript, xem ASCII Art .

Mã được sử dụng hoạt động tốt và vẫn hoạt động bình thường trong Camino và Firefox. Lỗi dường như chỉ xảy ra khi trang được lưu qua ĐĂNG và sau đó được truy xuất qua GET. Nó xảy ra trong cả Chrome / Mac và Safari / Mac.

Bất cứ ai biết điều này có nghĩa là gì, và làm thế nào để khắc phục điều này?


Hmm, có lẽ WebKit của tôi đã được cập nhật. Trang hoạt động trở lại. Cũng như tất cả các bản sửa đổi cũ của trang (xem nút Bản sửa đổi cũ ở cuối trang).
doekman 11/10/09

lỗi này xảy ra trong trình chỉnh sửa tryit của w3schools w3schools.com/js/tryit.asp?filename=tryjs_events tập lệnh được thực thi lần đầu tiên, nhưng nó bị chặn kể từ thời điểm bạn nhấp vào nút "chỉnh sửa và nhấp vào tôi".

1
Nếu bạn nhấn nút "chỉnh sửa và nhấp vào tôi", nội dung của vùng văn bản (với javascript) sẽ được gửi đến máy chủ thông qua một ĐĂNG. Chrome phát hiện javascript được đăng lên máy chủ và nó có thể độc hại. Việc chặn là biện pháp chống lại các cuộc tấn công XSS.
doekman

Đây là liên kết cho thấy cách đặt tiêu đề X-XSS-Protection: stackoverflow.com/questions/4635403/…
hh_s

Câu trả lời:


67

Đó là một biện pháp bảo mật để ngăn chặn các cuộc tấn công XSS (cross-site scripting) .

Điều này xảy ra khi một số mã JavaScript được gửi đến máy chủ thông qua một yêu cầu HTTP POST và mã đó sẽ quay trở lại thông qua phản hồi HTTP. Nếu Chrome phát hiện tình huống này, tập lệnh sẽ bị từ chối chạy và bạn nhận được thông báo lỗi Refused to execute a JavaScript script. Source code of script found within request.

Cũng xem bài đăng trên blog này về Bảo mật ở độ sâu: Tính năng bảo mật mới .


5
Sẽ rất tốt nếu được xem một số loại tài liệu tham khảo.
kangax

nhưng tuyến sinh dục này có gây ra vấn đề gì không? nghĩa là có ổn không nếu chúng ta bỏ qua thông báo này?
samach

@Greg Trình duyệt sử dụng thuật toán nào để "phát hiện tình huống"? Không thể chỉ tìm kiếm chuỗi "<script>" trong dữ liệu đúng không?
Pacerier

1
Tôi muốn xem một số thảo luận giữa câu trả lời này, câu trả lời từ Kendall bên dưới liên quan đến hàm ý của việc sử dụng bản sửa lỗi X-XSS-Protection: 0. Nó có mở trang web trước các cuộc tấn công XSS không? Nếu vậy có cách nào khác để giải quyết lỗi này không?
dansalmo

Tham khảo giải thích thêm về điều này, blog.chromium.org/2010/01/… Xem phần Bảo vệ XSS phản chiếu
h - n

131

Có thể tắt "tính năng" này bằng cách gửi tiêu đề HTTP không chuẩn X-XSS-Protectiontrên trang bị ảnh hưởng.

X-XSS-Protection: 0

2
Đảm bảo rằng trang gây ra lỗi này được gửi với tiêu đề này, không phải gửi trang.
Kendall Hopkins

@KendallHopkins .... Bạn có thể cho tôi biết làm cách nào để tôi có thể Sử dụng cái này thông qua Javascript / Java không?
SRy

+1 Điều này trả lời câu hỏi một cách triệt để không giống như câu trả lời được chấp nhận, tuy nhiên, cảnh báo nhưng không đưa ra bất kỳ giải pháp nào.
JohnnyQ

2
-1 Điều này có thể "khắc phục" sự cố trong Chrome, nhưng nó không giải quyết được vấn đề thực sự - trang web của bạn vẫn dễ bị tấn công tập lệnh trên nhiều trang web (trên thực tế dễ bị tấn công hơn) nếu bạn làm điều này. Giải pháp thực sự, như @Greg đã ám chỉ nhưng không nói rõ ràng, là không gửi lại HTML / JS trong phản hồi đã được gửi trong yêu cầu. Đọc các liên kết mà anh ấy cung cấp lẽ ra phải làm rõ điều đó.
sfarbota

@sfarbota Có rất nhiều trường hợp bảo vệ này không tốt. Ví dụ: nó phá vỡ nhiều hệ thống CMS, nơi bạn hoàn toàn có thể chấp nhận trả lại JS mà bạn đang chỉnh sửa. Nhưng theo quan điểm của bạn, tôi sẽ không khuyên bạn nên thêm phần này vào mọi trang trên một trang web và nó có thể chỉ cần thiết trong trường hợp nhà phát triển gặp lỗi này.
Kendall Hopkins

15

Câu trả lời ngắn gọn : làm mới trang sau khi thực hiện lần đầu bạn gửi javascript hoặc nhấn vào URL sẽ hiển thị trang bạn đang chỉnh sửa.

Câu trả lời dài : bởi vì văn bản bạn điền vào biểu mẫu bao gồm javascript và trình duyệt không nhất thiết phải biết rằng bạn là nguồn của javascript, sẽ an toàn hơn cho trình duyệt khi cho rằng bạn không phải là nguồn của JS này và không chạy nó.

Ví dụ : Giả sử tôi đã cung cấp cho bạn một liên kết email hoặc facebook của bạn với một số javascript trong đó. Và hãy tưởng tượng rằng javascript sẽ nhắn cho tất cả bạn bè của bạn liên kết thú vị của tôi. Vì vậy, trò chơi để lấy liên kết đó được gọi trở nên đơn giản, hãy tìm một nơi để gửi javascript sao cho nó sẽ được đưa vào trang.

Chrome và các trình duyệt WebKit khác cố gắng giảm thiểu rủi ro này bằng cách không thực thi bất kỳ javascript nào trong phản hồi, nếu nó có trong yêu cầu. Cuộc tấn công bất chính của tôi sẽ bị cản trở vì trình duyệt của bạn sẽ không bao giờ chạy JS đó.

Trong trường hợp của bạn, bạn đang gửi nó vào một trường biểu mẫu. Trường Post of the form sẽ gây ra kết xuất trang sẽ hiển thị Javascript khiến trình duyệt lo lắng. Tuy nhiên, nếu javascript của bạn thực sự được lưu, việc nhấn vào cùng một trang đó mà không gửi biểu mẫu sẽ cho phép nó thực thi.


1

Như những người khác đã nói, điều này xảy ra khi phản hồi HTTP chứa chuỗi JavaScript và / hoặc HTML cũng có trong yêu cầu. Điều này thường xảy ra do nhập JS hoặc HTML vào trường biểu mẫu, nhưng cũng có thể được kích hoạt theo những cách khác, chẳng hạn như tinh chỉnh thủ công các tham số của URL.

Vấn đề với điều này là ai đó có ý định xấu có thể đặt bất kỳ JS nào họ muốn làm giá trị, liên kết đến URL đó với giá trị JS độc hại và gây ra rắc rối cho người dùng của bạn.

Trong hầu hết mọi trường hợp, điều này có thể được khắc phục bằng cách mã hóa HTML phản hồi , mặc dù có những ngoại lệ. Ví dụ: điều này sẽ không an toàn cho nội dung bên trong <script>thẻ. Các trường hợp cụ thể khác có thể được xử lý theo cách khác - ví dụ: việc đưa đầu vào vào URL sẽ được mã hóa URL phục vụ tốt hơn.

Như Kendall Hopkins đã đề cập, có thể có một vài trường hợp bạn thực sự muốn JavaScript từ các đầu vào biểu mẫu được thực thi, chẳng hạn như tạo một ứng dụng như JSFiddle . Trong những trường hợp đó, tôi khuyên bạn ít nhất bạn nên xem qua đầu vào trong mã phụ trợ của mình trước khi viết lại một cách mù quáng. Sau đó, bạn có thể sử dụng phương pháp mà anh ấy đã đề cập để ngăn chặn XSS (ít nhất là trong Chrome), nhưng hãy lưu ý rằng nó đang mở bạn cho những kẻ tấn công.


0

Tôi đã sử dụng thủ thuật PHP hacky này ngay sau khi tôi cam kết với cơ sở dữ liệu, nhưng trước khi tập lệnh được hiển thị _GETtheo yêu cầu của tôi .:

if(!empty($_POST['contains_script'])) { 
    echo "<script>document.location='template.php';</script>";
}

Đây là giải pháp rẻ nhất cho tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.