프로그래머가 SQL 주입에 취약한 코드 작성을 중지하도록하려면 어떻게해야합니까?


11

때로는 바빠서 소규모 작업을 주니어 프로그래머에게 위임하기도합니다. 그러나 충분히주의를 기울이지 않으면 프로덕션에서 이러한 종류의 코드를 발견하게됩니다.

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
        );
    }

}

간결성을 위해 인증 / 세션 관리 로직을 제거했다면 누가이 샘플에 어떤 문제가 있는지 알려줄 수 있습니까?


이것이 간단한 쿠키에 저장되지 않는 이유는 무엇입니까?
— Darknight

1
@Darknight, 쿠키를 저장하는 세션이 있다고 가정합니다. 더 큰 보안 문제와 관련이 있는지 여부
— Roger Halliburton

답변:


24

당신은 그들을 가르 칠 수 있습니다. 모든 사람은 처음에, 심지어 당신도 이것을합니다. 이러한 유형의 코드가 프로덕션 환경에 들어가면 이는 선임 직원의 잘못입니다. 주니어가 아닙니다.

편집하다:

내가 한 일 중 하나는 개인적으로 사람들에게 릴리스 전에 내 코드 (주니어 포함)를 검토하도록 요청하는 것입니다. 코드는 검토되고, 주니어 사람들은 코드를 학습 경험으로보고, 사람들은 코드 검토에 대한 두려움을 처벌로 잃어 버리고 같은 일을 시작합니다.


2
+1 동의해야합니다. 그들이 가지고 있지 않은 지식 수준을 가정했기 때문에 (아마도) 후배 프로그래머를 비난 할 수 없습니다. (그게 당신이 거라고 말했다 좋아하는 등의 문제가 아니라이 시대에 잘 알려져있다 생각 그럼 다시, 나는 것입니다. 좋아하는 나는 등, 찾고 재능 있고 좋았다고 생각하는) :-)
— 존 파커

충분히 공정한 진술. 경영진이 왜 수석 프로그래머가 승인하지 않은 프로덕션으로 코드를 시작해야하는지 묻는 후속 질문을해야한다고 생각합니다. 사소한 보안 문제로 인해 업무에 위험이 있습니까?
— Roger Halliburton

1
@Roger Halliburton : 글쎄, 그 보안 문제 가 어떻게 든 악용된다면, 일어날 수있는 최악의 상황은 무엇입니까? 왜 보안 문제를 지적하면 작업 비용이 발생합니까? 경영진은 이것을 다루고 싶지 않습니까?
— FrustratedWithFormsDesigner

1
@ 로거-해킹 당할 때까지는 미미합니다. :) 나는 리뷰없이 (개발자 수준에 상관없이) 프로덕션에 코드를 넣는 것이 실패라고 생각합니다. 불행히도 많은 회사에서 매우 일반적인 관행입니다. 즉, 경영진이 코드 검토와 같은 것을 중요하게 생각하기까지는 일반적으로 큰 비용이 소요됩니다.
— 존 크래프트

1
@Roger : "주니어"프로그래머가 작성한 코드뿐만 아니라 모든 코드를 검토해야합니다. 선임 프로그래머조차도 실수를 저지 릅니다.
— Dean Harding

20

눈 앞에서 코드를 해킹 한 다음 수정 방법을 보여줍니다. 그들이 이해할 때까지 계속해서.


4
매일 아침 이메일로 보내십시오. "어쨌든 코드에 남겨둔 또 다른 SQL 주입 취약점을 통해 어젯밤에 데이터베이스를 다시 삭제했습니다. 데이터베이스 백업을 복원하는 것이 얼마나 좋은지 알고 있습니다! : D"
— Ant

2
@Ant : 멋져요. 곧을 수행 한 후 예약 된 백업이 아니라 직전.
— Donal Fellows

@Donal : 백업 직후에 수행 한 다음 백업에 실패했음을 알리고 하루 종일 백업을 복구하기 전에 하루 종일 땀을 흘리도록합니다.
— jwenting

8

소스 제어 액세스 권한을 갖기 전에 회사에 입사하자마자 SQL 인젝션, 사이트 간 스크립팅, 사이트 간 요청 위조 및 기타 일반적인 취약점을 소개합니다. 예를 직접 대면하고, 잘못된 코드를 깨뜨리고, 잘못된 코드를 깨뜨리고, "졸업생"이되면 OWASP 사이트를 통해 더 많은 정보를 얻으십시오.

이를 처리하는 커스텀 라이브러리의 사용을 추가로 지시 할 수 있지만, 이것이 더 편리 해지면 커스텀 쿼리를 실행할 것이기 때문에 보조 솔루션 일뿐입니다.

당신이 자원을 가지고 있다면, 커밋하기 전에 팀의 더 많은 선임 멤버들이 diff를 확인하도록하는 것도 유용 할 수 있습니다.

아는 것이 힘이다!


3
그들이 당신의 회사에 합류하기 전에 그들을 제거하는 것이 좋습니다. 무능력에 대한 주입 경계에 대한 인터뷰 질문을하지 않고 SQL을 사용하는 것을 작성하도록 누군가를 고용하는 경우.
— Wooble

