假设我有一个用户可以编辑个人资料的网站。
<form action="profile-processor.php?action=edit&id=888" method="POST">
<input type="text" name="name"/>
<input type="submit"/>
</form>
profile-processor.php包含:
if(!empty($_GET["action"])) {
if($_GET["action"] == "edit") {
$query = "UPDATE TABLE users SET name = ".$_POST["name"]." WHERE id = ".$_GET["id"];
... ... ...
}
}
如果与此Web应用程序无关的人创建HTML表单,并且在操作中他将“profile-processor.php?action = edit&amp; id = xx”并发送数据,该怎么办?它会编辑,就好像它是从它自己的网站发送的那样吗?
你可以做些什么来隐藏行动或至少是关键细节,如
<form action="process.php?action=SOMETHING_I_DONT_WANT_YOU_TO_SEE&id=THE_ID_YOU_SHOULD_NOT_KNOW">
</form>
我正在创建一个Web应用程序,它有很多可以编辑数据库信息的表单,我只是想确保我有一些关键的安全性。
修改:::::::
我知道如何完美地使用PDO和Prepared Statements,这个问题更多的是关于向服务器端控制器发送信息的客户端内容。
答案 0 :(得分:1)
我找到的最好的方法是使用会话变量,为每个用户创建一个随机令牌,并验证用户是否真的在
中。另一种方法是生成随机代码并将其发送到隐藏字段
<form action="profile-processor.php?action=edit&id=888">
<input type="text" name="name"/>
<input type="submit"/>
<input type="hidden" name="token" value="{generate random number here}" />
</form>
然后验证令牌是否真的存在于process.php
中答案 1 :(得分:1)
首先,如果您的用户正在编辑他的个人资料,那么他已登录,对吧?那你为什么要允许id传入呢?您已经知道用户ID,最有可能来自会话。此示例中表单中您需要的唯一数据是要更新的信息。
其次,您发布的查询易受SQL注入攻击。关于SO的问题很多,以说明如何解决这个问题。
最后,为了解决其他问题,虽然在修改内容时应该使用POST数据,但它绝不比GET更安全。
答案 2 :(得分:0)
使用POST方法代替GET