将表行的ID公开可用是不安全的吗?

时间:2019-07-02 20:00:19

标签: php sql database

所以在我的网站上,我有文章。文章可以被赞成或反对。

在文章的URL中,您可以很清楚地看到其ID。例如:

  

www.website.com/articles/ 14 / this_is_the_article_title

当您要对文章进行上/下投票时,发布请求也将使用该文章的ID,而无需进行任何编码。

这是不良做法还是不安全?如果是这样,最好的选择是什么?

2 个答案:

答案 0 :(得分:0)

这种感觉主要是关于讨论的。不确定此答案是否真的有帮助/并不完全明显...但是,假设需要通过身份验证才能投票,则可以执行以下操作:

<?php
$articleId = 123; //these would be coming from $_GET.
$userId = 5001;
$somethingSalty = 'Constofsomesort' . floor(time() / 3600); //or no time aspect if you prefer

if ($articleId === $article->getId() 
         && $n === hash('sha256', $article->getId() . $user->getId() . $somethingSalty)) {...

您的投票网址类似:

foo.com/vote?voteDir=1&articleId=123&n=cdc6365e49387cc04c6d2fa661670fb43c5473e0ae46480bf9512a30045b4829   
  • 投票链接无法共享。
  • 每个文章/用户都是唯一的,并且不应被欺骗。
  • 缓解“重播攻击”。

答案 1 :(得分:0)

我不会说这是不安全的。许多站点在URL中使用ID。可以在GET或POST请求中使用,但也可以用作路径变量。

如果您认为通过网络抓取您的网站是不安全的,那么您可以将其称为“安全隐患”,因为用户可以编程从0到最后一个用户/帖子/产品ID范围内的漫游器并抓取数据。但是,如果您使用随机ID,则可以避免这种情况。因此,例如,您对表中的每一行使用不同的六位ID。无需生成ID升序,而是可以生成随机的六位数代码,并将其分配给行(如果数据库中尚未存在该代码)。

因此,而不是像这样的行:

ID    NAME
0     [username]
1     [username]
2     [username]

您可以这样构建它们:

ID      NAME
421456  [username]
197635  [username]
486597  [username]