나는 일반적으로 동의하지만, 매우 영리하고 야심 찬 주니어 고용은 "N 년의 경험을 가진 PHP 개발자"보다 훨씬 저렴합니다. 똑똑한 주니어 개발자는이 물건을 정말 빨리 집어 들고 아주 자산이 될 수 있습니다.
— yan

3

다른 사람이 어떤 수준의 개발자라고 언급 한 것이 안전하지 않다고 가정하면 getPost ()가 데이터를 먼저 보호하지 않는다는 것을 쉽게 잊을 수 있습니다.

이 문제를 해결하는 한 가지 방법은 다음과 같습니다.

  1. 모든 POST / GET 데이터를 가져 와서 'insecure_data'라는 싱글 톤 클래스에 그대로 쓰는 클래스를 작성하십시오. 그런 다음 POST / GET 배열을 지우십시오.
  2. 개발자는 POST / GET 배열이 아닌 'insecure_data'배열에서 POST / GET 데이터를 검색해야합니다.

'insecure_data'라는 배열에서 무언가를 검색하고 보안을 신경 쓰지 않는 개발자는 무지하거나 게으른 것입니다. 전자의 경우 교육을 제공 한 후 교육을 제공해야합니다. 그 후의 교육은 프로그래밍 문제가 아닌 징계 문제가 있습니다.


와우, 그것은 불필요하게 복잡하고 여전히 문제를 해결하지 못합니다. 단순히 재미를 위해 입력을 문지르는 것이 아니라 데이터베이스에 넣는 데이터를 문지르는 것이 문제이며, 이론적으로는 웹 양식, 전자 메일 또는 XML 문서에서 데이터를 가져올 수 있습니다. 누군가가 업로드합니다. 이 모든 경우에 데이터베이스로 이동할 때 제거해야합니다.
— Roger Halliburton

@RogerHalliburton 물론 모든 것을 해결할 수는 없지만 안전하지 않은 데이터 를 안전하지 않은 것으로 보이기 위해 완전히 고안된 보안 수단이 아닌 개념 (일종의 디자인 패턴) 입니다.
— Dan Blows

아, 알겠습니다 그러나 누군가에게 "이 개체는 안전한 것으로 표시되어 있지 않으면 안전하지 않다"고 말하면서 실제로 확인하지 않고 안전한 것으로 표시 할 것입니다. 평판 향상을 즐기십시오.
— Roger Halliburton

주니어 개발자의 관점에서 $ insecure_data를 보는 것만으로 $ postdata (또는 무엇이든)를 보지 않는 방식으로 플래그가 발생합니다. 이 아이디어는 Joel Spolsky의 "잘못된 코드를 잘못 보임 " 에서 비롯됩니다 . 개발자의 인간적 특성이 적기를 무시하려는 경우 많은 교육을 제공하거나 새로운 개발자를 확보해야합니다.
— Dan Blows

나는 Spolsky를 받침대에 두지 않습니다. 일관성이없는 탭을 쉽게 무시하는 개발자는 "안전하지 않은"이라는 것을 사용하는 것에 대해 두 번 생각하지 않을 것입니다.
— Roger Halliburton

1

웹 보안에 관해 읽은 최고의 안내서 중 하나는이 Ruby on Rails 보안 안내서입니다. Ruby on Rails이지만 많은 개념이 모든 웹 개발에 적용됩니다. 나는 새로운 사람이 그 가이드를 읽을 것을 권장합니다.


2
누구나 Ruby가 안전하지 않다는 것을 알고 있습니다.
— Roger Halliburton

5
@ 로거 :“모두 알고있다”는 사실 또는 그렇지 않은 모든 종류의 것들을“모두 알고있다”. 나는 정보에 기반한 것이 아니라 프로그래밍에 대한 현실에 기반한 접근법을 옹호합니다.
— Donal Fellows

0

쿼리에 사용중인 HTTP 입력이 정리되지 않았 mysql_real_escape_string거나 다른 방법 이 없기 때문에 위에서 연결 한 코드는 SQL 주입 공격에 취약합니다 .


1
오, 나는 우리가 시험 문제처럼 이것에 대한 답변을하고 있다고 생각했다 :]
— Ryan

질문의 문구가 포스트 이후에 변경 되었기 때문에 다운 보트는 다소 절름발이입니다 .P
— Ryan

0

귀하의 (아마도 프로그래머 가이 작업을 중단하도록 할 수있는 방법) 질문에 관해서는 정기적으로 멘토링하고 문제의 문제 (및 잠재적 인 낙진 등)를주의 깊게 설명하고 강조합니다. SQL 취약점 및 사이트 간 스크립팅 등의 측면에서 코드 취약점의 중요성은 아마도 가장 합리적인 솔루션 일 것입니다.

위의 모든 사항 에도 불구하고 계속 엉망이된다면 ( "라이브"를 찾는 대신 커밋 등을 주시하고 싶을 수도 있습니다), 문제는 당신이 멘토로서 실패하고 있다는 것입니다. 그들은 아마도 생계를 위해 더 적합한 것을 찾아야 할 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.