这是我目前处理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的网站进行恶意请求
- 对用户进行身份验证(使用OAuth、用户名和密码或其他)
- 在继续进行请求之前,请检查经过身份验证的用户是否被授权执行请求所要求的任何操作
阻止Mallory诱骗Alice向Bob的网站提出恶意请求
这是CSRF攻击。用废话来防御它。
您在错误的级别上查看问题。当然,你应该首先确保提出请求的人(你有一个会话,对吧?)拥有这样做所需的权限。HTML表单中没有任何东西可以阻止他们做你描述的事情,所以你需要确保提交表单的人确实可以这样做。
(从技术上讲,你可以查看Referrer,但这充其量是脆弱的)。