该文是wecenter学习笔记的一部分
表单防CSRF(Cross-site request forgery)的实现
CSRF全称Cross-site request forgery
- 在生成的表单中插入csrf key隐藏字段
<input type="hidden" name="post_hash" value="<?php echo new_post_hash(); ?>" />
system/functions.inc.php
function new_post_hash()
{
if (! AWS_APP::session()->client_info)
{
return false;
}
return AWS_APP::form()->new_post_hash();
}
system/core/form.php
public function __construct()
{
$this->csrf_key = md5(G_COOKIE_HASH_KEY . $_SERVER['HTTP_USER_AGENT'] . AWS_APP::user()->get_info('uid') . session_id());
}
public function new_post_hash()
{
return $this->csrf_key;
}
可见,假如session有效,所有表单请求csrf_key都是相同的,因而不需要考虑csrf_key的存储和清理问题,是一个很取巧的方法。
- 在表单处理的action里验证csrf key
if (!valid_post_hash($_POST['post_hash']))
{
H::ajax_json_output(AWS_APP::RSM(null, '-1', AWS_APP::lang()->_t('页面停留时间过长,或内容已提交,请刷新页面')));
}
system/functions.inc.php
function valid_post_hash($hash)
{
return AWS_APP::form()->valid_post_hash($hash);
}
system/core/form.php
public function valid_post_hash($post_hash)
{
if ($post_hash == $this->csrf_key)
{
return TRUE;
}
return FALSE;
}
分页组件的实现 ←o→ 上传图片并生成缩略图