安全编码实践

这篇文章再往更技术方面的安全方面的代码用于执行申请,并提供指引,以制定一个贯彻执行过程中,为稳妥实施。 潜在的脆弱性,在提出申请的是减少了强大的设计,但执行的申请,印章,其命运。 辛勤工作,倾注了一个安全的设计变得无关紧要,如果执行不好做。 它也是重要的是要了解该列入与安全相关的技术或设计方法,并不一定意味着或保证任何级别的安全应用。 执行的申请和任何安全技术的使用就是其中的最后组件,带来了高层次的可靠性。

分析了实施阶段,是双方的责任,开发商和开发经理。 开发商负责实施设计好,而经理人是负责制定出来的过程中,确保了良好的执行。 这是可以做到的经标准化的程序,其中包括记载的发展和编码标准,设计和代码审查,以及开发商的训练与安全方面的应用发展。 这些程序,有利于发展和应用无论何种语言使用或种类的应用开发。

最常用的语言,今天受到c编程语言, java和脚本语言如perl和unix的炮弹。 每个这些语言和环境,可使用不当,以妥协的安全应用软件和系统上运行。 不过,这篇文章的目的并非一个清单,为开发遵循。 取而代之的是,发展一个安全为重点的思考过程可以说是一个强大的编码实践。

由陷阱的c

在c编程语言,其中包括c , c + +中,与对象- c的,是最常用的语言,也可能造成危险,在不确定的手中。 这些项目提供的开发商与有能力操纵和利用许多的系统部分,如存储,文件和设备。 这是一个伟大的力量在c语言,但危险出现时,开发商会犯错误。 c提供一个高层次的接触,以底层操作系统,并有几个互相制衡,以保护开发者。 如果开发商误写入数据,以错误的装置或记忆体的位置, c程序将尽一切力量发展写道,不管数据或目的地。

  

第一脆弱的地区,往往与c是缓冲区溢出。 以下示例代码显示了一个很基本的溢出:

 煤焦字符串[ 10 ] ; 
  strcpy (字符串, " aaaaaaaaaaaaaaa " ) ; / * 15 "的"字 

在这里, 15条"的"字复制到记忆体面积为一个变量字符串,是被宣布为一个静态的10字阵。 该strcpy ( )函数是否确实如导演,没有顾及大小的数据被复制或地点,因为它需要有云。 缓冲溢出发生时,第11届元素复制到记忆体位置后,立即对所在地的第十元素的可变字符串。 目前适用这一原则,以任何输入数据来自外部来源,取代了一连串的"是"字。 这允许攻击者控制的影响,溢流。

该strcpy ( )函数是其中几个函数在c ,不履行任何约束检查,并允许任意大小的缓冲区,以被复制的危险。 其他职能,以避免正得到( ) , strcat ( ) , sprintf ( )的,与scanf ( )系列函数。 有最新版本的一些职能,使长度拷贝到指定的。 这些都是strncpy ( ) , strncat ( ) , snprintf ( )和fgets ( ) 。 这些修正的职能拷贝最多只的数目字,由指定的长度参数。 最多长度字是抄袭目的地

  strncpy (目的地,来源,长度) ; 

尖端

当使用的" n "版本的字符串操作函数- strncpy ( ) , strncat ( ) , snprintf ( )和fgets ( ) -肯定的是,长度不能大于目的地字符串,而不是源字符串。 缓冲区可以超支,如果长度值较大规模的目的地缓冲区。

当使用指针,以缓冲,而不是静态宣布缓冲区,你必须拨出足够的容量可以储存价值被复制。 使用内存操作函数,它允许你指定的长度。

尖端

在分配内存为字符串的数据,不要忘记添加1的总长度,以容纳为无效终止字符。 没有一个null终结者,数据直接存储后,最后一个字符的字符串,可考虑部分的字符串。

