php编程中,难免会遇到对数据进行加密与解密的情况,最常用的莫过于加密与加密cookie数据了。
php加密与解密代码:
<?php
// 加密数据并写到cookie里
$cookie_data = $this -> encrypt("nowamagic", $data);
$cookie = array(
'name' => '$data',
'value' => $cookie_data,
'expire' => $user_expire,
'domain' => '',
'path' => '/',
'prefix' => ''
);
$this->input->set_cookie($cookie);
// 加密
public function encrypt($key, $plain_text) {
$plain_text = trim($plain_text);
$iv = substr(md5($key), 0,mcrypt_get_iv_size (MCRYPT_CAST_256,MCRYPT_MODE_CFB));
$c_t = mcrypt_cfb (MCRYPT_CAST_256, $key, $plain_text, MCRYPT_ENCRYPT, $iv);
return trim(chop(base64_encode($c_t)));
} //edit www. 2013/6/7
//解密
if( isset()($_COOKIE['data']) )
{
//用cookie给session赋值
$_SESSION['data'] = decrypt("nowamagic", $_COOKIE['data']);
}
//解决函数
function decrypt($key, $c_t) {
$c_t = trim(chop(base64_decode($c_t)));
$iv = substr(md5($key), 0,mcrypt_get_iv_size (MCRYPT_CAST_256,MCRYPT_MODE_CFB));
$p_t = mcrypt_cfb (MCRYPT_CAST_256, $key, $c_t, MCRYPT_DECRYPT, $iv);
return trim(chop($p_t));
}
?>
php编译过程中的安全知识。
1,建议安装Suhosin补丁,必装安全补丁。
php.ini安全设置
magic_quotes_gpc = off
display_error = off
log_error = on
# allow_url_fopen = off
expose_php = off
open_basedir =
safe_mode = on
disable_function = exec,system,passthru,shell_exec,escapeshellarg,escapeshellcmd,proc_close,proc_open,dl,popen,show_source,get_cfg_var
safe_mode_include_dir =
2,DB SQL预处理
mysql_real_escape_string (很多PHPer仍在依靠addslashes()防止SQL注入,但是这种方式对中文编码仍然是有问题的。addslashes的问题在于黑客可以用 0xbf27来代替单引号,GBK编码中0xbf27不是一个合法字符,因此addslashes只是将0xbf5c27,成为一个有效的多字节字符,0xbf5c仍会被看作是单引号)。
用mysql_real_escape_string函数也需要指定正确的字符集,否则还可能存在问题的。
prepare + execute(PDO)
ZendFramework可以用DB类的quote或者quoteInto, 这两个方法是根据各种数据库实施不用方法的,不会像mysql_real_escape_string只能用于mysql。
3,用户输入的处理
无需保留HTML标签的可以用以下方法
strip_tags(), 删除string中所有html标签
htmlspecialchars(),只对”<”,”>”,”;”,”'”字符进行转义
htmlentities,对所有html进行转义
必须保留HTML标签情况下可以考虑以下工具:
PHP HTML Sanitizer: Remove unsafe tags and attributes from HTML code
htmLawed: PHP code to purify & filter HTML
4,上传文件
用is_uploaded_file和move_uploaded_file函数,使用HTTP_POST_FILES[]数组。并通过去掉上传目录的PHP解释功能来防止用户上传php脚本。
ZF框架下可以考虑使用File_upload模块
Session,Cookie和Form的安全处理
不要依赖Cookie进行核心验证,重要信息需要加密, Form Post之前对传输数据进行哈希。
例如发出去的form元素如下:
POST回来之后对参数进行验证
$str = "";
foreach($_POST['H'] as $key=>$value) {
$str .= $key.$value;
}
if($_POST['hash'] != md5($str.$secret)) {
echo "Hidden form data modified"; exit;
}
5,PHP安全检测工具(XSS和SQL Insertion)
Wapiti - Web application security auditor(Wapiti - 小巧的站点漏洞检测工具) (SQL injection/XSS攻击检查工具)
6,安裝/使用方法:
python wapiti.py http://Your Website URL/ -m GET_XSS
Pixy: XSS and SQLI Scanner for PHP( Pixy - PHP 源码缺陷分析工具)
安裝: apt-get install default-jdk
就介绍这些吧,如果上面介绍的这些安全措施,你都能完全做到的话,你的php代码已经是非常安全了。
php调用时间格式的参数详解。
1、调用语法
使用函式date() 实现获取当前的时间格式,例如:
2、时间格式参数设定
上面语法中”Y-m-d H:i:s”,显示的格式为: 年-月-日 小时:分钟:秒
只要获取对应的相关时间参数就可以替换出自己想要的时间格式了!
附,php时间格式的参数说明。
A – “AM” 或是 “PM”
d – 几日,二位数字,若不足二位则前面补零; 如: “01″ 至 “31″
D – 星期几,三个英文字母; 如: “Fri”
F – 月份,英文全名; 如: “January”
h – 12 小时制的小时; 如: “01″ 至 “12″
H – 24 小时制的小时; 如: “00″ 至 “23″
g – 12 小时制的小时,不足二位不补零; 如: “1″ 至 12″
G – 24 小时制的小时,不足二位不补零; 如: “0″ 至 “23″
i – 分钟; 如: “00″ 至 “59″
j – 几日,二位数字,若不足二位不补零; 如: “1″ 至 “31″
l – 星期几,英文全名; 如: “Friday”
m – 月份,二位数字,若不足二位则在前面补零; 如: “01″ 至 “12″
n – 月份,二位数字,若不足二位则不补零; 如: “1″ 至 “12″
M – 月份,三个英文字母; 如: “Jan”
s – 秒; 如: “00″ 至 “59″
S – 字尾加英文序数,二个英文字母; 如: “th”,”nd”
t – 指定月份的天数; 如: “28″ 至 “31″
U – 总秒数
w – 数字型的星期几,如: “0″ (星期日) 至 “6″ (星期六)
Y – 年,四位数字; 如: “1999″
y – 年,二位数字; 如: “99″
z – 一年中的第几天; 如: “0″ 至 “365″