网站如何判断用户是否在URL中插入了自己的值


How a site can tell whether a user inserted their own values in the URL

我很好奇,因为我希望能够在自己的网站上亲自检查,因为我目前正在设计它。一个例子是:

www.somesite.com/product.php?id=1356

当使用Facebook时,用户可以更改它,并将用户与此id关联。但在其他网站,特别是电子商务网站,当我更改它时,它要么失败,要么进入主页。

没有任何方法可以查看用户是否更改了它。这是安全编码的一部分。从服务器的角度来看,您需要验证所有输入,并验证当前用户是否确实应该访问他们请求的资源。

请参阅https://www.owasp.org/index.php/Top_10_2010-A4以获取一些额外的细节和示例。

Facebook似乎只允许你举一个例子,因为你试图访问的用户档案ID可能对你是公开的。但是,您将无法访问所有其他用户配置文件,只能访问您有权访问的用户配置文件。如果你试图访问我的Facebook个人资料ID,你也会在这里看到你的访问被拒绝。

由于这被标记为电子商务,如果您还没有了解PCI DSS,那么您也应该了解它——其中6.5.4:"不安全的直接对象引用"专门适用于此场景。

当使用Facebook时,用户可以更改它,并将用户与此id关联。但在其他网站,特别是电子商务网站,当我更改它时,它要么失败,要么进入主页。

脸书也做同样的事情。

https://www.facebook.com/profile.php?id=102934810293841029348转到标题为"配置文件不可用"的错误页面,因为该ID不存在。

您可能只是将其更改为不存在的ID。

通过$_GET方法(或$_REQUEST)工作。。。

你之所以可以更改一些网站id(或url中的任何其他参数),并且它是有效的,是因为他们将其编程为这样的行为。这实际上取决于这个url参数在后台的使用方式。例如,在product.php中,您会有这样的内容:

if(isset($_GET['id']) {
  $id = $_GET['id'];
  $id = filterid(id)..... and so ...
  // Maybe check for id and redirect if id is not ok
  // Maybe check for id and some additional secrete parameter ...?
  // What is the id? What kind of behavior you want?
}

你在不同网站上有不同行为的原因——取决于url参数(在本例中为"id")——是因为不同的行为是在不同的情况下实现的。。。

由于安全性,他们中的一些人实施了严格的检查(尤其是id)!?例如,如果您有一个page,并且您知道您的id必须是一个数字,而且您知道数据库中的最大id例如为15000,那么您可以编写这样的内容。。。。

if(isset($_GET['id'] && strlen($_GET['id']) <= 5 && isNumeric($_GET['id']) {
       //if everything is ok you can execute your code here
}
else {
      $id = 1; //if someone try to put something else in id, you will simply redirect him on first id(firs product)
}

这只是行为的一个例子。现在想想还能做些什么?你想做什么?你希望它表现得怎么样?根据url中的参数,你将在自己这边实现什么样的行为完全取决于你用户可以点击你预定义的链接,在你的网络应用程序上跟进你的逻辑,也可以随心所欲地使用url进行操作。你不可能检查这个。您所能做的就是正确验证所有输入(无论它们来自URL还是某种发布请求)