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)
附加问题:
什么是我的功能的反向功能?
我希望你能帮助我.谢谢!
用户可以通过网站访问这些页面吗?如果答案是肯定的,那么你应该问问自己这是不是真的有问题.
如果没有,那么问题在于你没有保护你的网页或换一种方式:你依靠默默无闻的安全,这绝不是一个好的举动.
我的建议?保护您的网页,以便只有合适的用户才能访问它们,或者不用担心它们.
如果你真的必须担心它,只需传递一个对于给定页面必须正确的额外字段.我不会从ID构造这个.在数据库中创建页面条目时,可能会生成另一个数字或GUID.如果两个字段都不正确,则不显示该页面.
忘记简单的字符替换和其他天真的混淆技术.他们浪费你的时间.
编辑:如果您使用的是长度相同的非顺序ID,请考虑使用UUID而不是自动增加主键.基本上这是在应用程序级别完成的:
看看UUID还是UUID?和UUID作为主键.由此导致性能下降(特别是因为您使用字符而不是整数进行查找)但除非您有大量(100万行)或数据,否则它在实践中可能不会成为问题.
| 归档时间: |
|
| 查看次数: |
1704 次 |
| 最近记录: |