使用regex验证会话cookie值

时间:2014-02-05 18:49:43

标签: php regex session

我正在尝试使用正则表达式验证会话cookie值,我已经做了一些测试,但没有任何成功......有人可以编写并解释我如何匹配非ASCII字符,空格(\ s),逗号和分号(基本上是会话值的所有禁用字符)?显然,如果找到其中一个字符,则整行都无效 此时我的功能是:

session_name("RazorphynSupport");

if(isset($_COOKIE['RazorphynSupport']) && !is_string($_COOKIE['RazorphynSupport']) || !preg_match('/^[a-z0-9]{26,40}$/',$_COOKIE['RazorphynSupport'])){
    setcookie(session_name(),'invalid',time()-3600);
    //return error
    exit();
}
session_start(); 

//Logout
if($_POST[$_SESSION['token']['act']]=='logout' && isset($_SESSION['status'])){
    //Logout
}

//Session Check
if(isset($_SESSION['time']) && time()-$_SESSION['time']<=1800)
    $_SESSION['time']=time();
else if(isset($_SESSION['id']) && !isset($_SESSION['time']) || isset($_SESSION['time']) && time()-$_SESSION['time']>1800){
    //Destroy session; return error

    exit();
}
else if(isset($_SESSION['ip']) && $_SESSION['ip']!=retrive_ip()){
    //Destroy session; return error

    exit();
}
else if(!isset($_POST[$_SESSION['token']['act']]) && !isset($_POST['act']) && $_POST['act']!='faq_rating' || $_POST['token']!=$_SESSION['token']['faq']){
    //Destroy session; return error

    exit();
}

session_start()之前,但显然是错的。
我的问题是如果会话中包含任何非法字符,session_start函数会返回错误,所以为了防止它我想检查“完整性” “饼干的 的修改
表格firebug cookie标签:

Cookie Name -> RazorphynSupport

Value -> ETpSx-T6VFuIYS3fejyaq0

我需要验证ETpSx-T6VFuIYS3fejyaq0(这是一个随机生成的字符串)

2 个答案:

答案 0 :(得分:0)

不应列出您拒绝的内容,而应列出您允许的内容。

我想起了this TheDailyWTF story

您对会话Cookie的期望是什么? (我将假设你的意思是会话cookie的值,这是一个会话ID)它是十六进制字符串吗?多久? 32个字节? 256?还有别的吗?假设您的cookie是一个32字节的六进制字符串。然后以下正则表达式会抓住它们:

/^[a-f0-9]{32}$/

任何与正则表达式不匹配的内容都是无效的。

然而,还有一个更重要的步骤:您应该检查您是否确实有一个尚未过期的ID会话。

答案 1 :(得分:0)

我认为你可以使用这种模式:

if ( preg_match('/^[^:; ]+$/i', 'ETpSx-T6VFuIYS3fejyaq0') ) {
    // valid
}

此模式允许使用数字,大写和小写字母a-z以及连字符-