我怎样才能禁止我网站以外的地方发布帖子?

时间:2012-09-28 14:54:52

标签: php csrf

我有简单的表格

<form name="blabla" action="path.php" >bla bla bla </form>
当然可以看到

和表单操作的路径,但是我如何保护其他表单可以从另一个Web服务器访问我的表单操作。

因为有人使用来自其他位置的此表单操作在我的数据库中插入了新记录。

我该如何保护?

4 个答案:

答案 0 :(得分:1)

我建议(不知何故)该帖子来自您的网站。

使用Cookie,会话或其他方法来确保它(例如检查页面引荐[[强>不始终可靠])

答案 1 :(得分:1)

使用会话 - 在表单页面中生成一个随机值,并将该值放入隐藏字段并将其保存在$ _SESSION中,然后在表单提交时检查表单中的值是否与会话数据中的值匹配。这也有助于反对CSRF(虽然不完全)

您还可以使用$ _SERVER ['HTTP_REFERER']值。它不是一个必需的标题,有些浏览器不会在完全有效的使用情况下发送它(并且它很容易被恶意用户欺骗),所以它不是完全万无一失。

答案 2 :(得分:0)

您可以测试http主机标头,该标头在以下PHP超全局中设置...

$_SERVER['HTTP_HOST'];

...但是可以在客户端上伪造标题。

您真正关注的是跨站点请求伪造保护,这通常涉及将安全令牌注入到表单数据中,然后将其与您在服务器上为用户存储的令牌(例如会话数据)进行比较。 / p>

Symfony2的优秀表单api为您免费提供此功能,还有用于执行此操作的库,或者您可以自行滚动。无论什么都适合。

http://www.serversidemagazine.com/php/php-security-measures-against-csrf-attacks/

答案 3 :(得分:0)

我通常会添加一个$ token值,就像Guide提到的那样。

EG:

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