Làm cách nào tôi có thể khiến các lập trình viên ngừng viết mã dễ bị tấn công SQL?


11

Đôi khi bạn bận rộn và giao nhiệm vụ nhỏ cho các lập trình viên cơ sở. Nhưng nếu bạn không chú ý đúng mức, bạn sẽ thấy mình có loại mã này trong sản xuất:

class DivtoggleController extends Zend_Controller_Action {

    public function closeAction() {
        /* ... code removed for brevity ... */

        $req = $this->getRequest();
        $formData = $req->getPost();

        $d = $formData['div'];
        $i = $formData['id'];

        $dm = new Model_DivtoggleManager();
        $rs = $dm->setDivToggleById($d, $i);

    }

}


class Model_DivtoggleManager extends Zend_Db_Table {

    public function setDivToggleById($div, $id) {
        $result = $this->getAdapter()->query(
           "update div_toggle set " . $div . "=1 where id=" . $id
        );
    }

}

Vì vậy, do tôi đã loại bỏ logic quản lý phiên / xác thực cho ngắn gọn, ai có thể cho tôi biết vấn đề nào có thể xảy ra với mẫu này?


Tại sao điều này không được lưu trữ trong một cookie đơn giản?
Darknight

1
@Darknight, bạn đang giả sử có một phiên để lưu trữ cookie. Có hay không không liên quan đến vấn đề bảo mật lớn hơn.
Roger Halliburton

Câu trả lời:


24

Bạn có thể dạy chúng. Mọi người làm điều này ngay từ đầu, ngay cả bạn. Nếu loại mã này đưa nó vào sản xuất, đó là lỗi của người cao cấp; không phải đàn em.

Biên tập:

Một trong những điều mà tôi đã làm là cá nhân tôi đã thực hiện để chủ động yêu cầu mọi người xem lại mã của tôi (bao gồm cả đàn em) trước khi phát hành. Mã được xem xét, những người trẻ tuổi coi đó là một kinh nghiệm học tập, mọi người mất đi nỗi sợ đánh giá mã là một hình phạt và họ bắt đầu làm điều tương tự.


2
+1 Phải đồng ý. Bạn không thể đổ lỗi cho một lập trình viên cơ sở (có lẽ là) bởi vì bạn đã thừa nhận một mức độ kiến ​​thức mà họ có thể không có. (Điều đó nói rằng, bạn muốn muốn suy nghĩ vấn đề đó đều nổi tiếng trong ngày và tuổi tác Sau đó, một lần nữa, tôi muốn. Thích nghĩ rằng tôi là tài năng và đẹp trai, vv) :-)
John Parker

Một tuyên bố đủ công bằng. Tôi đoán tôi nên hỏi một câu hỏi tiếp theo, hỏi tại sao ban quản lý lại khăng khăng đưa mã vào sản xuất mà không được các lập trình viên cao cấp chấp thuận. Tôi có mạo hiểm công việc của tôi về một vấn đề an ninh nhỏ?
Roger Halliburton

1
@Roger Halliburton: Vâng, nếu đó là vấn đề an ninh không bằng cách nào đó được khai thác, điều tồi tệ nhất có thể xảy ra là gì? Và tại sao chỉ ra các vấn đề bảo mật làm bạn mất việc? Có quản lý không muốn có xử lý này?
Thất vọngWithFormsDesigner

1
@Roger - nó chỉ là nhỏ cho đến khi bạn bị hack. :) Tôi nghĩ rằng việc đưa mã vào sản xuất mà không cần xem xét (bất kể cấp độ của nhà phát triển) là một thất bại. Thật không may, đó là một thực tế rất phổ biến ở rất nhiều công ty; và, ime, thường phải mất khoảng 4 đô la trước khi quản lý bắt đầu coi trọng những thứ như đánh giá mã.
John Kraft

1
@Roger: Tất cả các mã nên được xem xét, không chỉ mã được viết bởi các lập trình viên "đàn em". Ngay cả các lập trình viên cao cấp cũng mắc lỗi.
Dean Harding

20

