전체 끝은 간단한 4 글자입니다. 이전에 아무도 말해주지 않았던 섹스에 관한 재미있는 사실들. PHP에서 유형 변환 방지

안녕하세요. 제 이름은 사샤 바라닉입니다. Mail.Ru 그룹에서 저는 15명의 직원으로 구성된 웹 개발 부서를 이끌고 있습니다. 우리는 수천만 명의 사용자를 위한 웹사이트를 만드는 방법을 배웠으며 매일 수백만 명의 사용자를 쉽게 처리할 수 있습니다. 나 자신도 약 20년 동안 웹 개발을 해왔고, 지난 15년 동안 주로 PHP로 작업 프로그래밍을 해왔습니다. 이 기간 동안 언어의 기능과 개발 접근 방식이 크게 바뀌었지만 주요 취약점을 이해하고 이를 방지하는 능력은 모든 개발자의 핵심 기술로 남아 있습니다.

인터넷에서 많은 안전 관련 기사와 지침을 찾을 수 있습니다. 이 책은 꽤 자세하면서도 간결하고 이해하기 쉬운 책이라고 생각했습니다. 이 정보가 귀하가 새로운 것을 배우고 귀하의 사이트를 더욱 안정적이고 안전하게 만드는 데 도움이 되기를 바랍니다.

P.S. 책이 길어서 여러 편의 글로 번역이 게재될 예정입니다. 그럼 시작해 볼까요...

PHP 보안에 관한 또 다른 책이 있나요? PHP 보안에 관한 책을 시작하는 방법에는 여러 가지가 있습니다. 불행하게도 나는 그 중 하나도 읽지 못했기 때문에 글을 쓰면서 그 점을 알아내야 할 것입니다. 아마도 가장 기본적인 것부터 시작하여 모든 것이 잘되기를 바랍니다.

