0

我有一个包含 800 多个数据的数据库。

product table

pid   name     p_page
1     money    money.php
2      gold    gold.php
3      .
.      .
.      .
800    .

我有2页...

product_item.php

<div class="button">
<a href="<?php fetchdir($apages) ?><?php echo $row['p_page']; ?>?pid=<?php echo $row['pid']; ?>">View</a>
</div>`

当您单击查看产品信息时product.php ,我有

if (isset($_GET['pid'])) {

取决于用户在 URL 上单击的产品可能如下所示,但44会更改为任何 id

http://www.example.x10.mx/money.php?pid=44

问题在于,money.php 的布局与其他页面不同,如果我将 44 更改为 68,产品信息将显示在页面上,但布局看起来不太好。

我的问题 是阻止用户更改网址的最佳方法是什么。我想加密我pid在 url 中的所有内容,所以它看起来像 http://www.example.x10.mx//money.php?sel=这里的产品名称 or 4 个字母 or anything

我只想pid从网址中删除。

请帮我。如果您不理解我的问题,请在评论中提问并尝试说出您认为您理解的内容。

编辑以显示我的获取功能

$php = "php/";
$apages = "account/";
$bpages = "booking/";
$gpages = "general/";
$ppages = "product/";

// Global functions
function fetchdir($dir)     
{
   $protocol = $GLOBALS['protocol'];
    $host = $GLOBALS['host'];
    ($dir == $GLOBALS['apages'] || $dir == $GLOBALS['bpages'] || $dir == $GLOBALS['ppages'] || $dir == $GLOBALS['gpages'] ? $branch = $GLOBALS['pagebranch'] : $branch = $GLOBALS['branch']);
    echo $protocol.$host.$branch.$dir;
}

谢谢

ps 我不知道这是否可以在 .htaccess 中完成,但我认为它可以在 php 中完成


一些澄清:

我有一个看起来像这样的网址

www.example.com/account/product.php?pid=1

这样做的问题是有人可以更改 1 或任何数字,如果他们是数据库中具有该数字的 pid,它将获取项目信息并显示在页面上。我不想发生这种情况,因为并非所有产品都打算在某些页面中显示。

在我展示所有可用产品的页面中。我简单地使用一个SELECT语句,然后在某些 div 中回显我需要的内容。

在那个页面中,我有一个查看按钮。

$stmt = $conn->prepare("SELECT * FROM Product WHERE Type = 'shoes'");
$stmt->execute();
$i = 0;
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($rows as $row) {
    $id = ($row['pid']);
    $product_page ($row['dir_page']);

    <div class="button" >
        <a href = "<?php fetchdir($apages) ?><?echo $product_page?ProdID=<?php echo $id>" > View</a >
        </div >
    }

根据您单击时将信息发送到的页面,view我使用 Get 方法

<?php   
    if (isset($_GET['pid'])) {
    // Connect to the MySQL database  
    dbconnect(); 
    $id = preg_replace('#[^0-9]#i', '', $_GET['pid']); 

 }

如果您注意到我select statement以前type只显示类型是鞋子的产品。我也有其他类型,就像他们的其他页面一样。现在的问题是,如果我将 pid 更改为没有类型的任何页面,shoes或者如果在其他页面中输入一个类型是鞋子或任何东西的 pid,来自该页面的信息仍将呈现。这是我不想发生的。

我的问题 是如何阻止用户更改该 pid,即使他们更改了它。他们仍然会在同一页面上吗?

4

4 回答 4

2

问题不在于 URL 中没有 PID,而是在 URL 中具有模板名称。

将模板名称存储在数据库中(您已经这样做了),并使用它来确定将数据包装在哪个 HTML 中,而不是将其 ( money.php) 放在 URL 中。

将您的模板移出网络根目录(用户不应直接点击它们),拥有一个模板index.php,然后include()是基于数据库中数据的模板。

于 2013-07-29T10:15:17.720 回答
0

检查数据库中的津贴

根据您的编程技能水平,您可以在数据库中添加将页面 ID 与允许的页面模板相关联的字段或关系表(我猜您正在谈论模板。)

然后在代码中,您可以使页面检查此数据库以查看是否允许显示页面内容。就像是:

$query1 = "SELECT * FROM Product WHERE Type = 'shoes' and allowedTemplate='1'";

这样您就不必将所有内容硬编码到代码本身中。在后端(如果有 CMS),您可以使用复选框指示与模板的关系并默认预填充它们。

你需要用这些东西来制作网站。

你的另一个选择

您可以使用干净的 url(过去对 SEO 更好)来显示真实的单词而不是 ID。然后,您可以使用.htaccess技巧将 URI 转换为具有动态RewriteMap.

于 2013-07-29T18:36:47.397 回答
0

您无法阻止某人更改 URL 或请求任意 URL。您的服务器(即您的应用程序)必须决定如何响应无效请求。如果您不想公开显示某些内容,请在您的数据库中将它们标记为此类,测试该标记并在该标记被击中时拒绝输出任何内容。

如果某些内容不符合您的条件,则使服务器做出否定响应;不要期望用户行为正确。

于 2013-07-29T18:15:33.983 回答
0

假设 PID 是一个自动增量值,您仍然可以对其进行混淆。在表中添加另一列,其中包含随机生成的密钥(使用 uniqid 或一些派生词)。然后在您的 URL 中使用该密钥。你会得到类似的东西:www.example.com/account/product.php?pid=II8GypI6H93Ij. 这并不能保证有人不会找到它,但在大多数情况下它已经足够好了。

于 2013-07-29T18:23:47.707 回答