我有简单的形式
<form name="blabla" action="path.php" >bla bla bla </form>
表单操作的路径当然是可见的,但是我如何保护其他表单可以从另一个 Web 服务器访问我的表单操作。
因为有人从另一个位置使用此表单操作在我的数据库中插入了一条新记录。
我该如何保护它?
使用会话 - 在您的表单页面中生成一个随机值,并将该值放入隐藏字段并将其保存在 $_SESSION 中,然后在表单提交时检查表单中的值是否与会话数据中的值匹配。这也有助于对抗 CSRF(虽然不完全)
您还可以使用 $_SERVER['HTTP_REFERER'] 值。它不是必需的标头,并且某些浏览器不会在完全有效的使用下发送它(并且它很容易被恶意用户欺骗),因此它不是完全万无一失的。
我建议确保(以某种方式)该帖子来自您的网站。
使用 cookie、会话或其他方法来确保它(例如检查页面引荐来源 [这并不总是可靠的])
我通常会添加一个 $token 值,就像本指南提到的那样。
例如:
<?php #your validator
start_session();
if(isset($_POST['foo']...isset($_POST['bar']){#Required Sent Values
if(isset($_SESSION['token']) && $_POST['token'] === $_SESSION['token']){#Check Token
#Check If Things Are Valid
}else{
#Error
}
}
?>
<?php #Your form page
$token = md5(uniqid(rand(), true));
$_SESSION['token'] = $token;
?>
<form action="">
<input type="hidden" name="token" value="<?php echo $token; ?>" />
</form>
您可以测试 http 主机标头,该标头设置在以下 PHP 超全局...
$_SERVER['HTTP_HOST'];
...但是可以在客户端上伪造标头。
您真正追求的是跨站点请求伪造保护,这通常涉及将安全令牌注入表单数据,然后将其与您在服务器上为用户存储的令牌(例如会话数据)进行比较。
Symfony2 的优秀表单 api 免费为您执行此操作,也有执行此操作的库,或者您可以自己滚动。什么都适合。
http://www.serversidemagazine.com/php/php-security-measures-against-csrf-attacks/