如何通过HTML a标签传递POST参数防止galleryId被篡改?
如何防止用户篡改URL中的galleryId参数?
首先直接给你答案:HTML的<a>标签没办法直接发送POST请求,它默认触发的是GET请求,所以没法通过它直接传递POST参数。不过有几种靠谱的方案能解决你的问题——既要让用户能看到galleryId,又要防止篡改,同时保证访问安全:
方案1:用表单模拟POST请求(伪装成链接)
你可以做一个隐藏的表单,把galleryId放在隐藏字段里,然后用样式把提交按钮改成和原来的链接一模一样,用户点击时就会发送POST请求,参数不会暴露在URL里。示例代码如下:
<form action="index.php" method="POST" style="display: inline;"> <input type="hidden" name="galleryId" value="<?php echo $gallery[0]; ?>"> <input type="hidden" name="id" value="gallery"> <!-- 把按钮样式改成和list-group-item一致,用户看起来和点链接没区别 --> <button type="submit" class="list-group-item active" style="border: none; background: transparent; padding: inherit; text-align: left; cursor: pointer;"> <h4 class='list-group-item-heading'><?php echo $gallery[2]; ?></h4> <p class='list-group-item-text'><?php echo $gallery[3]; ?></p> </button> </form>
这样用户看不到URL里的参数,自然没法直接篡改,体验上和原来的链接也差不多。
方案2:对galleryId做签名验证(保留GET请求)
如果你还是想保留GET的方式,可以给galleryId加个签名。具体做法是:
- 后端用一个只有你知道的密钥,对galleryId生成HMAC签名,比如:
$galleryId = $gallery[0]; $secretKey = "你的专属密钥,别泄露!"; $signature = hash_hmac('sha256', $galleryId, $secretKey); - 把galleryId和签名一起放到URL里:
<a class='list-group-item active' href='index.php?galleryId=<?php echo $galleryId; ?>&signature=<?php echo $signature; ?>&id=gallery'> <h4 class='list-group-item-heading'><?php echo $gallery[2]; ?></h4> <p class='list-group-item-text'><?php echo $gallery[3]; ?></p> </a> - 后端接收请求时,重新计算签名,和URL里的签名对比。如果不一致,说明参数被篡改了,直接拒绝访问。
这种方式用户能看到galleryId,但没法随便改——因为不知道你的密钥,改了之后签名就对不上了。
方案3:后端强制做权限验证(重中之重!)
不管你用上面哪种方案,后端的权限检查绝对不能少。哪怕参数没被篡改,也要确认当前登录的用户确实有权限访问这个galleryId对应的相册。比如通过session获取用户ID,然后查询数据库,看看这个用户和相册的关联关系。毕竟前端的任何防护都能被绕过,后端验证才是最后一道防线。
另外提个小提醒:如果用POST方案,记得加CSRF令牌防护,比如在表单里加一个从session生成的随机隐藏字段,后端验证这个字段,防止跨站请求伪造。
内容的提问来源于stack exchange,提问作者Noë Perracini
相关产品推荐
相关产品推荐

