PHP编程函数安全篇
关于脚本安全的话题似乎永无止境,特别是当我们经常关注国外的bugtraq时,会发现有一半以上的议题都与脚本安全相关。诸如SQL注入、XSS、路径泄露、远程命令执行等词汇频繁出现,难道我们仅仅是为了寻找潜在的目标而关注这些吗?
对于致力于Web安全的我们,最好的学习方式就是深入研究。我们需要的不仅仅是鱼,而是捕鱼的方法。在国内,各种PHP程序如雨后春笋般涌现,但大多数人的关注点只集中在知名CMS、论坛和博客程序上,很少关注那些不太出名的程序的安全检测。对于越来越多的PHP程序员和站长来说,除了依赖服务器的安全设置外,他们也需要了解PHP程序本身的安全问题。
有人说做PHP安全就是搞注入和跨站等,这其实是大错特错。如果仅关注这些,那么一些简单的安全设置如magic_quotes_gpc就能让我们束手无策。今天我要分享的不是注入和跨站,而是存在于PHP程序中的一些安全细节问题。
注意一些函数的过滤与检测。在程序中,一些函数如include()、require()、fopen()、fwrite()、readfile()、unlink()、eval()以及它们的变体函数等是非常实用的,但实用并不代表可以掉以轻心。
1. include()、require()和fopen(),以及它们的变体include_once()、require_once()可以远程调用文件。如果变量过滤不当,就可能被恶意利用。例如,在某些情况下,攻击者可以包含任意文件并执行其中的代码。除了依赖phpi设置来禁止远程文件操作外,还需要事先声明可包含的文件范围。
2. 函数如fopen()、file()、readfile()等也需特别留意。这些函数本身没有问题,但如果变量过滤不彻底,就可能泄露源代码。例如,在某些旧版论坛中,对文件的打开操作如果没有正确过滤变量,就可能导致源代码泄露。
3. fwrite()及其变体函数也存在类似漏洞。如果用户提交的字符没有过滤,写入PHP后门是可能的。
4. unlink()函数曾被用于删除任意文件。如果判断删除的变量没有过滤,攻击者就可以指定任意文件进行删除。
5. eval()和preg_replace()函数可以执行PHP代码。如果字符串没有过滤,就可能被用来执行恶意代码。
6. 对于system()等系统函数,虽然可以在phpi中禁止,但在某些程序中仍需要用到。对于popen()、proc_open()、proc_close()等函数也需要特别注意。尽管它们执行命令后没有直接输出,但黑客可能会利用它们执行其他操作。
为了确保PHP程序的安全,除了依赖服务器的安全设置外,还需要关注PHP程序本身的安全细节,对函数的使用进行严格的过滤和检测。在PHP世界中,安全性是一个不可忽视的话题。特别是当涉及到系统函数调用的时刻,更要谨慎行事。为了对抗可能的攻击,PHP提供了两个重要的函数:escapeshellarg()和escapeshellcmd()。这两个函数如同一道坚固的防线,旨在保护我们的应用程序免受潜在的风险。
想象一下这样一个场景,你正在维护一个论坛的后端代码,其中有一个名为prod.php的文件。在这段代码中,有一个变量$doubleApp,它是基于输入的$argv[1]来设置的。然后,这段代码会检查这个变量是否存在,如果存在的话,就会使用系统函数system来创建一个目录。问题在于,这段代码似乎只关心变量是否存在,却忽视了对其进行必要的过滤和验证。这就为潜在的攻击敞开了大门。
攻击者可能会尝试利用这一漏洞,通过在URL参数中注入恶意命令来操纵你的系统。例如,通过输入像这样的URL:/prod.php?argv[1]=|ls%20-la 或者 /prod.php?argv[1]=|cat%20/etc/passwd。这里的管道符号(|)在UNIX系统中是一个特殊的参数符号,它允许执行多条命令。如果攻击者的命令被执行,那么你的系统可能会面临严重的风险。
这就是escapeshellarg()和escapeshellcmd()这两个函数发挥作用的地方。它们能确保任何通过命令行传递给系统函数的参数都得到适当的处理和转义,从而避免潜在的攻击。但仅仅依赖服务器端的设置是不够的。后台程序也需要密切关注这一点。虽然针对某些站点的服务器设置可能有所帮助,但在涉及到数据库操作等复杂场景时,就需要更为精细的控制和严格的验证机制了。为了您的网站安全和数据安全,使用这些函数并进行全面的安全审查至关重要。因为一个小小的疏忽可能导致严重的后果。安全第一,预防为主!
编程语言
- PHP编程函数安全篇
- 微信小程序 网络API Websocket详解
- javascript实现画不相交的圆
- javascript浏览器窗口之间传递数据的方法
- 兼容Firefox的Javascript XSLT 处理XML文件
- 重装win10系统超详细的图文教程(适用所有windows系
- mysql 查看当前使用的配置文件my.cnf的方法(推荐
- asp.net core 获取 MacAddress 地址方法示例
- PHP实现的线索二叉树及二叉树遍历方法详解
- jQuery表单选择器用法详解
- jQuery提示插件alertify使用指南
- Thinkphp中的curd应用实用要点
- js动态添加的DIV中的onclick事件简单实例
- php通过前序遍历树实现无需递归的无限极分类
- Thinkphp5框架实现获取数据库数据到视图的方法
- PHP通过调用新浪API生成t.cn格式短网址链接的方法