如何过滤和识别PHP中的哈希字符串?

问题描述:

在每一个PHP脚本的开始,我循环通过可能的POSTGET输入,正确地过滤它们,所以以后当我需要输入时,我可以使用我的自定义安全过滤变量(这是一个数组,持有POSTS和GETS),我不必触摸$ _GET和$ _POST。如何过滤和识别PHP中的哈希字符串?

如果变量是哈希值,或者是40个字符的SHA1或64个字符的Adobe Stratus ID,我如何识别它们?

我不希望用户发布一些无意义的数据。

+0

您想确保一个变量包含40或60个字符长的字母数字字符串吗? – 2013-05-07 10:50:34

+0

Adob​​e Stratus ID允许使用哪些字符?顺便说一下,Stratus现在称为Cirrus。 – Pietu1998 2013-05-07 10:51:33

+0

对于SHA1,你应该检查这个问题:http://stackoverflow.com/questions/2982059/testing-if-string-is-sha1-in-php – Juampi 2013-05-07 10:52:35

要测试字符串是否是斧长度的散列值或不:

$x = 40 
$string = "inputstring"; 
$boolResult = (preg_match('/^[0-9a-f]{'$x'}$/i', $string) == true) ? true : false; 

我不同意你应该避免_POST和_GET访问,但相反你应该尽可能的清理它们以避免XSS。 (https://en.wikipedia.org/wiki/Cross-site_scripting)。 CodeIgniter有一个很好的安全库,你可以捏和插入你自己的东西。

除此之外,我不确定...但我认为您要求解密来自会话的哈希值?

+0

不可能解密。我想要的只是一个布尔值,如果一个字符串是一个散列或者不是一个散列。 – 2013-05-07 11:00:52

+0

我认为这已经在这里得到解答:http://stackoverflow.com/questions/2089428/possible-to-identify-hash-type – 2013-05-07 11:04:03

当大多数哈希sha的,md5等返回十六进制格式..你可以很容易地发现他们使用ctype_xdigit

if (ctype_xdigit($value)) { 
    // It must be Hex 
} 

我不知道是什么Adobe Stratus ID样子,但你可以很容易地验证与preg_match太。

有些人还可以进来base64你也可以证实,与

if (base64_encode(base64_decode($data)) === $data){ 
    // it must be base 64 
} 

可以搭配使用SHA1哈希正则表达式,如:

/[0-9a-f]{40}/ 

在PHP中:

foreach($_GET as $get) { 
    if (preg_match('/[0-9a-f]{40}/i', $get)) { 
     // do something 
    } 
}