在GET参数(PHP)中隐藏自动增量ID

caw*_*caw 0 php security encryption parameters get

编辑:我已经发现并发布了一个高效优雅的解决方案,可以将ID转换3141592为字符串,如vJST向后转换.它可用于PHP:

https://github.com/delight-im/PHP-IDs

提供一些背景知识,它使用Knuth的乘法散列,然后进行基本转换,以生成唯一的,可逆的,非顺序ID.

问题:

我在PHP中有动态页面,其中的内容根据给定的ID显示.id始终通过GET参数提交:page.php?id = X这会导致问题:站点访问者可以枚举id并简单地遍历所有不同的内容页面.当然,这是不可能的.

怎么能解决这个问题?

我的方法是编码链接和表单中的所有ID,以后用作GET参数.在每个页面的开头,给定的id被解码成在数据库中使用的"真实"id.这是一个好方法吗?你会选择另一种方式吗?

我方法的可能解决方案:

我会将整数id转换为基数为38的整数,并将数字替换为给定列表的字符.我会将这些字符用于编码的字符串id:

az 0-9 - _

你会使用其他角色吗?对于这些字符,我的脚本将是这样的:

function id2secure($old_number) {
    $alphabet_en = array(0=>'1', 1=>'3', 2=>'5', 3=>'7', 4=>'9', 5=>'0', 6=>'2', 7=>'4', 8=>'6', 9=>'8', 10=>'a', 11=>'c', 12=>'e', 13=>'g', 14=>'i', 15=>'k', 16=>'m', 17=>'o', 18=>'q', 19=>'s', 20=>'u', 21=>'w', 22=>'y', 23=>'b', 24=>'d', 25=>'f', 26=>'h', 27=>'j', 28=>'l', 29=>'n', 30=>'p', 31=>'r', 32=>'t', 33=>'v', 34=>'x', 35=>'z', 36=>'-', 37=>'_');
    $new_number = '';
    while ($old_number > 0) {
        $rest = $old_number%38;
        if (!isset($alphabet_en[$rest])) { return FALSE; }
        $new_number .= $alphabet_en[$rest];
        $old_number = floor($old_number/38);
    }
    $new_number = strrev($new_number);
    return $new_number;
}
Run Code Online (Sandbox Code Playgroud)

附加问题:

什么是我的功能的反向功能?

我希望你能帮助我.谢谢!

cle*_*tus 8

用户可以通过网站访问这些页面吗?如果答案是肯定的,那么你应该问问自己这是不是真的有问题.

如果没有,那么问题在于你没有保护你的网页或换一种方式:你依靠默默无闻的安全,这绝不是一个好的举动.

我的建议?保护您的网页,以便只有合适的用户才能访问它们,或者不用担心它们.

如果你真的必须担心它,只需传递一个对于给定页面必须正确的额外字段.我不会从ID构造这个.在数据库中创建页面条目时,可能会生成另一个数字或GUID.如果两个字段都不正确,则不显示该页面.

忘记简单的字符替换和其他天真的混淆技术.他们浪费你的时间.

编辑:如果您使用的是长度相同的非顺序ID,请考虑使用UUID而不是自动增加主键.基本上这是在应用程序级别完成的:

  • 将主键更改为char(36);
  • 在insert语句中,您必须设置密钥并使用MySQL UUID()函数填充它.

看看UUID还是UUID?UUID作为主键.由此导致性能下降(特别是因为您使用字符而不是整数进行查找)但除非您有大量(100万行)或数据,否则它在实践中可能不会成为问题.