WordPress插件页面中密码存储的最优加密实现方案
解决方案
你可以通过register_setting的sanitize_callback参数实现存储前加密,这个回调会在WordPress将选项存入数据库前触发,用来处理/校验提交的所有字段。
具体实现步骤
- 第一步:修改设置注册代码,添加清理回调
add_action('admin_init', 'MY_register_settings'); function MY_register_settings() { register_setting( 'MY_settings', 'MY_settings', [ 'sanitize_callback' => 'MY_sanitize_plugin_settings', // 新增清理回调 'default' => [] ] ); }
- 第二步:编写回调函数处理密码加密
回调逻辑优先读取已存储的旧设置,避免用户未修改密码时覆盖原有哈希值,只有当用户提交了非空的新密码时才执行加密:
function MY_sanitize_plugin_settings($input) { // 获取已存储的旧配置 $old_settings = get_option('MY_settings', []); // 初始化待存储的配置 $sanitized = []; // 其他配置字段处理逻辑(如果有额外设置项可在此处添加校验规则) // ... // 处理密码字段 if (!empty($input['password'])) { // 用户提交了新密码,执行加密 $sanitized['password'] = password_hash($input['password'], PASSWORD_DEFAULT); } else { // 用户未输入新密码,保留原有加密后的密码 $sanitized['password'] = $old_settings['password'] ?? ''; } return $sanitized; }
后续密码校验说明
如果后续需要验证用户输入的密码是否正确,直接用password_verify函数比对即可:
// 密码校验示例 $saved_password_hash = get_option('MY_settings')['password'] ?? ''; $user_input_password = '用户输入的明文密码'; if (password_verify($user_input_password, $saved_password_hash)) { // 密码验证通过逻辑 }
内容的提问来源于stack exchange,提问作者Bukpulp
相关产品推荐
相关产品推荐

