留言板php
去年帮朋友改一个老旧的留言板,代码翻出来一看,数据库连接那行写着 留言板这种项目,很多人拿来练手。功能简单:用户填个名字、写段话、点提交,数据进库,页面刷新就能看到。但恰恰因为简单,大部分人写完能跑就扔了,根本不管后面的事。我见过一个留言板,所有留言直接 PHP 处理留言板,核心其实就三件事:存进去、取出来、显示出来。存的时候用预处理语句, 但实际写起来,坑远不止这些。比如分页。留言一多,你不能全查出来往页面上一坨扔。有人写 还有个细节:时间戳。很多人存 表单那块也有讲究。 我自己的习惯是,留言板至少加两层防护。第一层,表单提交时带一个隐藏的 token,服务端校验,防止 CSRF。第二层,对留言内容做长度限制,比如 最后说个真实案例。有个小论坛的留言板,被人用脚本批量灌了几万条广告。站长后来查日志,发现攻击者根本没绕什么弯子,就是直接 POST 到提交接口,每次换个 IP。mysql_connect("localhost", "root", "123456")。密码明文,连个错误抑制符都没加。这玩意儿居然在线上跑了三年,没被拖库算他运气好。echo 出来,连 htmlspecialchars() 都不套。结果有人留言写了一段 <script>alert(1)</script>,页面每次加载都弹窗。这还只是恶作剧,要是换成窃取 cookie 的脚本,站长自己怎么死的都不知道。PDO 或者 mysqli 都行,别再用 mysql_* 那套老函数了,PHP 7 以后直接删了。取的时候加个 ORDER BY id DESC,最新的留言排前面。显示的时候,所有用户输入的内容必须过一遍 htmlspecialchars($content, ENT_QUOTES, 'UTF-8')。这三步做到位,基本的安全底线就有了。SELECT * FROM messages,然后 PHP 里 array_slice 切一刀。数据量小的时候看不出问题,上千条留言之后,页面加载直接卡成狗。正确做法是 SQL 里带 LIMIT 和 OFFSET,让数据库只返回当前页需要的那几条。顺便说一句,OFFSET 在数据量特别大的时候也会变慢,因为数据库得先扫过前面所有行。更优的方案是用 WHERE id < ? 配合游标分页,不过留言板这种场景,一般用不上这么讲究。time() 返回的 Unix 时间戳,显示的时候用 date() 格式化。这本身没问题,但时区容易翻车。PHP 默认时区可能是 UTC,你存的时候没感觉,显示出来比北京时间少了八小时。有人留言说“刚发的”,页面上显示三小时前,用户直接懵了。要么在 php.ini 里设 date.timezone = Asia/Shanghai,要么在代码里 date_default_timezone_set('Asia/Shanghai')。别偷懒,这行代码省不得。<form> 的 action 属性,有人直接写当前文件名,有人写 $_SERVER['PHP_SELF']。后者其实有 XSS 风险,如果 URL 里带了恶意路径,可能被注入。稳妥点,直接写死文件名,或者留空让表单提交到自身。另外,提交按钮最好加个 disabled 状态,防止用户狂点导致重复插入。前端用 JS 控制一下,或者后端在插入前查一下最近几秒有没有相同 IP 的相同内容。虽然有点糙,但比什么都不做强。mb_strlen($content, 'UTF-8') > 500 就拒绝。别指望前端 maxlength,那玩意儿用开发者工具一删就没了。后端不卡死,数据库里迟早塞满垃圾。php.ini 里 post_max_size 设了 8M,攻击者每次就传几十个字节,完全不受影响。后来加了验证码和频率限制才消停。留言板这东西,功能越简单,越容易被人盯上。写完能跑只是起点,能扛住乱搞才算及格。
-
上一篇
-
下一篇
- 随机阅读
- 搜索
-
- 友情链接
-