【问题标题】:How does this code generate the proper sequence of characters?此代码如何生成正确的字符序列?
【发布时间】:2012-04-12 14:34:01
【问题描述】:

有问题的代码来自MathGuard,这是一个 PHP 反垃圾邮件验证码脚本,需要用户回答一个简单的数学问题。它将数字和运算符符号显示为 3x5 随机字符矩阵。我理解代码是如何工作的,因为我可以遵循代码并理解它在做什么;我只是不明白人们是如何得出这个解决方案的。

这个函数接受一个整数来描述 3x5 矩阵中的一行并将其转换为一行随机字符:

function decToBin($dec) {
    $pattern = "123456789ABCDEFGHIJKLMNOPQRTSTUWXYZ";
    $output = "   ";
    $i = 0;
    do {
        if ($dec % 2) {
            $rand = rand() % 34;
            $output { 2 - $i } = $pattern { $rand };
        } else {
            $output { 2 - $i } = " ";
        }
        $dec = (int) ($dec / 2);
        $i++;
    } while ($dec > 0);
    $output = str_replace(" ", " ", $output);
    return $output;
}

这里是数字描述符:

$number = array (
    array ( 7, 5, 5, 5, 7 ), // 0
    array ( 2, 6, 2, 2, 7 ), // 1
    array ( 7, 1, 7, 4, 7 ), // 2
    array ( 7, 1, 7, 1, 7 ), // 3
    array ( 4, 5, 7, 1, 1 ), // 4
    array ( 7, 4, 7, 1, 7 ), // 5
    array ( 7, 4, 7, 5, 7 ), // 6
    array ( 7, 1, 1, 1, 1 ), // 7
    array ( 7, 5, 7, 5, 7 ), // 8
    array ( 7, 5, 7, 1, 7 )  // 9
);

我的问题是:如何得出这个结论和生成方法,并且知道例如7会生成一整行随机字符,而5只会生成最外层的字符?

这只是代码混淆的一种形式吗?是什么让这种方法比将数字存储为字符串(例如,1111011011011110)并用随机字符替换每个 1 更好?

【问题讨论】:

    标签: php math obfuscation captcha


    【解决方案1】:

    在我看来就像一个简单的位图。

    7 = 1 1 1
    5 = 1 0 1
    5 = 1 0 1
    5 = 1 0 1
    7 = 1 1 1
    
    2 = 0 1 0
    6 = 1 1 0
    2 = 0 1 0
    2 = 0 1 0
    7 = 1 1 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-11
      • 1970-01-01
      • 2012-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-19
      相关资源
      最近更新 更多