데이터 베이스 MySQL 튜토리얼 帮助程序员解脱困境的十条技巧

帮助程序员解脱困境的十条技巧

Jun 07, 2016 pm 03:29 PM
c++ 양도 논법 돕다 기능 프로그램 제작자 입력하다

欢迎进入C/C++编程社区论坛,与200万技术人员互动交流 >>进入 安全专家 Michael Howard 和 Keith Brown 提出了十条技巧来帮助您解脱困境。 安全问题涉及许多方面。安全风险可能来自任何地方。您可能编写了无效的错误处理代码,或者在赋予权限时过于慷慨。您

欢迎进入C/C++编程社区论坛,与200万技术人员互动交流 >>进入

   安全专家 Michael Howard 和 Keith Brown 提出了十条技巧来帮助您解脱困境。

    安全问题涉及许多方面。安全风险可能来自任何地方。您可能编写了无效的错误处理代码,或者在赋予权限时过于慷慨。您可能忘记了在您的服务器上正在运行什么服务。您可能接受了所有用户输入。如此等等。为使您在保护自己的计算机、网络和代码方面有个良好开端,这里展示了十条技巧,遵循这些技巧可以获得一个更安全的网络策略。

    1. 信任用户的输入会将自己置于险境

    即使不阅读余下的内容,也要记住一点,“不要信任用户输入”。如果您总是假设数据是有效的并且没有恶意,那么问题就来了。大多数安全薄弱环节都与攻击者向服务器提供恶意编写的数据有关。
    信任输入的正确性可能会导致缓冲区溢出、跨站点脚本攻击、SQL 插入代码攻击等等。
    让我们详细讨论一下这些潜在攻击方式。

    2. 防止缓冲区溢出

    当攻击者提供的数据长度大于应用程序的预期时,便会发生缓冲区溢出,此时数据会溢出到内部存储器空间。缓冲区溢出主要是一个 C/C++ 问题。它们是种威胁,但通常很容易修补。我们只看到过两个不明显且难以修复的缓冲区溢出。开发人员没有预料到外部提供的数据会比内部缓冲区大。溢出导致了内存中其他数据结构的破坏,这种破坏通常会被攻击者利用,以运行恶意代码。数组索引错误也会造成缓冲区下溢和超限,但这种情况
    没那么普遍。

    请看以下 C++ 代码片段:
    void DoSomething(char *cBuffSrc, DWord cbBuffSrc)
    {
    char cBuffDest[32];
    memcpy(cBuffDest,cBuffSrc,cbBuffSrc);
    }

    问题在哪里?事实上,如果 cBuffSrc 和 cbBuffSrc 来自可信赖的源(例如不信任数据并因此而验证数据的有效性和大小的代码),则这段代码没有任何问题。然而,如果数据来自不可信赖的源,也未得到验证,那么攻击者(不可信赖源)很容易就可以使cBuffSrc 比 cBuffDest 大,同时也将 cbBuffSrc 设定为比 cBuffDest 大。当 memcpy将数据复制到 cBuffDest 中时,来自 DoSomething 的返回地址就会被更改,因为cBuffDest 在函数的堆栈框架上与返回地址相邻,此时攻击者即可通过代码执行一些恶意操作。

    弥补的方法就是不要信任用户的输入,并且不信任 cBuffSrc 和 cbBuffSrc 中携带的任何数据:

    void DoSomething(char *cBuffSrc, DWORD cbBuffSrc)
    {
    const DWORD cbBuffDest = 32;
    char cBuffDest[cbBuffDest];
    #ifdef _DEBUG
    memset(cBuffDest, 0x33, cbBuffSrc);

    #endif
    memcpy(cBuffDest, cBuffSrc, min(cbBuffDest, cbBuffSrc));
    }

    此函数展示了一个能够减少缓冲区溢出的正确编写的函数的三个特性。首先,它要求调用者提供缓冲区的长度。当然,您不能盲目相信这个值!接下来,在一个调试版本中,代码将探测缓冲区是否真的足够大,以便能够存放源缓冲区。如果不能,则可能触发一个访问冲突并把代码载入调试器。在调试时,您会惊奇地发现竟有如此多的错误。最后也是最重要的是,对 memcpy 的调用是防御性的,它不会复制多于目标缓冲区存放能力的数据。

    在 Windows Security Push at Microsoft(Microsoft Windows? 安全推动活动)中,我们为 C 程序员创建了一个安全字符串处理函数列表。您可以在 Strsafe.h: SaferString Handling in C(英文)中找到它们。

    3. 防止跨站点脚本

    跨站点脚本攻击是 Web 特有的问题,它能通过单个 Web 页中的一点隐患危害客户端的数据。想像一下,下面的 ASP.NET 代码片段会造成什么后果:

   

    有多少人曾经见过类似的代码?但令人惊讶的是它有问题!通常,用户会使用类似如下的 URL 访问这段代码: http://eXPlorationair.com/welcome.aspx?name=Michael[m

    该 C# 代码认为数据始终是有效的,并且只是包含了一个名称。但攻击者会滥用这段代码,将脚本和 HTML 代码作为名称提供。如果输入如下的 URL alert('">http://northwindtraders.com/welcome.aspx?name=<script>alert('您好!');</script>

    您将得到一个网页,上面显示一个对话框,显示“您好!”。您可能会说,“那又怎样?”想像一下,攻击者可以诱导用户点击这样的链接,但查询字符串中却包含一些真正危险的脚本和 HTML,由此会得到用户的 cookie 并把它发送到攻击者拥有的网站;现在攻击者便获得了您的私人cookie 信息,或许会更糟。

    要避免这种情况,有两种方法。第一种是不信任输入,并严格限制用户名所包含的内容。例如,可以使用正则表达式检查该名称是否只包含一个普通的字符子集,并且不太大。以下 C# 代码片段显示了完成这一步骤的方法:

    Regex r = new Regex(@"^[\w]{1,40}$");

    if (r.Match(strName).SUCcess)
    {
    // 好!字符串没问题
    }
    else
    {
    // 不好!字符串无效
    }

    这段代码使用正则表达式验证一个字符串仅包含 1 到 40 个字母或数字。这是确定一个值是否正确的唯一安全方法。

    HTML 或脚本不可能蒙混过此正则表达式!不要使用正则表达式寻找无效字符并在发现这种无效字符后拒绝请求,因为容易出现漏掉的情况。第二种防范措施是对所有作为输出的输入进行 HTML 编码。这会减少危险的 HTML 标记,使之变成更安全的转义符。您可以在 ASP.NET 中使用 HttpServerUtility.HtmlEncode,或者在 ASP 中使用Server.HTMLEncode 转义任何可能出现问题的字符串。