这种功能是不是唯一的地方缓冲区溢出发生。 务必要检查这方面的资料阅读,复制,或写信给任何内存位置或分配给一个变量,将合适的,或者说,目的地分配有足够的储存空间。

尖端

为了避免缓冲区溢出,在你的代码,一定要验证的投入。 检查的规模数据和存储位置和使用操作函数产生开发商指定容量的信息而不是任意长的数据块。

竞赛条件加上复杂的程度,用c代码。 竞赛条件者可以利用两方面的c代码创建序和保护。

测序是指以秩序,在这种秩序的事件发生在一个应用。 竞赛条件,可结果从测序之间的差异取决于事件,当时并没有检查是做之间的事件。 这往往标志着一个缺点,在任何错误检查和验证例行程序使用。 如果两种功能,通常运行顺序及第二项功能是假设的结果,第一是有效的,那么有可能为竞赛条件存在。 高架特权往往是被攻击的目标。 组织,再加上测序和错误检查,最大限度地减少可能为种族的条件。

这是一个坏的执行创造了一个竞赛条件:

  increase_privs ( ) ; 
  … … 
 值= special_app_function ( ) ; / *需要特权* / 
  other_unreleted_function ( ) ; / *并没有要求特权* / 
  other_unreleated_function2 ( ) ; / *同上* / 
  special_dependent_function (价值) ; / *需要特权* / 
  … … 
 出境( ) ; 

