2012-10-10 27 views
10

Tôi có một câu hỏi đơn giản: Khi nào tốt nhất để khử trùng đầu vào của người dùng? Và một trong những điều này được coi là phương pháp hay nhất:Vệ sinh đầu vào của người dùng trong laravel

  1. Vệ sinh dữ liệu trước khi ghi vào cơ sở dữ liệu.
  2. Lưu dữ liệu thô và vệ sinh trong chế độ xem.

Ví dụ sử dụng HTML::entities() và lưu kết quả vào cơ sở dữ liệu. Hoặc bằng cách sử dụng các phương pháp HTML trong các chế độ xem vì trong trường hợp này, Laravel theo mặc định sử dụng HTML::entities(). Hoặc có thể bằng cách sử dụng cả hai.

EDIT: Tôi đã tìm thấy ví dụ thú vị http://forums.laravel.com/viewtopic.php?id=1789. Có cách nào khác để giải quyết vấn đề này không?

+0

Removed câu trả lời vì nó didnt áp dụng đối với XSS. Không có cách nào khó khăn hoặc nhanh chóng tôi nghĩ ... lọc nội dung, liên kết cookie với địa chỉ IP. Mục nhập wiki có tải thông tin tốt http: //en.wikipedia.org/wiki/Cross-site_scripting –

+0

@DavidBarker, bạn đã sai cho tôi. Tất cả những gì tôi cần là ngăn chặn các thẻ và thực thi javascript khi hiển thị đầu vào của người dùng. – warmspringwinds

Trả lời

11

Tôi cho rằng bạn cần cả hai địa điểm nhưng vì các lý do khác nhau. Khi dữ liệu xuất hiện, bạn nên xác thực dữ liệu theo miền và từ chối các yêu cầu không tuân thủ. Ví dụ, không có điểm trong việc cho phép một thẻ (hoặc văn bản cho rằng vấn đề) nếu bạn mong đợi một số. Đối với một tham số represent.a năm, bạn thậm chí có thể muốn kiểm tra xem nó có nằm trong phạm vi nào đó không. Khử trùng bắt đầu bằng các trường văn bản miễn phí. Bạn vẫn có thể thực hiện xác thực đơn giản cho các ký tự không mong muốn như 0 byte. IMHO nó là tốt nhất để lưu trữ nguyên thông qua sql an toàn (tham số truy vấn) và sau đó mã hóa chính xác cho đầu ra. Có hai lý do. Đầu tiên là nếu chất khử trùng của bạn có lỗi, bạn sẽ làm gì với tất cả dữ liệu trong cơ sở dữ liệu của mình? Resanitizing có thể có những hậu quả không mong muốn. Thứ hai bạn muốn làm thoát theo ngữ cảnh, cho bất cứ sản lượng bạn đang sử dụng (JSON, HTML, HTML thuộc tính, vv)

1

Tùy thuộc vào đầu vào của người dùng. Nếu bạn thường sẽ xuất ra mã họ có thể cung cấp (ví dụ có thể đó là một trang web cung cấp đoạn mã), thì bạn sẽ khử trùng trên đầu ra. Nó phụ thuộc vào ngữ cảnh. Nếu bạn đang yêu cầu một tên người dùng, và họ đang nhập các thẻ HTML, việc xác thực của bạn nên được chọn lên và "không, đây không phải là mát mẻ, người đàn ông!"

Nếu nó giống như ví dụ tôi đã nói trước đó (đoạn mã), sau đó cho qua RAW (nhưng hãy đảm bảo rằng cơ sở dữ liệu của bạn không bị hỏng) và khử trùng trên đầu ra. Khi sử dụng PHP, bạn có thể sử dụng htmlentities($string).

9

Tôi có một bài viết đầy đủ về đầu vào lọc trong Laravel, bạn có thể tìm thấy nó hữu ích http://usman.it/xss-filter-laravel/, đây là Trích dẫn từ bài viết này:

Bạn có thể tự làm sạch XSS toàn cầu, nếu bạn không có thư viện để viết các phương pháp phổ biến bạn có thể cần thường xuyên thì tôi yêu cầu bạn tạo một thư viện mới Chung trong ứng dụng/thư viện. Đặt hai phương pháp này trong thư viện chung của bạn:

/* 
* Method to strip tags globally. 
*/ 
public static function global_xss_clean() 
{ 
    // Recursive cleaning for array [] inputs, not just strings. 
    $sanitized = static::array_strip_tags(Input::get()); 
    Input::merge($sanitized); 
} 

public static function array_strip_tags($array) 
{ 
    $result = array(); 

    foreach ($array as $key => $value) { 
     // Don't allow tags on key either, maybe useful for dynamic forms. 
     $key = strip_tags($key); 

     // If the value is an array, we will just recurse back into the 
     // function to keep stripping the tags out of the array, 
     // otherwise we will set the stripped value. 
     if (is_array($value)) { 
      $result[$key] = static::array_strip_tags($value); 
     } else { 
      // I am using strip_tags(), you may use htmlentities(), 
      // also I am doing trim() here, you may remove it, if you wish. 
      $result[$key] = trim(strip_tags($value)); 
     } 
    } 

    return $result; 
} 

Sau đó đặt mã này vào đầu lọc trước của bạn (trong application/routes.php):

//Our own method to defend XSS attacks globally. 
Common::global_xss_clean(); 
+0

Làm cách nào để ngăn chặn các nội dung như 'foo 'onload = alert (document.cookie)'? – 735Tesla

3

Tôi chỉ tìm thấy câu hỏi này. Một cách khác để làm điều đó là để kèm theo đầu ra động trong ngoặc ba như thế này {{{ $var }}} và lưỡi sẽ thoát khỏi chuỗi cho bạn. Bằng cách đó bạn có thể giữ các ký tự có thể nguy hiểm trong trường hợp chúng quan trọng ở một nơi khác trong mã và hiển thị chúng dưới dạng chuỗi thoát.

+0

Bạn không cần phải sử dụng 'echo'. –

+0

@HasibMahmud Khá chính xác, tôi sẽ sửa nó – 735Tesla

0

tôi đã thấy điều này vì tôi đã lo lắng về XSS trong laravel, vì vậy đây là các gói gvlatko

nó rất dễ dàng:

Để rõ ràng đầu vào = $ sạch = XSS :: sạch (Input: : get ('bình luận');

để sử dụng trong quan điểm = $ sạch = XSS :: sạch (Input :: tập tin ('hồ sơ'), TRUE);

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