Hack mã của họ trước mắt họ sau đó chỉ cho họ cách khắc phục. Hơn và hơn cho đến khi họ hiểu.


4
Gửi email cho họ mỗi sáng: "Nhân tiện, tôi đã đánh rơi cơ sở dữ liệu của bạn một lần nữa đêm qua thông qua một lỗ hổng SQL tiêm khác mà bạn để lại trong mã của mình. Tôi biết bạn muốn khôi phục sao lưu cơ sở dữ liệu như thế nào !: D"
Ant

2
@Ant: Hãy tử tế. Làm điều đó ngay sau khi sao lưu dự kiến, không lâu trước đó.
Donal Fellows

@Donal: thực hiện ngay sau khi sao lưu, sau đó báo cho họ biết bản sao lưu không thành công và để họ đổ mồ hôi trong phần còn lại của ngày trước khi khôi phục bản sao lưu qua đêm.
jwenting

8

Bạn có thể bắt buộc họ tham gia một lớp ngay khi họ gia nhập công ty của bạn, trước khi họ có quyền truy cập kiểm soát nguồn, giới thiệu cho họ về SQL, kịch bản chéo trang, giả mạo yêu cầu trang web chéo và các lỗ hổng phổ biến khác. Các ví dụ trực diện, phá mã xấu trước mặt họ, để họ phá mã xấu và trỏ chúng đến trang web OWASP để biết thêm thông tin sau khi họ "tốt nghiệp".

Ngoài ra, bạn có thể bắt buộc sử dụng thư viện tùy chỉnh xử lý việc này cho bạn, nhưng đó chỉ là giải pháp phụ vì họ chắc chắn sẽ chạy các truy vấn tùy chỉnh khi điều đó trở nên thuận tiện hơn.

Nếu bạn có tài nguyên, đảm bảo nhiều thành viên cao cấp hơn trong nhóm xác minh sự khác biệt của họ trước khi cam kết cũng có thể hữu ích.

Kiên thức là sức mạnh!


3
Làm sạch chúng trước khi chúng gia nhập công ty của bạn là tốt hơn. Nếu bạn đang thuê ai đó viết bất cứ điều gì sử dụng SQL, không đặt câu hỏi phỏng vấn về biên giới tiêm chích không đủ năng lực.
Wooble

Tôi thường đồng ý, nhưng một người thuê đàn em rất thông minh và đầy tham vọng thì rẻ hơn nhiều so với một "nhà phát triển PHP có N năm kinh nghiệm", điều đó không được đảm bảo sẽ tốt hơn nhiều. Các nhà phát triển cơ sở thông minh có thể chọn công cụ này thực sự nhanh chóng và là một tài sản.
yan

3

Giả sử rằng đó là sự không an toàn mà người khác đã đề cập, với tư cách là nhà phát triển ở mọi cấp độ, thật dễ dàng để quên rằng getPost () không bảo mật dữ liệu trước tiên.

Một cách xung quanh điều này là:

  1. Viết một lớp nhận tất cả dữ liệu POST / GET và viết nó như là một lớp Singleton gọi là 'insecure_data'. Sau đó xóa mảng POST / GET.
  2. Các nhà phát triển hơn phải truy xuất dữ liệu POST / GET từ mảng 'insecure_data', chứ không phải mảng POST / GET.

Bất kỳ nhà phát triển nào lấy một cái gì đó từ một mảng gọi là 'insecure_data' và không bận tâm để bảo mật nó là không biết gì hoặc lười biếng. Nếu đó là cái trước, hãy cung cấp đào tạo, sau đó nó phải là cái sau - và sau đó bạn có vấn đề về kỷ luật, không phải là vấn đề lập trình.


Ồ, điều đó là không cần thiết và vẫn không giải quyết được vấn đề. Đây không phải là vấn đề để xóa dữ liệu đầu vào chỉ để giải trí, mà là xóa dữ liệu mà bạn đang đưa vào cơ sở dữ liệu và về mặt lý thuyết dữ liệu có thể đến từ bất kỳ đâu, từ biểu mẫu web hoặc email hoặc tài liệu XML ai đó tải lên. Trong tất cả các trường hợp này, bạn cần phải xóa khi nó đi đến cơ sở dữ liệu.
Roger Halliburton

