在编写Web应用程序时,保护数据的安全性是非常重要的。由于Web应用程序越来越复杂并涉及到全球用户,对于数据的安全性确保难度也在增加。注册全局变量(register_globals)是一种语言特性,通常在PHP环境中使用。如同它的名称一样,这个特性可以使得变量在全局范围内可用。尽管register_globals在发展初期非常流行,但现在它已经被证明是危险的,甚至它已经被避免使用。下面让我们来详细的了解register_globals为何会是一个安全漏洞,以及应该学会避免使用它。
什么是register_globals?
Register_globals是一种php中的特性,它允许外部变量使用全局变量来进行访问,因此在任意一段网页的PHP代码中,无需任何显式引用或声明,直接使用可以被全局变量使用的变量即可。不需要在代码中显式地使用全局关键字,不需要用户输入或表单标签引用,它们都以全局变量的形式存在于程序中。register_globals可以轻易的在工作站环境中使用,但是它在Web服务器上,尤其是公共的一个服务器上,是非常危险的。
register_globals存在的问题
register_globals最大的问题在于安全性。通过将输入数据直接映射到全局变量,register_globals让应用程序变得非常容易受到攻击。下面是register_globals如何引发安全漏洞:
1. 会造成变量覆盖
一旦register_globals开启,变量就会默认赋初值并盖掉其它变量。这意味着如果应用程序需要在两个不同的地方使用同一个变量,那么其中一个地方使用时就会覆盖掉另一个变量的值,这对应用程序是不利的。
2. 可以被利用进行跨站脚本攻击
如果使用用户提交数据时未进行过滤,而且将传递的数据作为脚本变量的赋值使用,register_globals也是攻击者所利用的最佳途径,因为恶意用户可以轻松地修改全局变量的值,从而在系统中注入恶意脚本,导致跨站脚本攻击。
3. 可能会因输入错误或语法错误导致系统崩溃
开启register_globals特性还会导致产生一些输入错误或语法错误,可能会导致应用程序的崩溃。在表单处理时,即使出现了其中一个变量错误,也会导致应用程序不能照常工作。
为了更清楚的理解,下面我来给出一个具体的例子:假设应用程序使用“username”存储用户的登录名称。恶意攻击者在get或post请求中提交“username”变量,并将值设置为与其它全局变量相同,如“PHP_SELF”,以此来利用这个安全漏洞。
避免使用register_globals
由于register_globals的存在易导致各种安全漏洞,PHP在版本4.2.0之后已经禁用了它。与此同时,其他Web应用程序框架也不鼓励使用这个特性。现在, 开发者们已经采用更为安全和更可靠的技术,如过滤和参数传递来代替register_globals进行数据验证和处理。下面是一些典型的避免register_globals的方法:
1. 使用超全局数组
php超全局数组,例如,$_GET,$_POST和$_COOKIE等,是一个很好的替代方案。这些变量被定义为全局变量并提供在程序不同部分之间共享不同类型的数据的方法。这使得应用程序可以访问必要的表单数据,同时也可以进行过滤,以保证数据的安全性。
2. 过滤数据
过滤是在浏览器中截取用户提交的数据,以删除或修复威胁或有害的内容。过滤是一种快速、有用的方法,可以通过使用通配符和正则表达式内置代码,去掉不必要的字符。同时,通过检查输入中的无效字符和报错会影响应用程序执行,进而防止sql注入和xss攻击等安全问题的发生。
3. 参数化查询
参数化查询是一种使用预先定义好的后面变量的方式来代替用户输入中的占位符的方法。这种方式优点在于,可以在查询中向用户传递非空的数据集,同时还能够保证程序不会受到用户输入的格式变化所影响。
总结
应用程序的经常面临恶意攻击者的威胁,对应的防护措施也是非常重要的。除了register_globals,Web应用程序面临的安全隐患还有很多,如跨站点脚本攻击、SQL注入,文件包含等等。为了保证Web应用程序的安全性,在编写代码时必须遵循正确的编码实践和安全准则,采用静态数据验证和可扩展的身份验证方案。在获得更多关于安全查询的信息和在保护你的应用程序时采取更好的步骤时,可以参考OWASP,这是一个Web应用程序安全资源的美国非营利组织。最终,让我们避免使用register_globals,使用最新的技术和最佳实践,确保我们的程序数据的安全性。