繁体   English   中英

HTTP_REFERER行为 - 需要帮助

HTTP_REFERER behavior - assistance required

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我有三个单独的页面:modify.php允许用户选择发布者并为该发布者创建会话变量。

modify.php

<?php
    session_start();
    require ("../login.php");

    if (!isset($_SESSION['user']))
        header('Location: ../index.php');

    if (isset($_POST['submit'])) {
        $_SESSION['publisher'] = $_POST['publishers'];
        header('Location: modify2.php');
    }

    $user_id = $_SESSION['user'];
    $success = true;

    include ("header.php");
    include ("subnav.php");

    $stmt = $db->prepare
        ("SELECT DISTINCT p.name 
        FROM subscriptions s
        JOIN titles t
            ON s.title = t.id
        JOIN publishers p
            ON t.publisher = p.name
        WHERE s.user=:user
        ORDER by p.name");
    $stmt->bindValue(':user', $user_id, PDO::PARAM_INT);
    $stmt->execute();
    $rows = $stmt->fetchAll();
    $num_rows = count($rows);
    if ($num_rows == 0) {
        $success = false;
        $errors[] = 'You currently have no subscriptions.';
    }
?>

    <h2>Modify Subscriptions</h2>

    <?php
        if (!empty($errors))
            foreach($errors as $error)
                echo $error;
    ?>

<?php
        if ($success == true) { ?>
            <form action="" method="post">
                <ul>
                    <li>
                        Select Publisher:<br>
                        <select name="publishers">
                        <?php
                        foreach($rows as $row) {
                            echo '<option value ="'. $row['name'] . '">' . $row['name'] . '</option>';  
                        }   ?>
                        </select>
                    </li>
                    <li>
                        <input type="submit" value="Select Publisher" name ="submit" id="submit">
                    </li>
                </ul>
            </form>
<?php   } ?>

<?php   
    include ("footer.php");
?>

modify2.php从modify.php接收会话变量“publisher”,并检索该发布者的标题。 然后它取消设置发布者会话变量有两个原因:1)不再需要它2)如果此变量为空,则mofify2.php知道引用来自错误的页面

modify2.php

