在 emlog 模板开发中,正确处理用户输入是保证网站安全的关键。很多开发者习惯直接使用 $_GET 和 $_POST 来获取数据,这种做法存在严重的安全隐患。
为什么模板中必须使用 Input 类?
直接使用超全局变量的风险:
// ❌ 危险做法 - 可能导致 SQL 注入或 XSS 攻击
$keyword = $_GET['keyword'];
$comment = $_POST['content'];
在模板中,我们经常需要获取 URL 参数、处理搜索表单、接收用户评论等。如果不进行安全过滤,恶意用户可能通过输入特殊字符来攻击你的网站。
模板中的常用场景
1. 搜索功能处理
<?php
// 安全获取搜索关键词
$keyword = Input::getStrVar('keyword', '');
$search_type = Input::getStrVar('type', 'article');
// 在模板中使用
if (!empty($keyword)) {
echo "搜索关键词:{$keyword}";
echo "搜索类型:{$search_type}";
}
?>
2. 分页参数处理
<?php
// 安全获取分页参数
$page = Input::getIntVar('page', 1);
$per_page = Input::getIntVar('per_page', 10);
// 确保参数有效
$page = max(1, $page); // 页码最小为1
$per_page = max(1, min($per_page, 50)); // 每页数量限制在1-50之间
?>
3. 文章列表筛选
<?php
// 获取分类和标签筛选参数
$category_id = Input::getIntVar('category', 0);
$tag_id = Input::getIntVar('tag', 0);
$sort_by = Input::getStrVar('sort', 'newest');
// 构建查询条件
$where = [];
if ($category_id > 0) {
$where['category'] = $category_id;
}
if ($tag_id > 0) {
$where['tag'] = $tag_id;
}
?>
4. 评论表单处理
<?php
// 处理评论提交
if ($_POST) {
$comment_content = Input::postStrVar('comment', '');
$author_name = Input::postStrVar('author', '匿名用户');
$author_email = Input::postStrVar('email', '');
// 简单的内容验证
if (empty(trim($comment_content))) {
$error = '评论内容不能为空';
} else {
// 安全地处理评论数据
// ... 保存评论逻辑
}
}
?>
实际模板示例
搜索框模板片段
<!-- 搜索表单 -->
<form action="<?php echo BLOG_URL; ?>index.php" method="get">
<input type="hidden" name="action" value="search">
<input type="text" name="keyword" value="<?php echo Input::getStrVar('keyword', ''); ?>" placeholder="输入搜索关键词">
<button type="submit">搜索</button>
</form>
<!-- 显示搜索结果 -->
<?php if (Input::getStrVar('action') == 'search'): ?>
<?php
$keyword = Input::getStrVar('keyword', '');
if (!empty($keyword)) {
// 执行搜索并显示结果
echo "正在搜索:{$keyword}";
// ... 显示搜索结果逻辑
}
?>
<?php endif; ?>
分页链接生成
<?php
// 获取当前参数并保持在其他分页链接中
$current_params = [
'category' => Input::getIntVar('category', 0),
'tag' => Input::getIntVar('tag', 0),
'keyword' => Input::getStrVar('keyword', '')
];
// 生成分页链接
function generate_page_url($page) {
global $current_params;
$params = http_build_query(array_merge($current_params, ['page' => $page]));
return BLOG_URL . 'index.php?' . $params;
}
?>
重要提醒
-
始终使用 Input 类:在模板中获取用户输入时,永远不要直接使用
$_GET或$_POST -
设置合理的默认值:确保即使参数不存在,代码也能正常工作
-
模板中的简单验证:虽然 Input 类提供了基础安全过滤,但重要的业务逻辑验证应该在插件或核心中处理
-
保持简洁:模板中的代码应该尽量简单,复杂的逻辑应该封装到函数或类中
记住,安全是一个持续的过程。在 emlog 模板开发中,养成使用 Input 类的习惯,是构建安全网站的第一步。
安全提示:即使是模板文件,也可能被直接访问。确保所有用户输入都经过 Input 类处理,不要信任任何来自用户的数据。

评论框