【PHP安全几则tips】
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是一个合法的双字节字符,由此可以注入一个0x27 (')。addslash()和mysql_escape_string无药可救。mysql_real_escape_string()可以根据字符集正确地转义,但是需要在建立数据库联接的时候指明“SET CHARACTER SET 'GBK'”。
2. php系统安全
(1)打开 safe_mode 是最重要的,同时设置 open_ba sedir, 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目录放在一起,防止被下载
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是一个合法的双字节字符,由此可以注入一个0x27 (')。addslash()和mysql_escape_string无药可救。mysql_real_escape_string()可以根据字符集正确地转义,但是需要在建立数据库联接的时候指明“SET CHARACTER SET 'GBK'”。
2. php系统安全
(1)打开 safe_mode 是最重要的,同时设置 open_ba sedir, 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目录放在一起,防止被下载
小议urldecode等函数的安全使用
urldecode函数在很多程序中是经常使用的,对用户提交的某些字符进行URL解码,防止一些字符截断之类的问题出现