表单、搜索与会员
留言表单、搜索框、会员登录状态,以及防刷与验证码。
留言表单
<form method="post" action="{naicha:url type="message"}" data-guard="1">
<input type="hidden" name="_token" value="{naicha:token}">
<input type="hidden" name="form" value="contact">
<!-- 蜜罐:正常人不会填这一栏,填了就判定为机器人 -->
<div style="position:absolute;left:-9999px">
<input type="text" name="website" tabindex="-1" autocomplete="off">
</div>
<input type="text" name="name" required>
<textarea name="content" required></textarea>
<button type="submit">提交</button>
</form>
三个要点:
_token是 CSRF 令牌,缺了会被直接拒绝website是蜜罐字段,用 CSS 藏起来而不是type="hidden"—— 隐藏域会被机器人识破data-guard="1"让前端脚本做提交频率限制
搜索
<form method="get" action="{naicha:url type="search"}">
<input type="text" name="kw" value="{naicha:search}">
<button>搜索</button>
</form>
搜索结果页用 {naicha:param name="kw"} 取关键词,用 {naicha:list keyword="..."} 取结果。
会员状态
{naicha:user}
{naicha:if var="user.logged" eq="1"}
<span>你好,{user.nickname}</span>
<a href="{naicha:url type="user"}/logout">退出</a>
{naicha:else}
<a href="{naicha:url type="user"}/login">登录</a>
{/naicha:if}
{/naicha:user}
防刷机制
| 机制 | 作用 |
|---|---|
| CSRF 令牌 | 阻止第三方站点伪造你的身份提交 |
| 蜜罐字段 | 拦掉大部分表单机器人 |
| 提交间隔限制 | 同一来源的两次提交之间强制间隔 |
| 登录失败限流 | 15 分钟内失败 5 次即临时锁定该账号 + IP |
| 图形验证码 | 可在设置里开启,进一步抬高自动化成本 |