我有一个只有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。他们还会在同一页上吗?
答案 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
。