如何在url中显示之前在url中散列GET参数?

时间:2018-01-02 09:53:54

标签: php encryption hash get

我的网站上有简单的html表单:

<form action="" method="GET">
    Enter message id<input type="text" name="id">
    <input type="submit" name="submit" value="Encode">
</form>

当我输入id并点击&#34;编码&#34;按钮显示我添加的ID。

如何以哈希方式向用户显示id参数?

编码和解码的示例函数:

<?php

function generate_xor_key($length)
{
    $result = array_fill(0, $length, 0);

    for ($i = 0, $bit = 1; $i < $length; $i++) {
        for ($j = 0; $j < 3; $j++, $bit++) {
            $result[$i] |= ($bit % 2) << $j;
        }
    }

    return implode('', array_map('chr', $result));
}

function encode_id($id, $encodedLength = 7, $rawBits = 16, $key = null)
{
    $maxRawBits = $encodedLength * 3;
    if ($rawBits > $maxRawBits) {
        trigger_error('encode_id(): $rawBits must be no more than 3 times greater than $encodedLength');
        return false;
    }

    if ($key === null) {
        $key = generate_xor_key($encodedLength);
    }

    $result = array_fill(0, $encodedLength, 0x30);

    for ($position = 0; $position < $rawBits; $position++) {
        $bit = (($id >> $position) & 0x01) << floor($position / $encodedLength);
        $index = $position % $encodedLength;
        $result[$index] |= $bit;
    }

    do {
        $index = $position % $encodedLength;
        $bit = ($position % 2) << floor($position / $encodedLength);
        $result[$index] |= $bit;
    } while (++$position < $maxRawBits);

    return implode('', array_map('chr', $result)) ^ $key;
}

function decode_id($id, $encodedLength = 7, $rawBits = 16, $key = null)
{
    if ($key === null) {
        $key = generate_xor_key($encodedLength);
    }

    $bytes = array_map(
        'ord',
        str_split(
            str_pad($id, $encodedLength, '0', STR_PAD_LEFT) ^ $key,
            1
        )
    );

    $result = 0;

    for ($position = 0; $position < $rawBits; $position++) {
        $index = $position % $encodedLength;
        $bit = (($bytes[$index] >> floor($position / $encodedLength)) & 0x01) << $position;
        $result |= $bit;
    }

    return $result;
}

当我输入数字&#34; 1&#34;字段编码结果将为4256565 在网址中将是http://hash.loc/?id=1&submit=Encode

我如何编码url并以示例方式显示网址:http://hash.loc/?id=4256565&submit=Encode

1 个答案:

答案 0 :(得分:0)

当前设置的唯一选择是在提交的ID被编码后创建重定向PHP端。

为了开发一次性解决方案,您有两种选择:

  • 实现一个JavaScript AJAX框架,在表单提交时:发送当前字段值,检索编码字段值并使用格式正确的ID完成提交;
  • 在JavaScript端实现ID编码算法。

使用前一种方法,有人发现并反转您的编码算法只是时间问题......在最好的情况下,恶意用户可以尽可能多地运行脚本以获得Plain_ID / Encoded_ID查找表。使用后一种方法,您的算法会公开向所有能够阅读JavaScript代码的人公开。

将GET请求转换为POST请求将隐藏浏览器URL栏中的表单数据...但是,现在,嗅探请求发送的POST数据是一个笑话。

总之,无论你做什么......这个脚本都是完全不安全的。原因是实施存在缺陷:您应该通过可靠的身份验证系统来处理身份......而不是通过表单。