【问题标题】:Using POST method to hide URL parameters使用 POST 方法隐藏 URL 参数
【发布时间】:2011-10-26 17:15:40
【问题描述】:

我知道我可以对 URL 参数使用 POST 方法来根据特定变量显示数据,我知道如何使用 GET 方法 - 但我被告知可以使用 POST 方法隐藏像这样的 URL 部分。

/data.php?parameter=1234

这两种方法在URL参数方面的实际区别是什么?

下面是一些根据特定链接的id从数据库中获取数据的代码

    <?php
//This includes the variables, adjusted within the 'config.php file' and the functions from the 'functions.php' - the config variables are adjusted prior to anything else.
require('configs/config.php');
require('configs/functions.php');

    //This is the actual interaction with the database, according to the id.
    $query = mysql_query("SELECT * FROM table WHERE id=" .$_GET['id'] . ";") or die("An error has occurred");

            //This re-directs to an error page the user preventing them from viewing the page if there are no rows with data equal to the query.
    if( mysql_num_rows($query) < 1 )
{
  header('Location: 404.php');
  exit;
}

    //Here each cell in the database is fetched and assigned a variable.
    while($row = mysql_fetch_array($query))
    {
        $id = $row['id'];
        $title = $row['title'];
        $month = $row['month'];
        $day = $row['day'];
        $photo = $row['photo'];
        $text = $row['text'];    
    }
?>

在一个单独的页面上,我根据 ID 生成指向 data.php 文件的链接,如下所示:

<a href="post.php?id=<?php echo $content['id']; ?>"><?php echo $content['title']; ?></a>

忘记了通过上述代码可能会发生潜在的 SQL 注入,我将如何使用 POST 方法来隐藏 URL 参数,或者至少不要像这样显示它们:

http://example.com/data.php?id=1

【问题讨论】:

  • 一个小注解mysql_query("SELECT * FROM table WHERE id=" .$_GET['id'] . ";") 容易受到SQL 注入的影响,所以如果你把它放到网上并且你的数据库包含重要数据时要小心。

标签: php mysql methods url-parameters


【解决方案1】:

为了使用 POST,您需要使用 &lt;form&gt; 标记,并且根据您提取这些 URL 的方式,使用 javascript 来帮助可能会更容易。这是一个基本示例:

<form method="post" action="data.php">
    <input type="hidden" name="parameter" value="1234" />
    <input type="submit" value="Go" />
</form>

Go 按钮将 POST 表单数据,现在在 data.php 中,您将能够从 $_POST['parameter'] 检索值。请注意,使用 POST 时,您可能希望将 (HTTP 302) 重定向回页面,以便当用户点击后退按钮时,浏览器不会提示重新提交表单。

使用 javascript,您可以在发布表单之前将 parameter 输入设置为不同的值。

【讨论】:

  • 感谢您的回复,我正在使用通过邮寄提交的表单执行类似的过程,该表单将数据插入数据库,然后将用户带到带有他们通过标题提交的数据的页面( '位置:../data.php?id='.$id);这是否意味着我此时实际上使用了不正确的代码?
  • 这并没有错,但是如果您想使用 POST 从 URL 中删除 id,那么您需要将 ID 存储在会话 ($_SESSION) 中。这样,当用户在 data.php 上时,您可以从会话中查找 id,而不是从 GET。
  • 那么我是否必须将更新数据库的代码粘贴在同一个文件中,同时显示插入的内容?那么表单运行该脚本 - 插入数据库,然后显示为用户插入的数据?
  • 如果您在用户操作上更新数据库,我将 POST 到执行保存的 php 脚本,将 id 放入会话中,然后重定向到视图页面,然后加载使用会话中的 id 来自数据库的数据。您也可以将它们全部放在同一个文件中,并且只有在检测到 POST 数据时才进行更新。您可以使用许多策略,但这取决于应用程序,哪种方式最好。
【解决方案2】:

为您的表单使用“POST”方法。我有同样的问题,只是将 POST 添加到表单中删除了 URL 中的参数

<form id="abc" name="abc" action="someaction.php" method="post">
    <input type="text" id="username" name="username"/>
    <input type="password" id="password" name="password"/>
    <input type="submit" id="submit" name="submit" value="submit"/>
</form>

【讨论】:

    【解决方案3】:

    要发布值,浏览器必须使用带有 method="post" 的表单,或者使用 javascript 模拟表单。各种开发工具(fireug 等)可以将 GET 表单转换为 POST 表单,但通常需要一个表单。

    理论上 GET 请求不应该有任何副作用,并且“应该”在请求之间保持一致。也就是说,服务器应该返回相同的内容。在当今几乎所有事物都是动态的世界中,这可能没有什么实际的设计意义。

    【讨论】:

      【解决方案4】:

      无论你使用GET还是POST,参数都会出现在$_REQUEST中。关键的区别是使用 POST 允许变量不会出现在 URL 历史记录中。这会降低您不想在 URL 历史记录中显示的密码等数据的可见性。要使用 POST 而不是 GET,只需在文档中生成 &lt;form method="POST" ...&gt;

      更好的是在 cookie 中存储敏感值(如用户 ID),这样它们就不会出现在 $_REQUEST 中。由于 cookie 的内容是在额外的 HTTP 请求标头中而不是在内容中提供的,因此它们通常不会作为历史记录的一部分存储。

      【讨论】:

        【解决方案5】:

        为了使用 POST 而不是 GET,您需要在 html 中使用 HTML 表单标签,如下所示:

        <form method="POST" action="/data.php">
          <input type="hidden" name="parameter" value="1234" />
          <button type="submit">Submit</button>
        </form>
        

        提交后,您的 URL 将只是 /data.php 并且 parameter=1234 将在您的(隐藏的)帖子缓冲区中。

        有意义吗?

        【讨论】:

          【解决方案6】:

          要进行 POST,您必须使用表单或一些 javascript/ajax 技巧。 &lt;a&gt; 只会引发 GET 请求。

          请注意,POST 请求仍然可以在 URL 中包含查询参数。拥有它们不是“正常的”,但它们是被允许的。主要区别在于,对于 GET 请求(忽略 cookie),URL 是向服务器发送参数/数据的唯一方式。使用 POST,您可以同时使用 URL 和 POST 请求的正文,这是通常放置 POST 表单数据的位置。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-02-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-10-09
            • 1970-01-01
            • 1970-01-01
            • 2015-06-13
            相关资源
            最近更新 更多