我有一个用php(PDO)和MySQL编写的简单联系人数据库应用程序。它是一个带有switch case语句的单个文件。默认显示联系人表,大小写:添加,编辑,删除等功能。所有MySQL语句都是PDO中的预处理语句。
我的问题是: 使用带参数的html链接移动是否更好?或者使用带有参数作为隐藏字段的POST表单更好。
e.g。在列出联系人的表格中,每行内最好有一个链接:
<a href="?mode=edit&contact_id=321">edit</a>
并获取交换机的'mode'和$ _GET语句中的参数
或者是否更好:
<form method="POST" action="">
<input type="hidden" name="mode" value="edit"/>
<input type="hidden" name="contact_id" value="321" />
<input type="submit" name="submit" value="edit" />
</form>
我感兴趣的是从安全的角度以及功能的角度来看。我在这里找了类似的问题,发现只有一个答案说一个表格更好。它没有任何解释和4个赞成。
任何信息都将不胜感激。 欢呼声。
答案 0 :(得分:1)
与表单一起使用肯定更好。为什么?好吧,网址导航将通过 GET
请求提交,而<form>
提交则通过 POST
处理。 GET
个请求 exposed to the end-user ,而POST
请求则不是。{strong> go ahead 。正如TeamTreeHouse在上一个链接中所述:
处理敏感数据时使用POST。
考虑一下你以前的做法。用户看到index.php?mode=edit&contact_id=321
出现在他们的浏览器中。如果它们是恶意的,他们很容易就能与index.php?mode=edit&contact_id=1
建立关联。他们可以在浏览器中轻松输入。假设您没有设置任何其他身份验证机制,他们就可以 browser addons 并修改其他人的帐户。
后者稍微更好。虽然源代码不像公开的URL那么明显,但任何人仍然可以查看它,并找到隐藏的321
联系人。您可能认为恶意用户无法使用查询字符串编辑 hidden
表单字段,但事实并非如此。他们可以下载并创建自己的副本,只需用您自己的action
参数替换,从而提交篡改数据。甚至还有 authentication token ,让它变得更加容易!
要解决此问题,您需要将<form>
方法与here结合起来。生成用于验证表单完整性的标记,确保在生成表单后不会对其进行操作。这取决于您在后端使用哪种语言来确定如何生成令牌,但对于JSON网络令牌 OWASP's article 来说,这是一篇很棒的文章。
提交表单后,检查令牌是否与生成时的令牌相匹配。如果它匹配,一切都很好,所以你继续。如果它没有,表单已经被操纵,所以你拒绝提交。
有关详细信息,建议您查看跨站请求伪造的 {{3}} 。
希望这有帮助! :)