1. 输入输出安全 (1)关闭 register_global 选项(php4及以前),初始化所有变量,能防止调用未定义变量notice错误,也能够防范一些hacker行为 (2)接收任何变量的时候,务必记住:所有用户输入都是不安全的!如果确定用户输入数据是整数(比如ID之类),可以使用(int)或intval()函数强制类型转换,如果是字符串类型,使用 addslashes 或 mysql_escape_string(如果考虑数据库编码请连接数据库后使用mysql_real_escape_string更安全,针对GBK等编码,使用该函数能够防范目前很多GBK编码爆出的注入漏洞)注1 (3)输出数据的时候,如果害怕html,可以使用strip_tags全部过滤,或者使用 htmlspecialchars 进行html标签转义保证输出到页面不会构成威胁,另外,最好输入或者输出的时候过滤所有的<script><iframe><object>等标记和内容,有时候<style>或作为属性的style也最好过滤一下 注1:问题来自多字节编码。例如在GBK里,0xbf27并不是一个合法的双字节字符,因此addslash()会把它转义成0xbf5c27,碰巧0xbf5c是一个合法的双字节字符,由此可以注入一个0×27 (‘)。addslash()和mysql_escape_string无药可救。mysql_real_escape_string()可以根据字符集正确地转义,但是需要在建立数据库联接的时候指明”SET CHARACTER SET ‘GBK’”。 2. php系统安全 (1)打开 safe_mode 是最重要的,同时设置 open_basedir, safe_mode_include_dir,safe_mode_exec_dir 等选项 (2)当要操作或者包含文件的时候,使用realpath 和 basename 检查文件是否是本地文件 (3)如果很多危险函数如果不使用,建议关闭,关闭函数修改disbale_functions选项,比如很多命令执行函数、eval、phpinfo 等函数 (4)如果不需要上传文件功能可以关闭,如果需要记得设置 post_max_size 选项为你合适的大小,否则文件系统很容易被塞满,并且move_uploaded_file来操作上传的文件,而且不是使用copy (5)把库文件(.inc)和数据文件(数据信息,配置信息,sqlite数据库等)不要与web目录放在一起,防止被下载 3.小议urldecode等函数的安全使用 urldecode函数在很多程序中是经常使用的,对用户提交的某些字符进行URL解码,防止一些字符截断之类的问题出现,但是如果使用不当可能会出现一些安全问题,举两个例子 1,泄露绝对路径 这个问题比较典型了,但是需要PHP的错误回显打开才行。看这段小代码 1 2 3 4 5 6 7 8 9 10 11 <?php $ name[] = "abc"; echo […]
web系统架构
转载请注明:爱开源 » php安全方面的要点