在这里,一对夫妇的不安全行为发生。 特权的应用都是高架早在申请,但没有用,直到后来。 他们也从未放弃了,所以大部分的功能与执行远高于所需的特权层次。 最后,竞赛条件的,是通过创造穷人组织的依赖性职能没有发生不久对方。 举例说,解决这些问题,是

  increase_privs ( ) ; 
 值= special_app_function ; / *需要特权* / 
 如果( ! validate_function (价值) / *保证安全的价值* / 
  do_error_processing (价值) ; / *做点事智能与误差* / 
  special_dependent_function (价值) ; / *需要特权* / 
  decrease_privs ( ) ; / *不再需要特权* / 
  
  other_unreleted_function ( ) ; / *并没有要求特权* / 
  other_unreleated_function2 ( ) ; / *同上* / 

注特别验证和错误处理套路被用来后才通过价值的另一项功能。

尖端

组织功能结合起来,它与验证,以确保预期的信息不会受到损害之间的依赖事件。

许多种族的条件存在,是由于穷人临时文件的使用情况。 当这些档案创造了,他们应该受到保护,免遭外来攻击,在运作。 unix和windows允许开发者设定许可钻头和业务国旗当创建一个文件。 权限应禁止进入任何人,但是这里的主人的过程。 当创建档案利用开放( )调用,设定o_excl和o_creat国旗,引起函数返回一个错误如果文件你是妄图在联合国制造已经存在。 因为它是一个临时文件,它不应该存在之前,它需要。 如果文件存在,这是一种可能的迹象攻击。 当使用这些方法,这一点也很重要,检查返回值的功能,以及清理任何文件,在发生错误的条件。 下面的例子显示了语法要打开一个文件或创建一个,如果它不已经存在-与权限,使只有造物主来读取,写入,执行,它使用s_irwxu模式宏观的。

 公开(下称"文件" , o_creat | o_excl | o_wronly , s_irwxu ) ; 

该调用失败,在万一该文件已经存在,因为该o_excl旗。 同时,注意到不安全的文件名。 静态命名惯例用于增加了遭袭击的风险很大,因为一个组成部分,这次袭击是已经提供的。

由于增加了在场的临时文件,竞赛条件和相关的不安全因素,一些操作系统都有特定的功能,以创建临时文件在一个安全的方式。

开发者也可以使用操作系统的内置式档案锁能力,以控制进入该档案。 这些方法控制准入的基本内核组件。

尖端

当使用临时文件,随机文件名,建立强有力的权限,并组织创建,使用和清除的档案,以最大限度地减少攻击的可能。

另一种组件,增加了系统的可靠性,并能影响安全的一个应用是返回值。 虽然它可能似乎显而易见,重要的是要强调有必要验证返回值的功能。 职能往往执行顺序和依赖的结果或数据,从以前的功能。 通过检查返回值以前的职能,供养功能是保障,执行与无效数据。 甚至当事件并非攻击,从回收的异常情况增加,在稳健的应用。

这个例子显示,执行不力,无法检查返回值:

 每组do_string_check (字符串, valid_characters ) ; / *函数返回一个int * / 
 如果( == good_return ) 
  process_string (字符串) ; 

在这里,执行工作力度不够,因为负面案例,一个坏的回报,是从来没有处理。 更好地执行,是

 每组do_string_check (字符串, valid_characters ) ; / *函数返回一个int * / 
 如果( ! = good_return ) 
  special_error_processing_routine ( n )的; / *坏的价值,做一些* / 
  process_string (字符串) ; 

负回报,是由错误处理例行的,可以退出程序,请求一个新的字符串,或者转换成返回值为一个有效的参数。 如果返回值是好的,这是不言而喻的,以该进程的例行公事。

尖端

创建可重用的事件和错误套路提供了一个标准的机制,使所有的申请作出反应的各种攻击和问题。 意念对这些例行程序,包括共同的验证方法字符串和数值,包皮职能履行诚信核对,并保障机制,验证了变数和内存位置。 每次都要检查和过程的返回值的功能。

在下位的细节涉及使用敏感信息的应用,包括密码,加密,或任何其他私人信息。 正如前面提到的,所有节目信息存在着地区的共同池的存储器,可以受阅读和修改由外部程序。 它有利于清晰的记忆,当信息不再使用,以避免信息披露的一次袭击。 最常见的和足够的方法,以明确的数据,这就是通常被称为零位内存。 当储存的信息是不再需要,储存地点应被覆盖还原或随机数据,以防止攻击者从回收的资料透过记忆体或核心垃圾场。 这一程序变得尤为重要,当加密技术是在使用。 钥匙用来加密和解密信息是最重要的件密码体系,并千方百计地保护他们的工作需要做。

这些准则体现了一些共同的问题,出现在c为基础的应用程序。 c是一个非常受欢迎的和强大的语言,允许提供了很大的灵活性,给发展商,并应注意其使用。

1 perl中的一个应用

perl是一个有趣的野兽结合了很多的好处,一个结构完整的编程语言,如c区,灵活性和一体化的一个unix壳。 perl中,让发展商创造的程序或子程序,定义变量,并利用应用系统和指挥提供与作业系统。 这些能力,其实力与经常表达与解析,让perl的强大存在,在网络应用,系统管理,自动化等。

perl的节目,一般不容易受到缓冲区溢出,因为弱型的性质,其变量和声明。 不像c ,其中的变数和记忆需要加以界定为一个特定的储存工人阶级和记忆,必须分配给他们, perl中所做的一切就是自动和对待一切作为字符串数据。 采取以下例子:

  # ! /路径/ / perl中 
  1美元= 1 ; 
 元one_s = " 1 " ; #没有什么不同1美元 
  2美元= 1美元+ $ one_s ; #结果是2 ,或" 2 " ,这是等价 

c语言中,变量1美元很可能会被宣布为一个整数元one_s ,一个字符串。 加上这两个因素也将导致一种错误的价值观。 perl中并不区分不同类型,即$二是指派2 ,或" 2 " -它们是等效在p erl。 语言,也并不属于猛禽,以记忆体配置的要求,其他语言证物。 下面的例子是完全可以接受在perl :

  # ! /路径/ / perl中 
 元var1 = " aaaaa " ; 
 元var2 = "的股票" ; 
 元var2 = $ var1 ; # $ var2变成" aaaaa " ; 

元var2需对新的价值的5个"是"字。 所有变数和动态分配;是没有概念的预设储存空间可以满溢。

perl是容易,但是,比赛条件和脆弱性与执行外部程式。 护理应考虑到排序的功能。 输入验证是同样重要的,在perl中,为了防止剥削外部应用程序。

perl的支持能力,以开放的档案,同样以c和其它语言,因此使用的临时文件应包含适当的权限和创造的旗帜。

使用perl中,在基于web的cgi程序也非常受欢迎。 最大的风险,与利用在这种环境下出现的输入验证和执行对外制节目从内部产生。 以保护申请时,几个预防措施可以采取。 用污点检查机制的perl ,任何变量集外,上述计划将不会被传递到任何程序运行所应用。 任何变量所订的污点可变成为污点。 污点检查模式,是特别有用的,为避免漏洞,其中听之任之,用户变量是通过暗中以所谓的节目,从perl中的应用。 初始化第5版的perl中的污点检查模式,请使用以下脚本的头部:

  # ! /路径/ / perl中- t的#运行中的污点检查模式 

今后防范措施来解析输入值,以消除元字符和不想要的价值观。 这有利于保障免受攻击利用参数,通过开展以炮弹和其它应用。 下列例子说明一个简单的例行可以扫描输入字符串中的任何元字符可能被解释由某个程序进行:

 元unclean_input = & get_html_forms_response ( ) ; 
 如果( $ unclean_input = 〜的tr /;|`!#$&*()[]{ ) <>:'"//) 
  #打印出一些html的在这里显示失败 
  & do_some_error_reporting ( ) ; 

在这种情况下,例行报告错误,如果一个梅塔字是发现。 替代方法取代元字符,还是只能继续,如果没有梅塔字的是发现。

最后的防范措施,是利用一个空壳运行其它应用软件。 作为与unix系统( )调用和windows exec ( )调用,该系统( )调用在perl允许开发商来说,另一项应用。 该exec ( )调用在perl功能,如这一呼吁在unix的运行过程,是取代计划表示。 这些功能都可以是特别危险的时候,使用的一个环境,让使用者输入,如cgi程序或系统实用程序。 如果输入验证不发生,申请者可以利用来执行任意的程式,这可能影响该系统。 下面的例子演示了不安全因素的利用系统( )与nonvalidated投入。 假设用户提供的字符串用户; /斌/支持rm射频/成为分配给变量$输入:

 系统( " ecommerce_app元投入" ) ; 

这有效地转化为/ bin / sh的ecommerce_app用户; /斌/支持rm射频/ 。 假设该程序是运行与特权,该程序将执行一个空壳运行电子商务应用;击中壳分号,它是指挥分离器,在壳;然后运行执行rm - rf ,其中除去整个文件系统。

宓的java es苏爪哇

爪哇是一个相对最近发明,在世界上的分布式互联网计算。 它带给得以实现的概念,独立于平台的代码。 爪哇作品写的代码,并编译成特殊格式,然后运行java的虚拟机器。 虚拟机( vm )平台,具体的,但代码运行的,但实际上不是。 爪哇允许网页浏览器以及遥控系统来运行更为复杂和交互式应用。 网络浏览器的访问网站,并在接到java applet的,从服务器。 这个小程序,然后运行在网页浏览器和可以沟通与原产于网络服务器。 刚推出时,爪哇转化为静态网页变为充满活力和流畅的应用。 自成立之初,使用爪哇已扩大到许多不同的分布式应用领域,如网络管理,嵌入式因特网家用电器,和其他实用功能。

爪哇是一个很好的例子,一种语言,其开发者的安全考虑,在早期设计阶段。 最初版本的java进行了充分证据的安全体系结构,被称为沙盒,即阻止java applet技术或应用,从存取系统资源。 由于使用java开始扩大,在必要时为获取系统资源之外的沙盒。 第一个版本的java开发工具包提供使用签名小程序。 该模型描述了一个applet的是数字签字后,以核实其创作者。 当数字签名是在核实情况后, applet的,是值得信赖的,然后由当地的系统,这使得该applet的获得其他系统资源。 这个数字签名法涉及相当复杂的编程工作,以正确的。 它也必须指出,这种安全模式的一种数字签名java applet的,是错误的。 任何人都可以签署一份applet的。 一个恶意的applet可以签署攻击和下载的网页浏览器。 网页浏览器有效地验证了这种恶意的applet实在是写的攻击,然后愉快地执行它,不管结果是编程。

当前和第二次迭代的java安全架构,是更强大和灵活,比以前的版本。 这使得爪哇进入许多领域的应用开发先前超出其能力。 新的java安全体系结构的用途很容易可定义的安全政策和准入控制方法,让一个附属程序或应用,以获得具体的资源,以不同程度的影响。 有关指引,介绍了这里,爪哇设计师分析了各种互动和脆弱性,目前与分布式互联网应用,并达成了一个模型,提供高安全性与极端的灵活性。 为完整记载爪哇和它的宣传短片,见http://java.sun.com

蚬壳游戏和unix

unix的炮弹的基础上,形成的用户交互与unix系统。 贝壳命令行传译员表示支持某种程度的自动化,并规划在形式的shell脚本。 这些脚本常常被用来实现自动化系统的任务,履行重复性作业,并运行的cgi web应用。 作为与perl ,地区的潜在危险是输入验证,种族条件,与外部的文件和项目,并组织功能。

在unix中,有特权运作,可以由一个特权用户,或者它们可以被设定为办成一所享有特权的用户。 有微妙的差异,两种方法。 目录中的所有文件unix系统,包括应用,都有一套属性,包括用户和组所有权,并建立一套权限的旗帜。 结合起来,让他们在文件访问时必须严格控制。 正常申请拥有一个用户,并视对访问权限,他们可能会而言,只有拥有人,由一组,或由任何人对这个制度。 申请继承特权的用户谁违背了他们。 一个应用程序需要root权限,可以由一个非管理员用户,但在那些地方更高特权需要,它就会失败。 为克服这个难题,并让一般的用户,以获取某种特权职能,在unix提供setuid和setgid的旗帜。 当被激活时,它们所造成的应用来说,作为业主或小组表示,应用他们设置用户id (的uid )的申请向谁拥有它。

许多cgi和系统程式需要存取系统资源,是setuid根。 这也适用于编制程序,如c程序,脚本,其中包括perl和unix的炮弹。 有经验的unix用户和开发商往往警告危险的setuid shell脚本提供root权限。 正如前面所讨论的输入验证和竞赛条件是很容易被剥削时,剧本是没有保障。 当运行一个脚本作为一个特权用户,有没有更容易的方式交出钥匙城堡较薄弱shell脚本。 这种脚本是特别危险的时候,程控无保安措施,因为壳牌是互动性。 用户供应的投入,并且外壳履行职能。 perl中有许多内置式的制衡,使安全setuid用法。

互联网电器

互联网设备是,这些系统和设备的全部目的,是互联网计算。 所有设计准则,编程语言的考虑,漏洞和操作范例,是直接相关的互联网用具。 互联网用具经常使用共同的操作系统,应用程序和方法,来完成他们的目标。 如果在开发中的应用如下这条路,特别注意所有的资料在这里。 因特网上的一些电器的发展,从无到有,把仅新开发的设计和技术。 评估安全风险,为这些系统需要额外的勤劳。 这一点尤为重要,要结合安全成为设计过程时,一切都要从头开始。

这是一篇文章说,由陶马什querolin
免责声明:我们的网站是不负责所载资料由本条规定。 这篇文章根本没有反映看法,意见,思想或信仰的文章目录中的工作人员。

翻译预告:文章"安全编码实践"被翻译使用的自动翻译服务。 我们真诚地道歉,对任何翻译错误发生。 谢谢你的谅解。

Online: 399 users browsing the articles directory