프로그래머가 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.