PHP表单-使表单在编辑数据时更加安全


PHP Forms - Make forms more secure when editing data

假设我有一个网站,用户可以在其中编辑他的个人资料。

<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表单,并在操作中放入"profileprocessor.php?action=edit&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,这个问题更多的是关于客户端向服务器端控制器发送信息的问题。

我发现的最好的方法是使用会话变量,为每个用户创建一个随机令牌,并验证用户是否在中真实登录

另一种方法是生成一个随机代码并在隐藏字段上发送

<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 中

首先,如果您的用户正在编辑他的配置文件,那么他就登录了,对吗?那么,你为什么要允许id传入呢?您已经知道用户id,很可能是从会话中知道的。在本例中,表单中唯一需要的数据是要更新的信息。

其次,您发布的查询容易受到SQL注入的攻击。SO上有很多问题需要说明如何解决。

最后,为了解决其他问题,虽然在修改某个内容时应该使用POST数据,但它绝不比GET更安全。

使用POST方法而不是GET