X 회사가 온라인으로 출시한 추상적인 웹 애플리케이션을 고려하면, 해킹될 경우 심각한 피해를 입힐 수 있는 여러 구성 요소가 포함되어 있다고 가정할 수 있습니다. 예를 들어 어느 것입니까?

  • 사용자에게 해로움: 이메일, 비밀번호, 개인 데이터, 은행 카드 정보, 비즈니스 비밀, 연락처 목록, 거래 내역 및 철저하게 보호되는 비밀(예: 개 이름을 Sparkle로 명명하는 사람)에 대한 액세스 권한을 얻습니다. 이 데이터가 유출되면 사용자(개인 및 기업)에게 피해가 발생합니다. 이러한 데이터를 오용하는 웹 애플리케이션과 사용자 신뢰를 이용하는 호스트도 해를 끼칠 수 있습니다.
  • X 회사 자체에 대한 피해: 사용자의 피해로 인해 평판이 악화되고 보상이 지불되어야 하며 중요한 비즈니스 정보가 손실되고 추가 비용이 발생합니다. 인프라, 보안 개선, 결과 청산, ​​법적 비용, 막대한 이익 최고경영자 등을 해임했다.
  • 이 두 가지 범주에는 웹 애플리케이션 보안이 방지해야 하는 대부분의 문제가 포함되어 있으므로 이에 중점을 둘 것입니다. 심각한 보안 위반을 경험한 모든 기업은 보도 자료와 웹 사이트에 얼마나 민감한지 신속하게 글을 게시합니다. 그러므로 실제로 이 문제에 직면하기 전에 이 문제의 중요성을 온 마음으로 느껴보시길 권합니다.

    불행하게도 보안 문제는 사후에 해결되는 경우가 많습니다. 가장 중요한 것은 허용 가능한 예산과 시간 내에 사용자의 요구를 충족하는 작동하는 애플리케이션을 만드는 것이라고 생각됩니다. 이해할 수 있는 우선 순위 집합이지만 보안을 영원히 무시할 수는 없습니다. 변경 비용이 아직 작을 때 개발 중에 특정 솔루션을 구현하면서 이를 지속적으로 염두에 두는 것이 훨씬 좋습니다.

    보안의 두 번째 특성은 주로 프로그래밍 문화의 결과입니다. 어떤 프로그래머는 취약점을 생각하면 식은땀을 흘리는 반면, 다른 프로그래머는 그것이 전혀 취약점이 아니라는 것을 증명할 때까지 취약점의 존재에 대해 이의를 제기할 수도 있습니다. 이 두 가지 극단 사이에는 아직 문제가 발생하지 않았기 때문에 단순히 어깨를 으쓱하는 프로그래머가 많이 있습니다. 그들이 이 이상한 세계를 이해하는 것은 어렵습니다.

    웹 애플리케이션 보안은 애플리케이션 서비스를 신뢰하는 사용자를 보호해야 하므로 다음 질문에 대한 답을 알아야 합니다.

  • 누가 우리를 공격하고 싶나요?
  • 그들은 어떻게 우리를 공격할 수 있나요?
  • 어떻게 막을 수 있나요?
  • 누가 우리를 공격하고 싶나요? 첫 번째 질문에 대한 답은 매우 간단합니다. 모든 것과 모든 것입니다. 그렇습니다. 온 우주가 당신에게 교훈을 가르치고 싶어합니다. Kali Linux를 실행하는 오버클럭된 컴퓨터를 가진 사람이 있습니까? 그는 아마도 이미 당신을 공격했을 것입니다. 사람의 바퀴에 말을 걸기를 좋아하는 수상한 남자? 아마도 그는 이미 당신을 공격할 사람을 고용했을 것입니다. 매시간 데이터를 제공하는 신뢰할 수 있는 REST API가 있습니까? 감염된 데이터를 제공하기 위해 한 달 전에 해킹되었을 수 있습니다. 나도 당신을 공격할 수 있어요! 그러니 이 책을 맹목적으로 믿을 필요는 없습니다. 내가 거짓말을 한다고 생각해보세요. 그리고 나를 밝혀주고 나의 해로운 조언을 폭로할 프로그래머를 찾으세요. 반면에 그는 당신을 해킹할 수도 있습니다...

    이 편집증의 요점은 웹 애플리케이션("사용자", "해커", "데이터베이스", "신뢰할 수 없는 입력", "관리자", "REST API")과 상호 작용하는 모든 것을 정신적으로 더 쉽게 분류하는 것입니다. 그런 다음 각 카테고리에 신뢰 지수를 할당합니다. 분명히 "해커"는 신뢰할 수 없지만 "데이터베이스"는 어떻습니까? "신뢰할 수 없는 입력"이라는 이름이 붙은 데는 이유가 있습니다. 하지만 동료가 신뢰할 수 있는 Atom 피드에서 블로그 게시물을 필터링하시겠습니까?

    웹 애플리케이션 해킹에 대해 진지하게 생각하는 사람들은 이러한 사고 방식을 활용하는 방법을 배우고 보안이 취약한 취약한 데이터 소스보다는 신뢰할 수 있는 데이터 소스를 공격하는 경우가 많습니다. 이는 무작위 결정이 아닙니다. 실제 생활에서는 신뢰 지수가 높은 주체일수록 덜 의심스럽습니다. 제가 애플리케이션을 분석할 때 가장 먼저 주목하는 것은 바로 이러한 데이터 소스입니다.

    "데이터베이스"로 돌아가겠습니다. 해커가 데이터베이스에 액세스할 수 있다고 가정하면(그리고 우리 편집증 환자는 항상 이것을 가정합니다) 데이터베이스는 결코 신뢰할 수 없습니다. 대부분의 애플리케이션은 아무런 질문 없이 데이터베이스를 신뢰합니다. 외부에서 보면 웹 애플리케이션은 하나의 전체처럼 보이지만 내부에는 데이터를 교환하는 개별 구성 요소의 시스템이 있습니다. 이러한 모든 구성 요소를 신뢰할 수 있다고 생각하면 그 중 하나가 해킹당하면 다른 모든 구성 요소도 빠르게 손상될 것입니다. 이런 치명적인 보안 문제는 “데이터베이스가 해킹당해도 손해다”는 말로 해결될 수 없다. 그렇게 말할 수는 있지만 처음에 기반을 신뢰하지 않고 그에 따라 행동한다면 이렇게 해야 한다는 것은 전혀 사실이 아닙니다!

    그들은 어떻게 우리를 공격할 수 있나요? 두 번째 질문에 대한 답변은 상당히 광범위한 목록입니다. 웹 애플리케이션의 각 구성 요소나 계층이 데이터를 수신하는 모든 곳에서 공격을 받을 수 있습니다. 기본적으로 웹 애플리케이션은 단순히 데이터를 처리하고 한 곳에서 다른 곳으로 이동합니다. 사용자 요청, 데이터베이스, API, 블로그 피드, 양식, 쿠키, 리포지토리, PHP 환경 변수, 구성 파일, 추가 구성 파일, 심지어 실행하는 PHP 파일까지 모두 잠재적으로 데이터에 감염되어 보안을 침해하고 손상을 일으킬 수 있습니다. 기본적으로 요청에 사용된 PHP 코드에 악성 데이터가 명시적으로 존재하지 않는 경우 해당 데이터는 "페이로드"로 도착할 가능성이 높습니다. 이는 a) 귀하가 PHP 소스 코드를 작성했고, b) 적절한 동료 평가를 받았으며, c) 범죄 조직으로부터 돈을 받지 않았다고 가정합니다.

    데이터가 완전히 안전하고 사용하기에 적합한지 확인하지 않고 데이터 원본을 사용하면 잠재적으로 공격에 노출될 수 있습니다. 또한 수신한 데이터가 전송 중인 데이터와 일치하는지 확인해야 합니다. 데이터가 출력하기에 완전히 안전하지 않은 경우에도 심각한 문제가 발생합니다. 이 모든 것은 PHP "입력 유효성 검사;"에 대한 규칙으로 표현될 수 있습니다. 출력을 탈출하세요."

    이는 우리가 어떻게든 통제해야 하는 명백한 데이터 소스입니다. 소스에는 클라이언트측 저장소도 포함될 수 있습니다. 예를 들어, 대부분의 애플리케이션은 쿠키에 저장될 수 있는 고유한 세션 ID를 할당하여 사용자를 인식합니다. 공격자가 쿠키에서 값을 얻으면 다른 사용자로 가장할 수 있습니다. 당사는 사용자 데이터 가로채기 또는 변조와 관련된 일부 위험을 완화할 수 있지만 사용자 컴퓨터의 물리적 보안을 보장할 수는 없습니다. 사용자가 "password" 다음으로 "123456"을 가장 멍청한 비밀번호로 간주할 것이라고 보장할 수도 없습니다. 오늘날 쿠키가 사용자 측의 유일한 저장 유형이 아니라는 사실이 추가적인 특징을 제공합니다.

    종종 간과되는 또 다른 위험은 소스 코드의 무결성입니다. PHP에서는 느슨하게 결합된 수많은 라이브러리, 프레임워크용 모듈 및 패키지를 기반으로 하는 애플리케이션 개발이 점점 더 대중화되고 있습니다. 이들 중 다수는 Github와 같은 공개 저장소에서 다운로드되며 Composer 및 웹 컴패니언 Packagist.org와 같은 패키지 설치 프로그램을 사용하여 설치됩니다. 따라서 소스 코드의 보안은 이러한 모든 타사 서비스 및 구성 요소의 보안에 전적으로 의존합니다. Github이 손상되면 악성 첨가제가 포함된 코드를 배포하는 데 사용될 가능성이 높습니다. Packagist.org인 경우 공격자는 패키지 요청을 자신의 악성 패키지로 리디렉션할 수 있습니다.

    현재 Composer와 Packagist.org에는 종속성 감지 및 패키지 배포에 알려진 취약점이 있으므로 항상 프로덕션 환경의 모든 것을 다시 확인하고 Packagist.org에서 모든 패키지의 소스를 확인하세요.

    어떻게 막을 수 있나요? 웹 애플리케이션의 보안을 뚫는 것은 엄청나게 간단한 작업부터 극도로 시간이 많이 걸리는 작업까지 다양합니다. 모든 웹 애플리케이션에는 어딘가에 취약점이 있다고 가정하는 것이 타당합니다. 그 이유는 간단합니다. 모든 응용 프로그램은 사람이 만들고 사람은 실수를 하기 때문입니다. 따라서 완벽한 보안은 헛된 꿈입니다. 모든 애플리케이션에는 취약점이 있을 수 있으며, 프로그래머의 임무는 위험을 최소화하는 것입니다.

    웹 애플리케이션에 대한 공격으로 인한 피해 가능성을 줄이려면 신중하게 생각해야 합니다. 이야기가 진행되면서 가능한 공격 방법에 대해 이야기하겠습니다. 그 중 일부는 명백하지만 일부는 그렇지 않습니다. 그러나 어떤 경우에도 문제를 해결하려면 몇 가지 기본 보안 원칙을 고려해야 합니다.

    기본 보안 원칙 보안 조치를 개발할 때 다음 고려 사항을 사용하여 그 효과를 평가할 수 있습니다. 나는 이미 위에서 일부를 인용했습니다.
  • 누구도, 아무것도 믿지 마세요.
  • 항상 최악의 시나리오를 가정하십시오.
  • 다단계 보호(심층 방어)를 적용합니다.
  • KISS(Keep It Simple Stupid) 원칙을 고수하세요.
  • '최소 권한' 원칙을 준수하세요.
  • 공격자는 모호한 냄새를 맡습니다.
  • 문서(RTFM)를 읽으되 절대 신뢰하지 마십시오.
  • 테스트되지 않은 경우 작동하지 않습니다.
  • 그건 언제나 네 잘못이야!
  • 모든 사항을 간략하게 살펴보겠습니다.1. 누구도, 아무것도 믿지 마세요 위에서 언급한 것처럼, 올바른 입장은 웹 애플리케이션과 상호 작용하는 모든 것과 모든 사람이 해킹을 원한다고 가정하는 것입니다. 여기에는 요청을 처리하는 데 필요한 기타 애플리케이션 구성 요소 또는 계층이 포함됩니다. 무엇이든, 모든 것. 예외는 없습니다.2. 항상 최악의 시나리오를 가정하십시오. 많은 보안 시스템에는 한 가지 공통점이 있습니다. 즉, 아무리 잘 만들어졌더라도 각각은 침해될 수 있다는 것입니다. 이것을 고려하면 두 번째 요점의 장점을 빨리 이해할 수 있습니다. 최악의 시나리오에 집중하면 공격의 범위와 심각도를 평가하는 데 도움이 됩니다. 그리고 만약 그런 일이 발생한다면 추가적인 보안 조치와 아키텍처 변경을 통해 불쾌한 결과를 줄일 수 있습니다. 아마도 귀하가 사용하고 있는 기존 솔루션이 이미 더 나은 솔루션으로 대체되었을 수도 있습니다.3. 다단계 보호 사용(심층 방어) 다단계 보호는 군사 과학에서 차용한 것입니다. 왜냐하면 사람들은 적의 총알과 칼날로부터 중요한 장기를 덮는 수많은 벽, 모래주머니, 장비, 방탄복 및 플라스크가 옳다는 것을 오랫동안 깨달았기 때문입니다. 안전에 접근합니다. 위 중 어느 것이 보호되지 않을지 결코 알 수 없으며, 단순한 야전 요새나 전투 대형 이상에 의존할 수 있도록 여러 보호 계층을 보장해야 합니다. 물론, 이는 단지 단일 실패에 관한 것이 아닙니다. 공격자가 거대한 중세 성벽 위로 사다리를 타고 올라가다가 그 뒤에 화살이 쏟아지는 또 다른 벽이 있다는 것을 발견했다고 상상해 보십시오. 해커도 같은 느낌을 받을 것입니다.4. Keep It Simple Stupid(KISS) 최고의 방어는 항상 단순합니다. 개발, 구현, 이해, 사용 및 테스트가 쉽습니다. 단순성은 오류를 줄이고 올바른 애플리케이션 성능을 장려하며 가장 복잡하고 적대적인 환경에서도 구현을 용이하게 합니다.5. "최소 권한" 원칙을 준수합니다. 정보 교환(사용자, 프로세스, 프로그램)의 각 참가자는 해당 기능을 수행하는 데 필요한 액세스 권한만 가져야 합니다.6. Attackers Smell Obscurity Obscurity에 의한 보안은 방어 A를 사용하고 그것이 무엇인지, 어떻게 작동하는지, 존재 여부를 아무에게도 말하지 않으면 공격자가 혼란스러워지기 때문에 마술처럼 도움이 될 것이라는 가정에 기반합니다. 실제로 이는 약간의 이점만 제공합니다. 숙련된 공격자가 귀하가 취한 조치를 알아낼 수 있는 경우가 많으므로 명시적인 방어 수단을 사용해야 합니다. 불분명한 보호가 실제 보호의 필요성을 무효화한다고 지나치게 확신하는 사람들은 환상을 없애기 위해 구체적으로 처벌되어야 합니다.7. 문서(RTFM)를 읽으세요. 하지만 절대 믿지 마세요. PHP 매뉴얼은 성경입니다. 물론 플라잉 스파게티 몬스터가 쓴 것이 아니기 때문에 기술적으로는 아직 발견되지 않았거나 수정되지 않은 일부 진실, 누락, 오해 또는 오류가 포함될 수 있습니다. 스택 오버플로도 마찬가지입니다.

    전문적인 보안 지식 소스(PHP 중심 및 기타)는 일반적으로 더 자세한 지식을 제공합니다. PHP 보안에 관한 성경에 가장 가까운 것은 기사, 가이드 및 팁을 제공하는 OWASP입니다. OWASP에서 권장되지 않는 작업이라면 절대 수행하지 마세요!

    8. 테스트를 거치지 않으면 작동하지 않습니다. 보안 조치를 구현할 때 검증에 필요한 모든 작동 테스트를 작성해야 합니다. 당신이 감옥에서 울고 있는 해커인 척하는 것도 포함됩니다. 무리한 것처럼 보일 수도 있지만 웹 애플리케이션 해킹 기술에 익숙해지는 것은 좋은 습관입니다. 당신은 가능한 취약점에 대해 배우게 될 것이고 편집증은 증가할 것입니다. 동시에 웹 애플리케이션 해킹에 대해 새로 얻은 감사에 대해 경영진에게 말할 필요는 없습니다. 취약점을 식별하려면 자동화된 도구를 사용해야 합니다. 유용하지만 고품질 코드 검토와 애플리케이션 수동 테스트를 대체할 수는 없습니다. 테스트에 더 많은 리소스를 소비할수록 애플리케이션의 안정성이 더욱 높아집니다.9. 그건 언제나 네 잘못이야! 프로그래머는 보안 취약점이 고립된 공격에서 발견될 것이며 그 결과는 미미하다고 생각하는 데 익숙합니다.

    예를 들어, 데이터 유출(잘 문서화되고 널리 퍼진 유형의 해킹)은 사용자에게 직접적인 영향을 미치지 않기 때문에 사소한 보안 문제로 간주되는 경우가 많습니다. 그러나 소프트웨어 버전, 개발 언어, 소스 코드 위치, 애플리케이션 및 비즈니스 로직, 데이터베이스 구조, 웹 애플리케이션 환경 및 내부 운영의 기타 측면에 대한 정보 유출은 성공적인 공격에 중요한 경우가 많습니다.

    동시에 보안 시스템에 대한 공격은 공격의 조합인 경우가 많습니다. 개별적으로는 미미하지만 때로는 다른 공격의 길을 열어줍니다. 예를 들어 SQL 주입에는 훨씬 더 비싸고 눈에 띄는 무차별 대입 대신 관리 인터페이스에 대한 타이밍 공격을 사용하여 얻을 수 있는 특정 사용자 이름이 필요한 경우가 있습니다. 결과적으로, SQL 주입을 사용하면 로그에 의심스러운 항목이 많아 주의를 끌지 않고도 특정 관리 계정에 XSS 공격을 구현할 수 있습니다.

    취약점을 단독으로 고려하는 위험은 위협을 과소평가하여 이에 대해 너무 부주의하게 만드는 것입니다. 프로그래머는 취약점이 너무 사소하다고 생각하여 취약점을 수정하는 데 게을러지는 경우가 많습니다. 또한 특정 문제를 문서화하지 않고 보안 개발 책임을 최종 프로그래머나 사용자에게 전가하는 것도 일반적인 관행입니다. 이러한 취약점의 존재조차 인식되지 않는 경우가 많습니다.

    겉으로 보이는 무의미함은 중요하지 않습니다. 프로그래머나 사용자에게 취약점을 수정하도록 강요하는 것은 무책임한 일입니다. 특히 취약점에 대해 알리지도 않은 경우라면 더욱 그렇습니다.

    입력 검증 입력 검증은 웹 애플리케이션의 외부 방어 경계입니다. 핵심 비즈니스 논리, 데이터 처리 및 출력 생성을 보호합니다. 말 그대로 현재 요청에 의해 실행되는 코드를 제외하고 이 경계 외부의 모든 것은 적의 영토로 간주됩니다. 경계선의 가능한 모든 입구와 출구는 먼저 총을 쏘고 나중에 질문하는 무장 보초병에 의해 밤낮으로 보호됩니다. "모델", "데이터베이스" 및 "파일 시스템"을 포함하여 별도로 보호되는(매우 의심스러워 보이는) "동맹"이 경계에 연결됩니다. 아무도 그들에게 총을 쏘고 싶어하지 않지만, 운이 좋으면... 쾅. 각 동맹에는 자체 경계가 있으며, 이는 우리를 신뢰하거나 신뢰하지 않을 수 있습니다.

    당신이 누구를 믿을 수 있는지에 대해 내가 말한 것을 기억하십니까? 누구에게도, 아무것도. PHP 세계에서는 "사용자 입력"을 신뢰하지 말라는 조언이 곳곳에 있습니다. 이는 신뢰도에 따른 카테고리 중 하나입니다. 사용자를 신뢰할 수 없다고 가정하면 다른 모든 것도 신뢰할 수 있다고 가정합니다. 이것은 잘못된 것입니다. 사용자는 우리가 그들을 알지 못하고 통제할 수 없기 때문에 가장 확실하게 신뢰할 수 없는 입력 소스입니다.

    검증 기준 입력 데이터의 검증은 웹 애플리케이션에 대한 가장 명백하면서도 가장 신뢰할 수 없는 보호입니다. 대부분의 취약점은 검증 시스템의 실패로 인해 발생하므로 이 보호 부분이 올바르게 작동하는 것이 매우 중요합니다. 실패할 수 있지만 여전히 다음 고려 사항을 준수하십시오. 사용자 정의 유효성 검사기를 구현하고 타사 솔루션이 일반 작업을 수행하고 애플리케이션에 필요할 수 있는 주요 유효성 검사 절차를 생략하는 경향이 있는 타사 유효성 검사 라이브러리를 사용할 때 항상 염두에 두십시오. 보안이 필요한 라이브러리를 사용할 때는 해당 라이브러리의 취약점과 올바른 작동 여부를 독립적으로 확인해야 합니다. 또한 PHP가 이상하고 안전하지 않은 동작을 보일 수 있다는 점을 명심하는 것이 좋습니다. 필터링 함수에서 가져온 다음 예를 살펴보세요.

    Filter_var("php://example.org", FILTER_VALIDATE_URL);
    아무런 질문 없이 필터가 통과됩니다. 문제는 수신된 php:// URL이 (PHP 핸들러를 통해) 실행 중인 PHP 스크립트에서 데이터를 반환하는 대신 원격 HTTP 주소를 수신할 것으로 예상하는 PHP 함수에 전달될 수 있다는 것입니다. 필터링 옵션에 유효한 URI를 제한하는 방법이 없기 때문에 취약점이 발생합니다. 애플리케이션이 일부 PHP 특정 URI가 아닌 http, https 또는 mailto 링크를 기대하더라도 마찬가지입니다. 테스트에 대한 이러한 지나치게 일반적인 접근 방식은 어떤 대가를 치르더라도 피해야 합니다.

    컨텍스트 입력 유효성 검사에 주의하세요. 안전하지 않은 데이터가 웹 애플리케이션에 입력되는 것을 방지해야 합니다. 주요 걸림돌: 데이터 보안 테스트는 일반적으로 최초의 의도된 용도로만 수행됩니다.

    이름이 포함된 데이터를 받았다고 가정해 보겠습니다. 아포스트로피, 하이픈, 괄호, 공백 및 전체 영숫자 유니코드 문자가 있는지 매우 쉽게 확인할 수 있습니다. 이름은 표시(처음 사용 목적)에 사용할 수 있는 유효한 데이터입니다. 그러나 다른 곳(예: 데이터베이스 쿼리)에서 사용하면 결국 새로운 컨텍스트가 됩니다. 그리고 이름에 유효한 문자 중 일부는 SQL 주입을 수행하기 위해 이름을 문자열로 변환하는 경우 이러한 맥락에서 위험한 것으로 판명됩니다.

    입력 데이터 검증은 본질적으로 신뢰할 수 없는 것으로 나타났습니다. 명확하게 유효하지 않은 값을 잘라내는 데 가장 효과적입니다. 정수, 영숫자 문자열 또는 HTTP URL이 필요한 경우를 가정해 보겠습니다. 이러한 형식과 값에는 한계가 있으며 적절하게 검증되면 위협이 될 가능성이 적습니다. 다른 값(무제한 텍스트, GET/POST 배열 및 HTML)은 확인하기가 더 어렵고 악성 데이터를 포함할 가능성이 더 높습니다.

    대부분의 경우 애플리케이션이 컨텍스트 간에 데이터를 전달하므로 모든 입력 데이터를 확인하고 하루에 호출할 수는 없습니다. 입구에서 확인하는 것은 첫 번째 보호 라인일 뿐이지 결코 유일한 보호 라인은 아닙니다.

    입력 데이터를 확인하는 것과 함께 차폐와 같은 보호 방법이 매우 자주 사용됩니다. 이를 통해 새로운 컨텍스트에 들어갈 때마다 데이터의 보안을 검사합니다. 이 방법은 일반적으로 XSS(교차 사이트 스크립팅)로부터 보호하는 데 사용되지만 필터링 도구로 다른 많은 작업에서도 사용됩니다.

    차폐는 나가는 데이터 수신자의 잘못된 해석을 방지합니다. 그러나 이것만으로는 충분하지 않습니다. 데이터가 새로운 컨텍스트에 들어갈 때 특정 컨텍스트에 대한 검사가 필요합니다.

    이는 초기 입력 유효성 검사를 중복하는 것으로 인식될 수 있지만 실제로 추가 유효성 검사 단계는 데이터 요구 사항이 매우 다른 현재 컨텍스트의 세부 사항을 더 잘 처리합니다. 예를 들어 양식에서 가져온 데이터에는 백분율 숫자가 포함될 수 있습니다. 처음 사용할 때 값이 실제로 정수인지 확인합니다. 그러나 애플리케이션 모델로 전환하면 새로운 요구 사항이 발생할 수 있습니다. 즉, 값이 애플리케이션의 비즈니스 로직이 작동하는 데 필요한 특정 범위 내에 맞아야 합니다. 그리고 이 추가 검사가 새로운 컨텍스트에서 수행되지 않으면 심각한 문제가 발생할 수 있습니다.

    블랙리스트가 아닌 화이트리스트만 사용 블랙리스트와 화이트리스트는 입력 데이터를 검증하는 두 가지 기본 접근 방식입니다. 검은색은 유효하지 않은 데이터를 확인하는 것을 의미하고, 흰색은 유효한 데이터를 확인하는 것을 의미합니다. 확인 중에 예상되는 데이터만 전송되므로 화이트리스트가 더 좋습니다. 결과적으로 블랙리스트는 가능한 모든 잘못된 데이터에 대한 프로그래머의 가정만 고려하므로 혼란스럽거나 뭔가를 놓치거나 실수하기가 훨씬 쉽습니다.

    좋은 예는 템플릿의 이스케이프되지 않은 출력 측면에서 HTML을 안전하게 만들기 위해 설계된 유효성 검사 절차입니다. 블랙리스트를 사용하는 경우 HTML에 위험한 요소, 속성, 스타일 및 실행 가능한 JavaScript가 포함되어 있지 않은지 확인해야 합니다. 이는 많은 작업을 수행하며 블랙리스트 기반 HTML 삭제 프로그램은 항상 위험한 코드 조합을 놓치게 됩니다. 그리고 화이트리스트 도구는 알려진 허용 요소와 속성만 허용하여 이러한 모호성을 제거합니다. 다른 모든 것들은 그것이 무엇인지에 관계없이 단순히 분리되거나 고립되거나 제거될 것입니다.

    따라서 더 높은 보안과 신뢰성으로 인해 모든 확인 절차에는 화이트리스트가 선호됩니다.

    입력 데이터를 수정하려고 시도하지 마십시오. 입력 데이터 확인에는 필터링이 수반되는 경우가 많습니다. 검증 중에 단순히 데이터의 정확성(긍정적 또는 부정적 결과 제공)을 평가하는 경우 필터링을 통해 확인 중인 데이터가 특정 규칙을 충족하도록 변경됩니다.

    이는 일반적으로 다소 해롭습니다. 예를 들어 기존 필터에는 전화번호에서 숫자를 제외한 모든 문자(추가 괄호 및 하이픈 포함)를 제거하거나 불필요한 가로 또는 세로 공간을 자르는 작업이 포함됩니다. 이러한 상황에서는 표시나 전송의 오류를 없애기 위해 최소한의 청소가 수행됩니다. 그러나 필터링을 사용하여 악성 데이터를 차단하는 데 너무 열중할 수 있습니다.

    입력 데이터를 수정하려고 시도한 결과 중 하나는 공격자가 수정 사항의 영향을 예측할 수 있다는 것입니다. 잘못된 문자열 값이 있다고 가정해 보겠습니다. 검색해서 삭제하고 필터링을 마치면 됩니다. 공격자가 필터를 속이기 위해 문자열로 구분된 값을 생성하면 어떻게 될까요?

    경고(document.cookie);
    이 예에서 단순히 태그로 필터링하는 것은 아무 일도 하지 않습니다. 명시적인 태그를 제거하면 데이터가 HTML 스크립트의 완전히 유효한 요소로 간주됩니다. 특정 형식으로 필터링하는 경우에도 마찬가지입니다. 이 모든 것은 입력 데이터 확인이 애플리케이션의 마지막 보안 루프가 되어서는 안되는 이유를 명확하게 보여줍니다.

    입력을 수정하려고 시도하는 대신 화이트리스트 기반 유효성 검사기를 사용하고 이러한 입력 시도를 완전히 거부하십시오. 그리고 필터링이 필요한 경우 항상 확인을 수행하기 전에 필터링하고 이후에는 필터링하지 마십시오.

    외부 유효성 검사 도구를 신뢰하지 말고 지속적으로 취약점을 모니터링하십시오. 앞서 데이터가 새로운 컨텍스트로 전송될 때마다 유효성 검사가 필요하다고 언급했습니다. 이는 웹 애플리케이션 자체 외부에서 수행되는 유효성 검사에도 적용됩니다. 여기에는 브라우저의 HTML 양식에 적용되는 유효성 검사 또는 기타 제한 사항이 포함됩니다. HTML 5의 이 양식을 살펴보십시오(레이블은 생략됨).

    대표. 아일랜드 영국
    HTML 양식은 입력된 데이터에 제한을 가할 수 있습니다. 고정 항목 목록을 사용하여 선택을 제한하고, 최소값과 최대값을 설정하고, 텍스트 길이도 제한할 수 있습니다. HTML 5의 가능성은 훨씬 더 넓습니다. 브라우저는 URL과 이메일 주소를 확인하고 날짜, 숫자 및 범위를 제어할 수 있습니다(후자의 두 가지에 대한 지원은 상당히 불확실합니다). 브라우저는 템플릿 속성에 포함된 JavaScript 정규식을 사용하여 입력을 확인할 수도 있습니다.

    이러한 모든 제어 기능의 목적은 애플리케이션의 유용성을 향상시키는 것임을 기억하는 것이 중요합니다. 모든 공격자는 원래 양식의 제한 사항을 포함하지 않는 양식을 만들 수 있습니다. 자동화된 양식 작성을 위해 HTTP 클라이언트를 생성할 수도 있습니다!

    외부 검증 도구의 또 다른 예는 Twitter와 같은 타사 API로부터 데이터를 수신하는 것입니다. 이 소셜 네트워크는 평판이 좋으며 일반적으로 의심할 여지 없이 신뢰를 받습니다. 하지만 우리는 편집증이 있기 때문에 트위터도 신뢰해서는 안됩니다. 손상될 경우 응답에는 우리가 준비할 수 없는 안전하지 않은 데이터가 포함됩니다. 그러므로 여기에서도 무슨 일이 일어나도 무방비 상태가 되지 않도록 자신의 수표를 사용하십시오.

    외부 검증 도구에 대한 확신이 있는 경우 취약점을 모니터링하는 것이 편리합니다. 예를 들어 HTML 양식에 최대 길이 제한이 설정되어 있고 크기가 제한에 도달한 입력을 받은 경우 사용자가 검사를 우회하려고 한다고 가정하는 것이 논리적입니다. 이러한 방식으로 우리는 외부 도구의 공백을 기록하고 액세스 또는 요청 수를 제한하여 잠재적인 공격에 대해 추가 조치를 취할 수 있습니다.

    PHP에서 유형 변환 방지 PHP는 강력한 유형의 언어가 아니며 대부분의 기능과 작업은 유형에 안전하지 않습니다. 이로 인해 심각한 문제가 발생할 수 있습니다. 더욱이 특히 취약한 것은 가치 자체가 아니라 검증자입니다. 예를 들어:

    Assert(0 == "0ABC"); //TRUE를 반환합니다.assert(0 == "ABC"); //TRUE를 반환합니다(시작 부분에 숫자가 없더라도!).assert(0 === "0ABC"); //NULL을 반환합니다./문 확인이 불가능하다는 경고를 표시합니다.
    유효성 검사기를 설계할 때 입력 또는 출력 값이 문자열일 수 있는 경우 엄격한 비교 및 ​​수동 유형 변환을 사용해야 합니다. 예를 들어 양식은 문자열을 반환할 수 있으므로 정수여야 하는 데이터로 작업하는 경우 해당 유형을 확인하십시오.

    함수 checkIntegerRange($int, $min, $max) ( if (is_string($int) && !ctype_digit($int)) ( return false; // 숫자가 아닌 문자 포함 ) if (!is_int((int) $int )) ( return false; // 정수가 아닌 다른 값 또는 그보다 큰 값 PHP_MAX_INT ) return ($int >= $min && $int = $min && $int array("verify_peer" => TRUE))); $body = file_get_contents("https://api.example.com/search?q=sphinx", false, $context);
    UPD. PHP 5.6+에서는 ssl.verify_peer 옵션이 기본적으로 TRUE로 설정됩니다.

    cURL 확장에는 즉시 서버 체크아웃이 포함되므로 아무것도 구성할 필요가 없습니다. 그러나 프로그래머는 때때로 라이브러리와 애플리케이션의 보안에 대해 무분별한 접근 방식을 취합니다. 이 접근 방식은 애플리케이션이 의존하는 모든 라이브러리에서 찾을 수 있습니다.

    Curl_setopt(CURLOPT_SSL_VERIFYPEER, false);
    SSL 컨텍스트에서 또는 컬_setopt()를 사용할 때 서버 확인을 비활성화하면 메시지 가로채기(man-in-the-middle) 공격에 취약해질 수 있습니다. 그러나 SSL 인증서가 잘못 구성되었거나 만료된 호스트에 연결하려는 공격이나 응용 프로그램의 시도를 나타내는 성가신 오류 문제를 해결하기 위해 정확하게 비활성화되었습니다.

    웹 애플리케이션은 종종 Twitter 클라이언트와 같은 사용자 활동에 대한 프록시 역할을 할 수 있습니다. 우리가 할 수 있는 최소한의 일은 사용자에게 경고하고 의심스러운 서버에 연결하지 못하도록 보호하는 브라우저가 설정한 높은 표준에 맞게 애플리케이션을 유지하는 것입니다.

    결론 우리는 보안 응용 프로그램을 만들 수 있는 모든 기능을 갖춘 경우가 많습니다. 그러나 우리는 개발, 디버깅을 용이하게 하고 성가신 오류의 출력을 비활성화하기 위해 몇 가지 합리적인 제한 사항을 우회합니다. 또는 좋은 의도로 애플리케이션의 논리를 불필요하게 복잡하게 만들려고 합니다.

    그러나 해커도 빵을 헛되이 먹지 않습니다. 그들은 우리의 불완전한 보호를 우회할 수 있는 새로운 방법을 찾고 있으며 우리가 사용하는 모듈과 라이브러리의 취약점을 연구하고 있습니다. 그리고 우리의 목표가 안전한 웹 애플리케이션을 만드는 것이라면 그들의 목표는 우리의 서비스와 데이터를 손상시키는 것입니다. 궁극적으로 우리 모두는 제품을 개선하기 위해 노력합니다.

    임신하기에 가장 좋은 시기를 결정하거나, 원치 않는 임신을 예방하거나, 파트너와의 성관계가 언제 가장 좋은지 알아내야 합니까? 이전에는 여성들이 상담을 위해 의사에게 가야 했지만 이제는 새로운 가장 친한 친구인 스마트폰이 생겼습니다.

    최근에는 가임일과 배란일을 쉽게 추적하고 개인 메모를 작성할 수 있는 여성을 위한 다양한 앱이 등장했습니다. 이 외에도 많은 다른 기능이 있습니다. 그러한 애플리케이션 중 하나가 이미 4,700만 명의 여성이 사용하고 있는 Glow입니다. Glow를 사용하면 여성의 기분, 섹스의 질과 빈도 등을 추적할 수 있습니다. 이 애플리케이션 덕분에 전 세계 여성들의 친밀한 삶에 관한 흥미로운 사실을 얻을 수 있습니다.

    여성에게 가장 좋은 나라

    1. 친밀감이 부족합니까? 캐나다로 가세요. 캐나다 여성은 평균 앱 사용자보다 45% 더 자주 성관계를 갖는 것으로 나타났습니다.

    2. 하지만 조심하세요. 캐나다는 임신하기에 좋은 곳입니다. 캐나다 여성은 다른 여성보다 21% 더 쉽게 임신할 수 있습니다.

    3. 호주 여성도 섹스를 자주 합니다. 이는 평균 앱 사용자보다 37% 더 많습니다.

    4. 말할 필요도 없이 호주 여성도 임신 가능성이 높다고요? 다른 사용자보다 14% 더 높습니다.

    5. 미국은 행복하기 좋은 곳입니다. 미국 여성은 다른 여성보다 성관계를 가질 가능성이 16% 더 높습니다.

    6. 행복하기 가장 나쁜 곳은? 라틴 아메리카. 여기서 여성은 평균 앱 사용자보다 섹스를 하는 빈도가 4% 적습니다.

    성적 취향

    1. 여성의 성욕은 월간 주기와 일치합니다. 주기의 첫날은 월경의 첫날로 약 5일 동안 지속됩니다. 따라서 여성은 한 달에 1~5일 동안 섹스에 가장 관심이 없습니다.

    2. 많은 여성들이 이 기간 동안 에너지 수준이나 기분의 변화를 보고하며 이는 일반적으로 성적 욕망의 감소와 관련이 있습니다. 또한 여성은 생리 후 일주일 동안 섹스에 대한 관심이 줄어듭니다.

    3. 대부분의 여성은 생리주기 12일째에 다시 성관계를 시작합니다.

    4. 많은 여성들이 주기의 12~14일 동안 규칙적인 성관계를 갖습니다. Glow 앱은 요즘을 "섹시함의 정점"이라고 부릅니다.

    5. 여성은 실제로 생리 주기 중 13일과 14일에 가장 섹시함을 느낍니다. 하지만 흥미로운 점은 그들이 현재 가장 좋고 가장 만족스러운 섹스를 반드시 하는 것은 아니라는 점입니다.

    6. 여성은 생리주기의 마지막 날인 30일에 섹스를 가장 즐깁니다. Glow의 오늘은 "절정 오르가즘"으로 지정됩니다.

    여자들은 만족하나요?

    1. 여성은 생리 주기 중 15일과 16일에 가장 행복감을 느낍니다. 또한 전날에 성관계를 많이 했을 경우에도 마찬가지입니다.

    2. Glow 사용자는 2년 동안 760만 건의 성적 만남을 등록했습니다.

    3. 이는 Glow 앱을 사용하는 여성 중 매 분마다 최소 7명의 여성이 성관계를 갖고 있다는 의미입니다.

    4. 그런데, 사용자들은 자신의 호감도를 200만 번이나 신고했습니다. 이 앱은 또한 88,000쌍의 커플의 성주기와 임신 능력을 추적합니다.

    5. 불행하게도 기존의 성적 접촉에도 불구하고 모든 여성이 이에 만족하는 것은 아닙니다. 거의 3분의 1의 여성이 스마트폰을 사용하는 것보다 섹스를 포기하는 편을 택했습니다.

    6. 하지만 이는 여전히 3분의 2가 섹스보다 휴대폰을 포기한다는 뜻이다.



    기사가 마음에 드셨나요? 공유하세요
    맨 위