在验证和清理表单数据后是否需要'my_real_escape_string'?

时间:2013-12-29 06:14:39

标签: php forms mysqli

所以我已经在同一文档上验证并清理了我的表单数据。在我开始看到有关'my_real_escape_string'的内容之前,我一直认为这是安全的。

我认为如果我输入数据,我的数据将是安全的,但我不想抓住机会。所以我的问题是我是否需要使用此'my_real_escape_string'来确保数据安全。

我正在使用以下代码。首先是表单文档(index.php)本身,然后处理文档(processform.php)。感谢您的帮助。

//的index.php

<?php
// define variables and set to empty values
$first_nameErr = $last_nameErr = $emailErr = $passwordErr = $genderErr = "";
$first_name = $last_name = $email = $password = $gender = "";

if ($_SERVER["REQUEST_METHOD"] == "POST")
{
if (empty($_POST["first_name"]))
 {$first_nameErr = "";}
else
 {
 $first_name = test_input($_POST["first_name"]);
 // check if name only contains letters and whitespace
 if (!preg_match("/^[a-zA-Z ]*$/",$first_name))
   {
   $first_nameErr = "Only letters allowed";
   }
  }

if (empty($_POST["last_name"]))
 {$last_nameErr = "";}
else
 {
 $last_name = test_input($_POST["last_name"]);
 // check if name only contains letters and whitespace
if (!preg_match("/^[a-zA-Z ]*$/",$last_name))
   {
   $last_nameErr = "Only letters allowed";
   }
 }


if (empty($_POST["email"]))
  {$emailErr = "";}
else
 {
 $email = test_input($_POST["email"]);
 // check if e-mail address syntax is valid
if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email))
   {
   $emailErr = "Invalid email format";
   }
  }


if (empty($_POST["password"]))
 {$passwordErr = "";}
else
 {$password = test_input($_POST["password"]);}

if (empty($_POST["gender"]))
 {$genderErr = "";}
else
 {$gender = test_input($_POST["gender"]);}

}

function test_input($data)
{
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
?>



<div class="signupitsfree" float="right">
<p class="signup">Sign Up<br />It's Completely Free!</p>


<form method="POST" name="signup" action="processform.php">

<label for="first name"></label><input id="first name" name="first_name" 
placeholder="First Name" type="text" value="<?php echo $first_name;?>" /> <span  
class="error">* <?php echo $first_nameErr;?></span>

<label for="last_name"></label><input id="last name" name="last_name"  
placeholder="Last 
Name" type="text" value="<?php echo $last_name;?>" />
<span class="error">* <?php echo $last_nameErr;?></span>
<br><br>


<label for="email"></label><input id="email" name="email" placeholder="Email"    
type="text" value="<?php echo $email;?>" />
<span class="error">* <?php echo $emailErr;?></span>
<br /><br />


<label for="password"></label><input id="password" name="password" 
placeholder="Create  
Password" type="password" />
<span class="error">* <?php echo $passwordErr;?></span>
<br /><br />
<label for="male"><strong>Male</strong></label> <input id="male" value="male" 
<?php if (isset($gender) && $gender=="male") echo "checked";?> 
name="gender" type="radio" /> 
<label for="female"><strong>Female</strong></label> <input id="female" value="female" 
<?php if (isset($gender) && $gender=="female") echo "checked";?> name="gender"  
type="radio" />
<span class="error">* <?php echo $genderErr;?></span>
<br /><br />
<label for="submit">"I Agree To <a href="#">Terms And Conditions"</a></label>  

   

//以下是'PROCESSFORM.PHP'

<?php

 $hostname="this is correct";
 $username="thisalso";
 $password="chicken";
 $dbname="chiken also";

  $db_conx = mysqli_connect($hostname, $username, $password) OR DIE ("Unable to
  connect to database! Please try again later.");

  if(mysqli_connect_errno()){
  echo mysqli_connect_error();
  exit();
  }

  $select = mysqli_select_db($db_conx,$dbname);

  $first_name= $_POST["first_name"];
  $last_name= $_POST["last_name"];
  $email= $_POST["email"];
  $password= $_POST["password"];
  $gender= $_POST["gender"];

  mysqli_query($db_conx,"INSERT INTO users (firstname, lastname, email, password,   gender)
  VALUES ('$first_name', '$last_name', '$email', '$password', '$gender')");
  mysqli_close($db_conx);

  header("Location: anotherpage.php")
  ?>

2 个答案:

答案 0 :(得分:4)

我们总是听到关于mysql*_real_escape_string()的捕获文件是以避免SQL注入,因此很明显有些人开发了自己的扭曲和复杂的系统来清理任何输入和思考:“好的,现在我的输入是”安全的“,我不再需要避免SQL注入”。

但这是错误的,仅仅因为mysql*_real_escape_string()和准备好的语句以避免SQL注入。它们适用于避免破坏查询(我知道,它们也适用于SQL注入,但因为 SLQ注入通过破坏查询并劫持它而工作,添加零件,删除其他人等)

看看你的代码:

  $first_name= $_POST["first_name"];
  $last_name= $_POST["last_name"];
  $email= $_POST["email"];
  $password= $_POST["password"];
  $gender= $_POST["gender"];

  mysqli_query($db_conx,"INSERT INTO users (firstname, lastname, email, password,   gender)
  VALUES ('$first_name', '$last_name', '$email', '$password', '$gender')");

现在,我是一个真诚而天真的用户,我甚至不知道注射是什么,所以我不是你不应该信任的用户。我注册到您的网站,我将数据放在那里:名称Ian,姓氏O'Really

什么?数据库错误?为什么呢?

就是这样。如果我在你的查询中添加一个引号,它会中断,因为引用结束不应该的字符串,并且你的数据库接收

INSERT INTO users (firstname, lastname, email, password,   gender)
  VALUES ('Ian', 'O'Really'

这是一个SQL语法错误。

这就是为什么我们需要转义功能,而不是因为忍者黑客总是潜伏来破坏我们的用户表并典当我们的服务器,但是因为我们不希望查询一旦被破坏语法字符放在错误的位置,没有转义。

验证转义无关

当您希望数据采用有效格式时 验证 :日期必须格式化为日期,用户名不能包含空格,密码必须是最小8个字符等。这些是 程序的有效输入(在我的应用程序中,我可能想要完全不同的规则),因此你验证它们。

另一方面,

转义 是允许插入控制字符而没有其原始含义,使它们成为没有特殊含义的常规字符:你逃脱{{1}所以它不会是标记的html开头并且是一个潜在的XSS问题,你可以转义引号以避免破坏查询,依此类推。

针对不同情况的不同事情,请记住这一点。

答案 1 :(得分:0)

是的,您确实需要转义字符串,因为您发送的信息对用户可见。所以举个例子。你有一个购物车系统。他们只需从URL添加项目即可。因此,如果您想使其安全,请使用转义字符串。

干杯, 杰西