2017-07-26 91 views
-1

我有一个功能正常的表单页,用户可以根据用户名更新其邮政编码,并将其保存为会话变量。安全验证5位数值的php表单字段

除了此新功能验证邮政编码以外的所有工作。我有html5模式,因此如果他们输入4位数字,它会提示他们遵循5位数字格式。然而,我需要在服务器端安全地进行验证。

我选择了正则表达式来匹配0到9之间的5个数字,并且我将它嵌套在if语句中如果我输入123作为邮政编码,它仍然可以成功提交

显然,我只需要提交它是否是5位数字,否则打印出错信息。我想知道,如果它的东西,在我的结构或语法

下面的代码,感谢您的帮助:

if (isset($_SESSION['missingZipUser'])) { 

if(!preg_match("/^[0-9]{5}$/", $_POST['zip'])) { 
echo "The ZIP code must be a 5-digit number."; 
}else{ 

    //Query for updating main table first 
    $sql = " UPDATE " . table. " 
     SET zip= ? 
     WHERE uname ?"; 
    $stmt = odbc_prepare($connect, $sql); 
    $success = odbc_execute($stmt, array($_POST['zip'], 
    $_SESSION['missingZipUser'])); 

    //Query for updating both fields in secondary table 
    $sql2 = " UPDATE " . table. " 
     SET zip1= ?, zip2= ? 
     WHERE uname= ?"; 
    $stmt2 = odbc_prepare($connect, $sql2); 
    $success2 = odbc_execute($stmt2, array($_POST['zip'], $_POST['zip'], 
    $_SESSION['missingZipUser'])); 
} 
} 

UPDATE 与下面的一些注释相反,更新代码仍然将信息传递成功。

+1

您正在回应一条错误消息,但仍然插入到数据库中。你可能想要一个'else'。 – smarx

+0

啊,谢谢。不能相信我错过了这一点。我添加了它,但是如果我输入123,它仍会更新数据库,并且无论如何给出我的成功消息 –

+1

您的逻辑也是向后的。应该是'if(!preg_match ...' – smarx

回答

2

只是解决你的病情,你是好去:

if (isset($_SESSION['missingZipUser']) && isset($_POST['zip'])) { 
    if (is_string($_POST['zip']) && 1 === preg_match("/^[0-9]{5}$/", $_POST['zip'])) { 
     // update record in database 
    } else { 
     echo "The ZIP code must be a 5-digit number."; 
    } 
} 

您还可以简化您的正则表达式:

if (isset($_SESSION['missingZipUser']) && isset($_POST['zip'])) { 
    if (is_string($_POST['zip']) && 1 === preg_match("/^\d{5}$/", $_POST['zip'])) { 
     // update record in database 
    } else { 
     echo "The ZIP code must be a 5-digit number."; 
    } 
} 

备注正如所指出的那样,您的原始简体正则表达式仅验证字符串是否为5位数字。并非所有的5位数字都是有效的邮政编码。

+1

它可能是一个数组。 – localheinz

+1

@PaulCrovella这就是服务器端验证的要点。想想https://www.w3schools.com/tags/att_select_multiple.asp。 – localheinz

0

在PHP中,如果所有字符都是数字,则可以使用ctype_digit()来检查字符串,并检查长度是5个字符的strlen()。由于@smarx pointed out,如果$_POST['zip']不是邮政编码,您应该不要向数据库中插入任何内容。另外,在使用它之前,您应该检查是否已经设置了$_POST['zip']

下面是使用上述方法的例子,

if (isset($_SESSION['missingZipUser'])) { 
    if (isset($_POST['zip'])) { 
    if (ctype_digit($_POST['zip']) && strlen($_POST['zip']) === 5) { 
     //Query for updating main table first 
     $sql = " UPDATE " . table. " 
      SET zip= ? 
      WHERE uname ?"; 
     $stmt = odbc_prepare($connect, $sql); 
     $success = odbc_execute($stmt, array($_POST['zip'], 
     $_SESSION['missingZipUser'])); 

     //Query for updating both fields in secondary table 
     $sql2 = " UPDATE " . table. " 
      SET zip1= ?, zip2= ? 
      WHERE uname= ?"; 
     $stmt2 = odbc_prepare($connect, $sql2); 
     $success2 = odbc_execute($stmt2, array($_POST['zip'], $_POST['zip'], 
     $_SESSION['missingZipUser'])); 
    } else { 
     echo "The ZIP code must be a 5-digit number."; 
    } 
    } 
} 

现在,为了测试的方式,如果你有一个有效的邮政编码是使用邮政编码查询服务。一个自由的一个被称为Zippopotam以下是其使用的一个例子,

Run it here

function valid_zip($zip_code) { 
    $data = file_get_contents("https://api.zippopotam.us/us/$zip_code"); 
    $data_decoded = json_decode($data); 
    return (property_exists($data_decoded, 'post code')) ? true : false; 
} 

var_dump('60007 is ',valid_zip(60007)); 
var_dump('6000 is ',valid_zip(6000)); 
+1

感谢您提供给我的问题的正则表达式的有用替代方法,这在检查POST我不是一个典型的PHP程序员,所以当我遇到问题时,我很快就停下来了,这个解决方案立刻为我工作。 –

+2

这实际上是错误的,不应该被接受的答案,请参阅示例:https://3v4l.org/8jShF。 – localheinz

+0

正如@PaulCrovella指出的,仍然错误。请参阅https://3v4l.org/k7N4i。 – localheinz