对$_SERVER['HTTP_REFERER']验证表单来源的一点看法

《PHP5与MYSQL5 web开发技术详解》一书的第五章,“处理用户输入”中提到,可以依靠验证$_SERVER[‘HTTP_REFERER’]来提高表单的安全性,对此我来谈谈自己的看法。

原书中说道,PHP的$_SERVER服务器超级全局数组提供了一个叫$_SERVER[‘HTTP_REFERER’]的变量,用于保存上一页的来源,比如表单提交或者超级链接的URL地址。如果有人从他的计算机中提交表单或从浏览器地址中直接输入当前脚本名称,该变量会保存表单来源或为空值,这样我们就可以通过它的值进行处理。

但事实上,$_SERVER[‘HTTP_REFERER’]这个变量其实是由浏览器端提供的,这个变量的值能否取到以及是否正确,其实是由浏览器决定。Web连接是不保持状态的,所有网页信息从服务器上下载到本地,再由本地提交到服务器,因此从本地篡改$_SERVER[‘HTTP_REFERER’]的内容完全是可行的。而且在许多情况下,$_SERVER[‘HTTP_REFERER’]是取不到值的,比如访问经JavaScript产生的链接、访问Flash中的链接、用meta进行跳转时等情况,而且有些客户端(浏览器)甚至会完全没有设置这个变量。

因此,我认为用$_SERVER[‘HTTP_REFERER’]验证表单来源从而提高安全性的做法没有意义。这种做法甚至连“轻量级”都算不上,完全是在浪费资源。提高表单安全性,还是应该强调对表单数据的验证。

对$_SERVER['HTTP_REFERER']验证表单来源的一点看法》有3个想法

  1. wanglei

    我看到可能 wordpress 也利用这个来进行数据验证,我在 wordpress 里面看到了这个函数,

    function wp_get_referer() {
    $ref = ”;
    if ( ! empty( $_REQUEST[‘_wp_http_referer’] ) )
    $ref = $_REQUEST[‘_wp_http_referer’];
    else if ( ! empty( $_SERVER[‘HTTP_REFERER’] ) )
    $ref = $_SERVER[‘HTTP_REFERER’];

    if ( $ref !== $_SERVER[‘REQUEST_URI’] )
    return $ref;
    return false;
    }

    应该和这个有关。

    回复
  2. phzzy

    能检查一个细节算一个细节
    一些小的细节往往能阻挡很多恶意用户的~
    🙂

    回复

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注