[1] [2] 

帮助程序员解脱困境的十条技巧

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

C++에서 전략 디자인 패턴을 구현하는 방법은 무엇입니까? C++에서 전략 디자인 패턴을 구현하는 방법은 무엇입니까? Jun 06, 2024 pm 04:16 PM

C++에서 전략 패턴을 구현하는 단계는 다음과 같습니다. 전략 인터페이스를 정의하고 실행해야 하는 메서드를 선언합니다. 특정 전략 클래스를 생성하고 각각 인터페이스를 구현하며 다양한 알고리즘을 제공합니다. 컨텍스트 클래스를 사용하여 구체적인 전략 클래스에 대한 참조를 보유하고 이를 통해 작업을 수행합니다.

C++에서 중첩 예외 처리를 구현하는 방법은 무엇입니까? C++에서 중첩 예외 처리를 구현하는 방법은 무엇입니까? Jun 05, 2024 pm 09:15 PM

중첩된 예외 처리는 중첩된 try-catch 블록을 통해 C++에서 구현되므로 예외 처리기 내에서 새 예외가 발생할 수 있습니다. 중첩된 try-catch 단계는 다음과 같습니다. 1. 외부 try-catch 블록은 내부 예외 처리기에서 발생한 예외를 포함하여 모든 예외를 처리합니다. 2. 내부 try-catch 블록은 특정 유형의 예외를 처리하며 범위를 벗어난 예외가 발생하면 외부 예외 처리기에 제어가 제공됩니다.

C++ 템플릿 상속을 사용하는 방법은 무엇입니까? C++ 템플릿 상속을 사용하는 방법은 무엇입니까? Jun 06, 2024 am 10:33 AM