<?php
    session_start();
    require ("../login.php");

    if (!isset($_SESSION['user']))
        header('Location: ../index.php');

    if (!isset($_SESSION['publisher']))
        header('Location: modify.php');

    $referer = $_SERVER['HTTP_REFERER'];
    if (basename($referer) <> 'modify.php')
        header('Location: modify.php');

    if (isset($_POST['submit'])) {
        $_SESSION['title'] = $_POST['title'];
        unset($_SESSION['publisher']);
        header('Location: modify3.php');
    }

    $user_id = $_SESSION['user'];
    $publisher = $_SESSION['publisher'];

    include ("header.php");
    include ("subnav.php");

    $stmt = $db->prepare
        ("SELECT t.title
        FROM titles t
        JOIN publishers p
            ON t.publisher = p.name
        JOIN subscriptions s
            ON t.id = s.title
        WHERE s.user=:user AND t.publisher=:publisher
        ORDER by t.title");
    $stmt->bindValue(':user', $user_id, PDO::PARAM_INT);
    $stmt->bindValue(':publisher', $publisher, PDO::PARAM_STR);
    $stmt->execute();
    $rows = $stmt->fetchAll();
    $num_rows = count($rows);
    if ($num_rows == 0)
        $errors[] = 'There are currently no titles for that publisher.';
?>

    <h2>Modify Subscriptions</h2>

    <?php
        if (!empty($errors))
            foreach($errors as $error)
                echo $error;
    ?>

    <form action="" method="post">
        <ul>
            <li>
                Select Title:<br>
                <select name="title">
                <?php
                foreach($rows as $row) {
                    echo '<option value ="'. $row['id'] . '">' . $row['title'] . '</option>';  
                }   ?>
                </select>
            </li>
            <li>
                <input type="submit" value="Select Title" name ="submit" id="submit">
            </li>
        </ul>
    </form>

<?php   
    include ("footer.php");
?>

这个文件是问题所在。 无论出于何种原因,我的http_referer代码块都会阻止访问该页面。 任何帮助,将不胜感激。

modify3.php

<?php
    session_start();
    require ("../login.php");

    if (!isset($_SESSION['user']))
        header('Location: ../index.php');

    if (!isset($_SESSION['title']))
        header('Location: modify2.php');

    $referer = $_SERVER['HTTP_REFERER'];
    if (basename($referer) <> 'modify2.php');
        header('Location: modify2.php');

    $user_id = $_SESSION['user'];
    $title = $_SESSION['title'];
    $success = false;

    if (isset($_POST['submit'])) {

        $covers = (isset($_POST['covers'])) ? 1 : 0;

        if (empty($_POST['quantity']))
            $errors[] = 'You must enter a quantity!';
        else if (!is_numeric($_POST['quantity']))   
            $errors[] = 'You must enter a number for the quantity field!';
        else if (is_numeric($_POST['quantity']) && $_POST['quantity'] > 5)
            $errors[] = 'If you want to subscribe to more than 5 of the same issue, please contact us';
        else {
            $stmt = $db->prepare("UPDATE subscriptions SET quantity=:quantity, covers=:covers WHERE user=:id AND title=:title");
            $stmt->bindValue(':quantity', $_POST['quantity'], PDO::PARAM_INT);
            $stmt->bindValue(':covers', $covers, PDO::PARAM_INT);
            $stmt->bindValue(':id', $user_id, PDO::PARAM_INT);
            $stmt->bindValue(':title', $title, PDO::PARAM_INT);
            $stmt->execute();
            $success = true;
            unset($_SESSION['title']);
        }
    }

    include ("header.php");
    include ("subnav.php");

?>

    <h2>Modify Subscriptions</h2>

    <?php
        if (!empty($errors))
            foreach($errors as $error)
                echo $error;
    ?>

    <?php 
        if ($success == false) { ?>
            <form action="" method="post">
                <ul>
                    <li>
                        <b>Title To Modify:</b><br>
                        <?php 
                        $stmt = $db->prepare("SELECT title FROM titles WHERE id=:title");
                        $stmt->bindValue(':title', $title, PDO::PARAM_STR);
                        $stmt->execute();$rows = $stmt->fetchAll(); 
                        foreach ($rows as $row) {
                            echo $row['title'];
                        }
                        ?>
                    </li>
                    <li>
                        <br><input type="checkbox" name="covers" value="covers"
                        <?php
                            $stmt = $db->prepare("SELECT covers FROM subscriptions WHERE user=:id AND title=:title");
                            $stmt->bindValue(':id', $user_id, PDO::PARAM_INT);
                            $stmt->bindValue(':title', $title, PDO::PARAM_INT);
                            $stmt->execute();
                            $rows = $stmt->fetchAll();
                            foreach ($rows as $row)
                                if ($row['covers'] == 1)
                                    echo 'checked';
                        ?>
                        >Check to opt-in for all regular priced covers.
                    </li>
                    <li>
                        <br><b>Quantity Requested:</b> <br>
                        <input type="text" name="quantity" value="<?php $stmt = $db->prepare("SELECT quantity FROM subscriptions WHERE user=:user AND title=:title"); $stmt->bindValue(':user', $user_id, PDO::PARAM_INT); $stmt->bindValue(':title', $title, PDO::PARAM_INT); $stmt->execute(); $rows = $stmt->fetchAll(); foreach ($rows as $row) echo $row['quantity']; ?>">
                    </li>
                    <li>
                        <input type="submit" value="Save Changes" name="submit" id="submit">
                    </li>
                </ul>
            </form>
<?php   } 
        else { ?>
            <p>You have succesfully updated your title!</p>
<?php   }   ?>


<?php   
    include ("footer.php");
?>

如果我采用以下代码块:

$referer = $_SERVER['HTTP_REFERER'];
        if (basename($referer) <> 'modify2.php');
            header('Location: modify2.php');

然后我的页面正常工作,但它不会阻止人们手动将其键入浏览器并以错误的方式访问它。

1 个回复

您不能依赖浏览器发送的Referer标头。 事实上,其中一些提供了出于“安全”原因欺骗它的选项。

相反,您应该在$_SESSION数组中保存一个变量,指示用户是否以正确的方式访问了该页面。

3 HTTP_REFERER空白,需要替代方案

我有一个简单的注册表单,需要跟踪来自一个特定外部引用者的命中数。 这是PHP的一个简单任务: $_SERVER['HTTP_REFERER'] 但是,它是空白的。 做了一些研究后我尝试使用一些javascript: document.referrer 还是空白。 : ...

4 HTTP_REFERER和https

我正在尝试找出如何确定我建立的网站的访问者是否来自Google。 客户端正在运行一个Adwords广告系列,而Google反对这样一个事实,即当用户到达网站时会对其进行重定向,因此我需要为此添加一个例外。 它必须由PHP而不是Analytics JS来处理,因为处理重定向的模块在任何输出 ...

2013-11-07 10:06:39 0 2038   php
6 替代HTTP_REFERER

使用MITER ,我实现了反向代理。 显然,其目的是打开对我们内部服务器之一的外部访问。 此内部服务器提供嵌入在另一个网站中的PNG,该网站也由我们的一个服务器提供服务。 我们需要保护该PNG免受“热链接”(不确定热链接是否正确表示-&gt; PNG应该仅在我们的网站上可见,如果直接在浏览 ...

7 PHP的http_referer

我有程序的这一部分: 获取有关访问我网站的人的信息。 但是我想知道是否可以从引荐来源中提取更多信息? 例如,如果有人通过Facebook链接连接到我的网站,我的引荐网址为http://www.facebook.com/l.php?u=http%3A%2F%2Fmypage.net%2 ...

8 你如何欺骗HTTP_REFERER?

我需要尝试欺骗HTTP_REFERER传递给我的另一个页面,以便在目标页面中,我可以确定请求是从“正确”页面进入并执行适当的逻辑。 我如何在JavaScript(AJAX)中做到这一点? 我可以在ASP.Net中这样做吗? TIA公羊 ...

9 $ http_referer的行为类似于$ document_uri

我需要在ssi include中设置caller参数作为当前uri,但是$ document_uri是奇怪的 带有ssi-include的模板部分: 确实, $http_referer ,而不是$document_uri Nginx日志格式: / panel /的Ng ...

2015-10-28 09:14:47 1 627   nginx
10 将HTTP_REFERER设置为会话

我正在寻找一种设置request.env['HTTP_REFERER']如果第一次访问会话时存在)。 以后,如果用户购买了商品,在网站上注册或采取了任何措施-从会话中获取引荐来源网址的值。 简而言之,我想知道用户进行重要操作时来自何处。 这是个好方法吗? 如果是,那么我将使用 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM