【问题标题】:URL and phpmyadmin auto incrementsURL 和 phpmyadmin 自动递增
【发布时间】:2013-07-06 10:54:40
【问题描述】:

我正在寻找解决我遇到的这个问题的最佳方法,并且我一直在寻找一种方法来尝试解决它。

我有一个名为 products 的数据库表,在这个表中我有我所有的产品,比如鞋子、衣服、帽子等

我有一个页面,我曾经根据产品ID 将所有内容回显到其中,我使用的代码如下所示

<a href="product.php?ID=<?php echo $row['ID']; ?>">View</a>

网址是这样的

http://www.example.x10.mx/product.php?ID=1

问题是有人可以将 ID 更改为 2 或 3 或 4.... 这不应该发生。我不知道问题是它没有使用付费域还是仅在 x10hosting 上。

问题

我想提供将 url 中的 ID 更改为他们想要的任何随机数的用途,有人可以告诉我如何做到这一点。

另一个问题 它们是 phpMyadmin 可以生成随机字母和数字混合的一种方式吗,因为这是我想到的解决问题的唯一方法

谢谢

【问题讨论】:

  • 为什么他们不能自己编辑 ID?您将如何确保“代码”始终相同以保留书签,什么不是,或者根本不应该引用?
  • @prodigitalson 事情是我设计 product.php 和 itemview.php 页面的方式是两者都回显 ID 所以如果我在 itemview.php 页面上将 ID 更改为 2将显示与该 ID 相关的内容,这些内容不应显示在 itemview.php 上,并且与许多其他产品相关
  • 只要您不依赖它们具有相同的 ID 来进行安全或验证,这应该不是问题。他们会混淆显示,但这是他们自己的错。他们不应该这样做并期望得到合理的输出,你也不应该担心。
  • 为了安全起见,您不应在 URL 中使用任何内容。您的数据库应说明哪些用户有权访问哪些产品 ID,并且服务器脚本应在收到请求时检查该 ID。
  • @Luffy:我同意 Bumar 的观点,我认为你对自己施加了不必要的要求。另外,您从我能从您的命名中辨别出的内容中所描述的内容也没有多大意义。它们是两种不同的视图,因此它们要么是独立的,因此会使这种情况变得毫无意义,要么它们都基于实体和 id(产品/项目)。

标签: php mysql security phpmyadmin


【解决方案1】:

在工作中处理我们的商务系统时,我不得不处理类似的问题。我们处理它的方式是提供用户在查询中拥有的值的哈希值。

如果您针对盐对查询字符串进行加密并设置您的网址 /product.php?id=1&hash=ajk23j4aksdljfklasdjf2345j - 然后在 product.php 上验证哈希是否正确匹配。如果哈希值不匹配,则表示用户更改了某些内容。

【讨论】:

  • 假设我有一个网址:website.com/script.php?id=5&subid=10 - 我将使用 id=5&subid=10 并针对盐创建一个加密字符串。该链接将附加该哈希:website.com/script.php?id=5&subid=10&hash=hashhere - 然后您只需确保计算的加密/哈希字符串与查询字符串中的内容匹配
  • 如果您想要简单并且不需要高级安全性,您甚至可以这样做:$hash = md5(md5($id));我非常怀疑您的普通用户会计算出您的 ID 的双 md5 哈希是什么。然后只需在脚本本身上验证 $_GET['hash'] == md5(md5($_GET['id'])) ;
  • 他们是我可以遵循的指南吗?或者知道如何回答您的第一个问题?
  • php.net/manual/en/faq.passwords.php - 这是一个例子。有很多方法可以创建散列或加密字符串,关键是您要散列查询字符串而不是密码,并且验证散列将与您最初创建散列的方法基本相同(没有散列 = X查询字符串的一部分)
  • 谁不喜欢这个答案,为什么?
【解决方案2】:

这不是一个真正的答案,但我觉得有必要在这里发帖,因为我觉得应用程序设计状况不佳

来自主要问题的评论线程:

很抱歉让您感到困惑,但它们并不是真正令人困惑的。例如,帽子、鞋子使用 product.php 页面,手套、衬衫使用 itemview.php 页面,当您单击查看时,这两个页面都使用产品 ID (ID)。希望有道理

这仍然没有意义。您提到的所有这些实际上都是产品……只是不同类型的产品。在任何理智的设计中,它们都将使用相同的 URL 格式。根据产品类型执行操作的逻辑属于您用作控制器的任何内容 - 在您的情况下,我假设 url 中的 .php 页面。你只需要其中之一......从那里你可以做不同的事情。

最基本的例子:

// This is product.php

if(!isset($_GET['id'])) {
  // 404 or some other error
}

$product = get_item_by_id($_GET['id']);

if(!$product) {
   // 404 or other error
}

switch($product['type']) {
    case 'cap':
    case 'shoes':
       // for cap and shoes use the product_view template
       include 'product_view.php';
       break;

    case 'gloves':
    case 'shirts':
        // for gloves and shirts use the item_view template
       include 'item_view.php';
       break;

    default:
       // otherwise use the default product view template
       include 'default_view.php';

}

// anything else you need to do that isnt done in the view specific file

现在所有这些都假设这些是特定产品,但您的示例听起来更像类别。通常情况下,您会为与产品做很多相同事情但以某种视觉方式输出产品实体“集合”的类别有一个单独的页面。

【讨论】:

  • 'type' 会是数据库中的表名吗?此代码是否也适用于我在其中显示所有产品的页面?
  • type 将是product 表上的列名,使用我上面的示例。就我个人而言,我不会使用类型,我会使用单独的字段,如 viewtemplate,并将名称放入其中,以映射到 the_name.php。这使您可以更改模板,将输出内容与最可能具有语义意义的实际产品类型分开。
  • 如果您在一个页面上显示您的所有产品,为什么首先要同时拥有product.phpitemview.php?您有两个页面的事实意味着至少有 2 种不同类型的项目(至少从外观角度来看)并且您希望将它们分别显示...
  • 对不起,我对"personally..." 的理解并不完全。你是想说我应该有一个列名viewtemplate 并且在该列中我应该有一个名为the_name.php 的php页面,然后将此名称分配给鞋子中的所有项目类别和上限,然后有一个不同的 php 页面链接到其他一些产品
  • 我有一个不同的页面,它只显示鞋子和帽子。所以它会像www.itemviw.php?ID=5 但如果你将ID 更改为1,它将显示手套,因为我在产品中有一个蓝色手套,它是ID1
猜你喜欢
  • 2023-04-10
  • 2011-08-05
  • 1970-01-01
  • 2010-09-30
  • 2016-03-07
  • 2018-09-09
  • 2013-02-19
  • 2011-03-02
  • 1970-01-01
相关资源
最近更新 更多