如何在Adminer中限制用户仅修改特定条件的数据行
实现Adminer行级数据修改限制
你可以通过在Adminer自定义扩展类中添加专用函数,结合已有的表限制逻辑,实现仅允许用户修改符合特定条件的数据行,具体方案如下:
1. 限制可见数据行(仅展示符合条件的内容)
添加selectQuery函数,在查询目标表时自动追加WHERE条件,确保用户只能看到branch_id=10的数据:
function selectQuery($query, $start, $limit, $order) { global $TABLE_NAME; // 仅对目标表生效 if (stripos($query, "FROM `$TABLE_NAME`") !== false) { $condition = " branch_id = 10"; // 原查询无WHERE子句则直接添加,有则追加AND条件 if (stripos($query, "WHERE") === false) { $query .= " WHERE" . $condition; } else { $query .= " AND" . $condition; } } return parent::selectQuery($query, $start, $limit, $order); }
2. 拦截修改/删除操作(防止越权操作)
添加editQuery和deleteQuery函数,强制在修改、删除请求中追加条件,确保用户只能操作branch_id=10的行:
function editQuery($table, $id, $values, $update) { global $TABLE_NAME; if ($table === $TABLE_NAME) { $update .= " AND branch_id = 10"; } return parent::editQuery($table, $id, $values, $update); } function deleteQuery($table, $id) { global $TABLE_NAME; if ($table === $TABLE_NAME) { $query = parent::deleteQuery($table, $id); $query .= " AND branch_id = 10"; return $query; } return parent::deleteQuery($table, $id); }
3. 完整自定义类示例
将上述函数与你已有的tableName函数整合到同一个Adminer扩展类中:
class AdminerCustom extends Adminer { function tableName($tableStatus) { global $TABLE_NAME; if($tableStatus['Name']==$TABLE_NAME) return $TABLE_NAME; } function selectQuery($query, $start, $limit, $order) { global $TABLE_NAME; if (stripos($query, "FROM `$TABLE_NAME`") !== false) { $condition = " branch_id = 10"; if (stripos($query, "WHERE") === false) { $query .= " WHERE" . $condition; } else { $query .= " AND" . $condition; } } return parent::selectQuery($query, $start, $limit, $order); } function editQuery($table, $id, $values, $update) { global $TABLE_NAME; if ($table === $TABLE_NAME) { $update .= " AND branch_id = 10"; } return parent::editQuery($table, $id, $values, $update); } function deleteQuery($table, $id) { global $TABLE_NAME; if ($table === $TABLE_NAME) { $query = parent::deleteQuery($table, $id); $query .= " AND branch_id = 10"; return $query; } return parent::deleteQuery($table, $id); } }
注意事项
- 确保全局变量
$TABLE_NAME已正确定义为目标表名 - 若
branch_id为字符串类型,需将10修改为'10' - 该方案既限制了界面可见内容,又拦截了底层SQL请求,避免用户通过构造请求越权操作
内容的提问来源于stack exchange,提问作者zvi
相关产品推荐
相关产品推荐