@RogerHalliburton Tất nhiên nó không giải quyết được mọi thứ, nhưng đó là một khái niệm (một kiểu mẫu thiết kế, nếu bạn muốn) chứ không phải là một biện pháp bảo mật hoàn chỉnh để làm cho dữ liệu không an toàn trông không an toàn.
Dan thổi

Ah tôi thấy. Nhưng bạn chỉ đang chiến đấu với bản chất con người, nếu bạn nói với ai đó "Đối tượng này không an toàn trừ khi nó được gắn cờ là an toàn" và họ cố gắng sử dụng nó cho mục đích nào đó, hầu hết thời gian họ sẽ gắn cờ là an toàn mà không thực sự kiểm tra. Vâng, tận hưởng sự tăng cường danh tiếng.
Roger Halliburton

Từ quan điểm của một nhà phát triển cơ sở, chỉ cần nhìn thấy $ insecure_data đã phất cờ theo cách mà chỉ nhìn thấy $ postdata (hoặc bất cứ điều gì) thì không. Ý tưởng xuất phát từ "Làm sai mã nhìn sai" của Joel Spolsky . Nếu bản chất con người của các nhà phát triển của bạn là bỏ qua lá cờ đỏ đó, thì bạn cần phải cung cấp nhiều khóa đào tạo hoặc nhận một số nhà phát triển mới.
Dan thổi

Tôi không giữ Spolsky trên bệ. Đây là những nhà phát triển dễ dàng bỏ qua việc lập bảng không nhất quán, họ sẽ không nghĩ hai lần về việc sử dụng thứ gì đó có tên là "không an toàn".
Roger Halliburton

1

Một trong những hướng dẫn tốt nhất mà tôi đã đọc về bảo mật web là hướng dẫn bảo mật Ruby on Rails này . Mặc dù đó là Ruby on Rails, rất nhiều khái niệm áp dụng cho bất kỳ sự phát triển web nào. Tôi sẽ khuyến khích bất cứ ai mới để đọc hướng dẫn đó.


2
Mọi người đều biết Ruby không an toàn.
Roger Halliburton

5
@Roger: Mười Mọi người đều biết, tất cả những điều có thể đúng hoặc không đúng. Tôi ủng hộ cách tiếp cận dựa trên thực tế để lập trình, không phải là cách tiếp cận dựa trên tin đồn.
Donal Fellows

0

Mã bạn đã liên kết ở trên dễ bị tấn công SQL SQL, bởi vì các đầu vào HTTP bạn đang sử dụng trong truy vấn chưa được làm sạch bằng mysql_real_escape_stringhoặc bất kỳ phương tiện nào khác.


1
oh, tôi nghĩ rằng chúng tôi đã trả lời câu hỏi này giống như một câu hỏi kiểm tra:]
Ryan

Downvote là một chút khập khiễng, vì từ ngữ của câu hỏi đã được thay đổi bài cũ: P
Ryan

0

Về câu hỏi của bạn (có lẽ là ghi đè) "làm thế nào tôi có thể khiến các lập trình viên ngừng làm việc này", tôi nói rằng hãy tư vấn cho họ một cách thường xuyên, giải thích cẩn thận vấn đề đang được đề cập (và dự phòng tiềm năng, v.v.) và nhấn mạnh tầm quan trọng của các lỗ hổng mã (cả về SQL và kịch bản chéo trang, v.v.) có lẽ là giải pháp hợp lý nhất.

Nếu họ cứ làm phiền bất chấp tất cả những điều trên (bạn có thể muốn để mắt đến những cam kết của họ, v.v. thay vì tìm hiểu "trực tiếp"), thì vấn đề là bạn thất bại với tư cách là người cố vấn, hoặc đó là có lẽ họ cần tìm một cái gì đó phù hợp hơn để kiếm sống.

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.