mysql过滤精确匹配以及如何使其更安全

时间:2014-09-27 15:54:54

标签: php mysql

我最近开始使用php进行编程并取得了一些不错的进展(如果我自己说的话)。现在我偶然发现了一些问题。

我所拥有的是ifmysql语句,其中包含query if(empty($_POST['Email'])){ $error_Email = "No email"; $errors++; }elseif(!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/", $_POST['Email'])){ $error_Email = "Invalid email"; $errors++; }elseif ($mysqli->query("SELECT * FROM Members WHERE Email LIKE '".$_POST['Email']."'")->num_rows == 0){ $error_Email = "[TEST] NOT IN DB"; }else{ $error_Email = "[TEST] IN DB"; }

me@this.com

所以我的代码有几个问题。可以说[TEST] IN DB在数据库中。我只想在我完全键入me@this.com时看到me@,而不是this.com,而不是me@this.com,...仅当我输入{{1}}时。

我的第二个问题是这段代码可以被操作,因为我直接在查询中放置了搜索条件。

所以有一种更安全的方法可以实现我想要的内容,只有在匹配完全匹配的情况下才返回一行。

2 个答案:

答案 0 :(得分:1)

我认为你可以用这样的东西让它看起来更干净

$email = $_POST['Email'];
$email_status = validateEmail($email);
function validateEmail($email){
  if(empty($email)){
    return array("status" => 0, "error" => "Empty email");
  }
  if(!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/", $email){
    return array("status" => 0, "error" => "Invalid email");
  }else{
    $stmt = $mysqli->prepare('SELECT * FROM Members WHERE Email = ?');
    $stmt->bind_param('s', $email);
    $stmt->execute();
    $result = $stmt->get_result();
    if(result->num_rows == 0){
      return array("status" => 0, "error" => "valid email, but no matches!");
    }else{
      return array("status" => 1, "error" => "");
    }
  }
}

稍后在视图中使用

<input type="text" name="email"/>
<?php if($email_status["status"] === 0){
  echo $email_status["error"];
} ?>

答案 1 :(得分:1)

我自己想出了一个解决方案。我过早地问过这个问题,但是为了帮助其他可能找到这个问题的人,我不想删除它。

在下面的代码中,我只检查数据库中的电子邮件是否为空并且是否有效以减少请求。我认为这是我的问题的一个很好的解决方案。建议当然仍然受欢迎。

if(empty($_POST['Email'])){
    $error_Email = "No email";
    $errors++;
}elseif(!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/", $_POST['Email'])){
    $error_Email = "Invalid email";
    $errors++;
}else{
    $stmt = $mysqli->prepare('SELECT * FROM Members WHERE Email = ?');
    $stmt->bind_param('s', $_POST['Email']);
    $stmt->execute();
    $result = $stmt->get_result();

    if($result->num_rows == 0){
    $error_Email = "NOT IN DB";
    }else{
    $error_Email = "IN DB";
    }
}