2015-12-14 23 views
12

Tôi chỉ đang nghiên cứu, tại sao sử dụng chức năng eval() là xấu và tôi đã tìm thấy một lý do để dễ bị tấn công bằng mã tiêm (Đăng: Why is using the JavaScript eval function a bad idea?).Tại sao chúng ta nên biết Mã tiêm trong Javascript?

Nhưng câu hỏi của tôi là, chúng ta nhất thiết có cần phải lo lắng về việc tiêm mã trong javascript không? Bởi vì, nếu bất kỳ người dùng nào muốn chạy bất kỳ tập lệnh JS nào cho một trang web, anh ta có thể thực hiện điều đó bằng cách chạy trong bảng điều khiển.

Vì vậy, tôi chỉ tự hỏi, điều gì gây hại thêm nó có thể làm, nếu có ai thành công để tiêm mã của mình trong mã javascript của tôi?

EDIT
Dựa trên câu trả lời của Oleander dưới đây, tôi tìm thấy một cách để dễ bị tổn thương khi chúng tôi có thông tin liên lạc giữa trình duyệt và máy chủ thông qua AJAX gọi. Điều đó có ý nghĩa hoàn hảo. Nhưng tôi có thể có các chương trình Javascript chỉ chạy trong trình duyệt và không có bất kỳ liên lạc nào với chương trình phụ trợ, ví dụ như Máy tính hoặc Trò chơi đơn giản. Vì vậy, câu hỏi bổ sung của tôi ở đây, là có bất kỳ lý do khác mà có thể làm cho các chương trình này dễ bị tổn thương quá?

+1

Việc tiêm mã có hại khi chúng được tạo bởi người khác ngoài người dùng. Bạn có chắc người dùng của mình là người duy nhất kiểm soát đối số của 'eval' không? – Bergi

+0

Khi tôi nói về javascript, nó phải là người dùng, chỉ có thể sửa đổi các yếu tố đầu vào (trong biểu mẫu). Tôi không chắc chắn về bất kỳ cách nào khác.Bạn có ví dụ nào khác không? –

+0

@TareqMahmood Tôi đã đăng một ví dụ – Oleander

Trả lời

4

Sự cố bảo mật xảy ra khi tin tặc tiêm mã độc hại vào yêu cầu JSON do người dùng thực hiện, sau đó được đánh giá sử dụng eval.

Imagine mã sau được đưa ra chạy

$.get("/get.json", function(data){ 
    var obj = eval(data) // String to javascript object 
}); 

Nguồn trông như thế này

GET /get.json 
{ 
    some: "data" 
} 

Nhưng kẻ tấn công thay thế trên bằng cách sử dụng một man in the middle attack

function(){ 
    // send window.cookie to attacker 
}(); 

Kẻ tấn công hiện nay có quyền truy cập vào phiên người dùng.

+0

Cảm ơn. Tôi hiểu về nó ngay bây giờ. Nhưng suy nghĩ ban đầu của tôi là về một trò chơi giao diện dựa trên JS hoặc máy tính, mà không sử dụng bất kỳ thông tin liên lạc đến máy chủ. Bạn có nghĩ rằng có thể có thể gây ra rủi ro trong các chương trình đó? –

+0

@TareqMahmood, đây luôn là phương pháp hay nhất để thực hiện theo các phương pháp hay nhất. Nếu bạn thực hiện thói quen cắt góc hoặc không tìm hiểu về các tác động bảo mật có thể xảy ra, bạn sẽ tiếp tục các thực hành đó khi bạn tiến vào dự án kiểu máy chủ/máy khách. Hàm 'eval()' là để truy cập vào trình biên dịch của Javascript và được sử dụng sai trong nhiều tình huống khác nhau. Lưu ý, eval cũng có một hàm ý hiệu suất kém. –

+0

@TareqMahmood Tôi có thể sai, nhưng tôi khá chắc chắn điều này không liên quan gì tới "người đàn ông trong cuộc tấn công ở giữa". –

2

Nếu mã của bạn lấy một giá trị từ chuỗi truy vấn và sử dụng nó trong một eval, kẻ tấn công có thể lôi kéo nạn nhân của họ truy cập URL chứa chuỗi truy vấn tà ác.

Từ OWASP:

<script> 
function loadObj(){ 
var cc=eval('('+aMess+')'); 
document.getElementById('mess').textContent=cc.message; 
} 

if(window.location.hash.indexOf('message')==-1) 
    var aMess="({\"message\":\"Hello User!\"})"; 
else 
    var aMess=location.hash.substr(window.location.hash.indexOf('message=')+8); 
</script> 

Kẻ tấn công có thể gửi một email có chứa một liên kết hoặc chuyển hướng người dùng truy cập trang web độc hại của họ đến URL

http://example.com/page.html?message=<img onerror="alert(xss)"> 

Sau đó, bạn có một căn cứ XSS tấn công DOM.

Nếu trò chơi của bạn không có chương trình phụ trợ trên trang web có thông tin nhạy cảm khác trên trang đó, chẳng hạn như phiên người dùng, thì kẻ tấn công có thể lấy cắp cookie phiên hoặc lấy thông tin đăng nhập. Tất cả phụ thuộc vào những gì JavaScript có quyền truy cập. Nghĩa là, nó sẽ có quyền truy cập đầy đủ vào miền lưu trữ của nó vì Chính sách xuất xứ giống nhau sẽ hạn chế nó. Tuy nhiên, nếu bạn có các ứng dụng nhạy cảm khác ở đây thì chúng có thể bị xâm phạm. Nếu không, thì lúc tồi tệ nhất kẻ tấn công có thể lạm dụng sự tin tưởng mà người dùng có trong trang web của bạn bằng cách thay đổi nội dung hoặc theo dõi những gì người dùng thực hiện trên trang web của bạn.

+0

Làm cho tinh thần. Cảm ơn! –

+0

Nhưng điểm khác của tôi là biết về mối đe dọa có thể xảy ra nếu chúng tôi chỉ làm việc với đầu vào của người dùng. Chúng tôi có thể có thông tin nhạy cảm trong cookie. Nhưng điều gì sẽ xảy ra nếu chúng tôi không sử dụng eval cho thông số URL nhưng chúng tôi chỉ sử dụng cho đầu vào của người dùng. Ví dụ một máy tính mà người dùng nhập vào hai số và chúng tôi thêm/sub/mul/div giữa chúng bằng cách sử dụng hàm eval. –

+1

Đó là một trong những trường hợp 'eval()' sẽ được chấp nhận. Đó là khi nào, sau này, bạn cho phép chức năng liên kết cố định tới các phương trình cụ thể rằng đây sẽ là một vấn đề 'example.com? Calc = 4 + 4' (thành phần URL 4 + 4' được mã hóa tất nhiên). – SilverlightFox

Các vấn đề liên quan