C++ 템플릿 상속을 사용하면 템플릿 파생 클래스가 기본 클래스 템플릿의 코드와 기능을 재사용할 수 있습니다. 이는 동일한 핵심 논리를 사용하지만 특정 동작이 다른 클래스를 만드는 데 적합합니다. 템플릿 상속 구문은 templateclassDerived:publicBase{}입니다. 예: templateclassBase{};templateclassDerived:publicBase{};. 실제 사례: 파생 클래스 Derived를 생성하고, 기본 클래스 Base의 계산 기능을 상속하고, 현재 개수를 인쇄하는 printCount 메서드를 추가했습니다.

Docker 환경에서 PECL을 사용하여 확장자를 설치할 때 오류가 발생하는 이유는 무엇입니까? 그것을 해결하는 방법? Docker 환경에서 PECL을 사용하여 확장자를 설치할 때 오류가 발생하는 이유는 무엇입니까? 그것을 해결하는 방법? Apr 01, 2025 pm 03:06 PM

Docker 환경을 사용할 때 Docker 환경에 Extensions를 설치하기 위해 PECL을 사용하여 오류의 원인 및 솔루션. 종종 일부 두통이 발생합니다 ...

C 현에서 숯의 역할은 무엇입니까? C 현에서 숯의 역할은 무엇입니까? Apr 03, 2025 pm 03:15 PM

C에서 숯 유형은 문자열에 사용됩니다. 1. 단일 문자를 저장하십시오. 2. 배열을 사용하여 문자열을 나타내고 널 터미네이터로 끝납니다. 3. 문자열 작동 함수를 통해 작동합니다. 4. 키보드에서 문자열을 읽거나 출력하십시오.

크로스 스레드 C++ 예외를 처리하는 방법은 무엇입니까? 크로스 스레드 C++ 예외를 처리하는 방법은 무엇입니까? Jun 06, 2024 am 10:44 AM

다중 스레드 C++에서 예외 처리는 std::promise 및 std::future 메커니즘을 통해 구현됩니다. Promise 개체를 사용하여 예외를 발생시키는 스레드에 예외를 기록합니다. 예외를 수신하는 스레드에서 예외를 확인하려면 future 객체를 사용하세요. 실제 사례에서는 Promise와 Future를 사용하여 다양한 스레드에서 예외를 포착하고 처리하는 방법을 보여줍니다.

C++ 스레드 로컬 스토리지에 대한 메모리 사용 및 최적화 전략 C++ 스레드 로컬 스토리지에 대한 메모리 사용 및 최적화 전략 Jun 05, 2024 pm 06:49 PM

TLS는 스레드 스택 공간에 저장된 데이터의 개인 복사본을 각 스레드에 제공하며 메모리 사용량은 스레드 수와 데이터 양에 따라 다릅니다. 최적화 전략에는 스레드별 키를 사용하여 동적으로 메모리를 할당하고, 누출을 방지하기 위해 스마트 포인터를 사용하고, 공간을 절약하기 위해 데이터를 분할하는 것이 포함됩니다. 예를 들어, 애플리케이션은 오류 메시지가 있는 세션에 대해서만 오류 메시지를 저장하도록 TLS 저장소를 동적으로 할당할 수 있습니다.

C 언어로 멀티 스레딩을 구현하는 4 가지 방법 C 언어로 멀티 스레딩을 구현하는 4 가지 방법 Apr 03, 2025 pm 03:00 PM

언어의 멀티 스레딩은 프로그램 효율성을 크게 향상시킬 수 있습니다. C 언어에서 멀티 스레딩을 구현하는 4 가지 주요 방법이 있습니다. 독립 프로세스 생성 : 여러 독립적으로 실행되는 프로세스 생성, 각 프로세스에는 자체 메모리 공간이 있습니다. 의사-다일리트 레딩 : 동일한 메모리 공간을 공유하고 교대로 실행하는 프로세스에서 여러 실행 스트림을 만듭니다. 멀티 스레드 라이브러리 : PTHREADS와 같은 멀티 스레드 라이브러리를 사용하여 스레드를 만들고 관리하여 풍부한 스레드 작동 기능을 제공합니다. COROUTINE : 작업을 작은 하위 작업으로 나누고 차례로 실행하는 가벼운 다중 스레드 구현.

See all articles