处理POST操作的最安全方式


safest way to process POST actions

这是我目前处理POST提交操作的方式:

<form action="process.php" method="post">
//several form fields 
<input type="submit" name="ok" value="save" />

然后在处理页面上,我有这样的东西:

if(isset($_POST['ok']) && $_POST['ok']=="save")
{
    //process the action, and possibly save to database
}

现在我担心一个恶意的人可能会这样做(从他们网站上的脚本)

<form action="http://www.mysite.com/process.php" method="post">
//he can "view source" on my site, view the fields i'm having and put them
//then put the submit button
<input type="submit" name="ok" value="save" />

当然,你看,有了这个,我会有一些热汤的。那么我该怎么办,或者处理POST提交操作最安全的方式是什么?

这里有两个潜在的问题。

阻止Mallory对Bob的网站进行恶意请求

  1. 对用户进行身份验证(使用OAuth、用户名和密码或其他)
  2. 在继续进行请求之前,请检查经过身份验证的用户是否被授权执行请求所要求的任何操作

阻止Mallory诱骗Alice向Bob的网站提出恶意请求

这是CSRF攻击。用废话来防御它。

您在错误的级别上查看问题。当然,你应该首先确保提出请求的人(你有一个会话,对吧?)拥有这样做所需的权限。HTML表单中没有任何东西可以阻止他们做你描述的事情,所以你需要确保提交表单的人确实可以这样做。

(从技术上讲,你可以查看Referrer,但这充其量是脆弱的)。