如何加密URL中的产品ID

时间:2013-07-29 10:11:28

标签: php .htaccess

我有一个只有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'])) {

取决于用户在网址上点击的产品可能如下所示,但44会更改为任何ID

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

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

我的问题 什么是阻止用户更改网址的最佳方式。 我想加密我在网址中的所有pid所以它看起来像  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;
}

由于

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


一些澄清:

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

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

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

在我展示我所有可用产品的papge中。我简单地使用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,则该页面中的信息仍将是渲染。我不想发生这种事。

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

4 个答案:

答案 0 :(得分:2)

问题是URL中没有PID,它在URL中有模板名称。

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

将模板从Web根目录移出(不应该直接由用户点击),根据数据库中的数据,单个index.php然后include()模板。

答案 1 :(得分:0)

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

如果某些内容不符合您的条件,请让服务器做出负面回应;不要指望用户行为正确。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

检查数据库中的容差

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

然后在代码中,您可以进行此操作,以便页面检查此数据库以查看是否允许显示页面内容。类似的东西:

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

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

你需要让这个网站变得那么东西。

您的其他选择

您可以使用干净的网址(过去更适合搜索引擎优化)来显示真实的字词而不是ID。然后,您可以使用.htaccess技巧将URI转换为ID对应的动态RewriteMap