Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在url';中隐藏真实的数据库对象ID;s_Php_Mysql_Security_Hash_Url Rewriting - Fatal编程技术网

Php 在url';中隐藏真实的数据库对象ID;s

Php 在url';中隐藏真实的数据库对象ID;s,php,mysql,security,hash,url-rewriting,Php,Mysql,Security,Hash,Url Rewriting,为了安全起见,在URL中隐藏真实的数据库对象ID有哪些有用的解决方案?我发现解决方案之一是: 1) 使用 2) 在创建对象时使用类似于旧md5的方法生成散列并将其存储在数据库中,然后在url中使用它并由url进行查询,但缺点是通过自动递增主键(ID)进行查询比散列更快。所以我相信散列/取消散列的可能性会更好 同时,我在Symfony上,是否有我找不到的包或内置的功能可以帮助我 请告诉我根据你的经验你发现什么有用 从网站上引用: 您是否有在同一句话中涉及“安全性”和“hashids”的问题或评论?

为了安全起见,在URL中隐藏真实的数据库对象ID有哪些有用的解决方案?我发现解决方案之一是:

1) 使用

2) 在创建对象时使用类似于旧md5的方法生成散列并将其存储在数据库中,然后在url中使用它并由url进行查询,但缺点是通过自动递增主键(ID)进行查询比散列更快。所以我相信散列/取消散列的可能性会更好

同时,我在Symfony上,是否有我找不到的包或内置的功能可以帮助我

请告诉我根据你的经验你发现什么有用

  • 从网站上引用:
  • 您是否有在同一句话中涉及“安全性”和“hashids”的问题或评论?不要使用hashid

  • 我会使用真正的加密算法,比如函数(例如),或者类似的东西。并在向外传递时加密ID,在代码中使用时解密(如用于db查询)

  • 我不建议像任何加密的“垃圾”一样将ID存储在一个库中,我认为散列真实ID非常不方便。保持其内部干净美观,仅为外部显示进行加密。

    按照您的想法,您只需在将URL写入HTML页面之前对ID进行加密,并在处理这些URL时对其进行解密即可

    • 如果您只想通过隐晦实现安全性,这对于99%喜欢在URL中迭代ID的好奇者来说已经足够了,那么您可以使用简单的东西,比如base64或rot13。当然,您还可以预先计算这些“公共ID”并存储在数据库中,而不是在每次向最终用户显示URL时进行加密
    • 如果你想要真正的安全,你必须用一些严重的非对称密码对它们进行加密,将两个密钥都存储在你的身边,因为你基本上是在与自己交谈,而不希望中间有人进行攻击。这是你无法预先计算的,因为在每次加密时都会有不同的密码,这对这个原因是有好处的
    在任何情况下,你需要双向的东西,所以如果我是你,我会忘记“散列”这个词,散列的用途和你的不同

    编辑: 但是,在过去的几年里,每个博客都在使用的解决方案就是利用URL重写,在你的例子中,转换URL,比如
    http://example.com/book/5
    到类似
    http://example.com/rework-by-37signals
    。这将彻底消除URL中数据库ID的任何迹象


    从思想上讲,无论如何,您都需要将请求URL唯一地映射到数据库内容的东西。如果您将MySQL数据库ID隐藏在URL重写的任何层后面,那么您只需将此重写的URL作为相同内容的新ID。您所获得的只是防止枚举攻击和SEF URL。

    这个问题已经被问了很多次,有不同的词选择(这使得很难说“只需搜索它!”)。这一事实引发了一篇题为

    人们想在这里做什么

    人们应该做什么

    解释 通常,人们希望短的随机URL。这不允许您对希望混淆的数据库记录ID有太多空间。这样做需要最小URL长度为32字节(对于HMAC-SHA256),在base64中编码时为44个字符

    一个更简单的策略是生成一个随机字符串(请参阅PHP5实现的
    random_bytes()
    random_int()
    来生成这些字符串),并引用该列

    另外,通过简单的密码分析。他们的结论是:

    我所描述的攻击明显优于暴力攻击,因此从加密的角度来看,算法被认为是被破坏的,恢复salt非常容易;使攻击者能够在任意方向运行编码,并使理想哈希函数的属性2无效


    不要依赖它。

    如果你在散列上有一个索引,那么查询它的速度应该和查询ID的速度一样快。只是好奇你为什么要问这个问题?如果这是为了加强安全。。。也许还有一个更大的问题需要解决?@scunlife实际上到目前为止,我没有看到任何严重的安全漏洞,当然,如果不属于他的用户访问对象应用程序将抛出异常。无论哪种方式,我都不喜欢并且认为在URL中显示该对象的数据库ID不是一种好的做法,因为访问该对象只能是它所属的人,而不像公开访问的博客文章。@DanMironis如果这是个人偏好,那就好了,但对于“良好做法”我不认为这是一个问题,如果ID存在。。。这只是一个数字。例如,此问题ID是
    32795998
    ,它位于URL和此页面上的几乎每个链接中。它不会影响您和我查看它的安全性,因为我们没有访问实际数据库的权限。@scunlife如我所述,在我的情况下,要求资源用户访问(例如domain.com/book/5),它必须属于当前登录的用户,在您关于这个问题的示例中,它是公共的。所以,是的,也许你是对的,这只是我个人的喜好,不会影响安全性哦,你引用的话对我的问题很有意义:)我现在觉得这更像是一种默默无闻,而不是一种安全感。使用php内置的true encryptor可能是一个更好的主意。请。@ScottArciszewski这并不是一个建议,只是一个例子。我同意你的理由,并更新了答案,将openssl设置为示例。你能解释一下转换
    http://example.com/book/5
    http://example.com/rework-by-37signals
    ?@danmironi你听起来像是在使用Symfony框架,还没有读过我只是没有读过