wecenter学习笔记-表单防CSRF的实现

字数 142阅读 217

该文是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→ 上传图片并生成缩略图

推荐阅读更多精彩内容