【问题标题】:Need help with some SQL需要一些 SQL 的帮助
【发布时间】:2010-10-23 14:32:12
【问题描述】:
<?php

if (isset($_POST['email'])) {

$email = mysql_real_escape_string($_POST['email']);
$password = mysql_real_escape_string($_POST['password']);

mysql_query("INSERT INTO accounts (email, password) VALUES ('$email', '$password')");

}

?>


<h1>Create Account</h1>

<form action="" method="post">
<table cellspacing="3">

<tr>
 <td valign="top">E-mail address:</td>
 <td><input type="text" name="email" size="28"></td>
</tr>

<tr>
 <td valign="top">Password:</td>
 <td><input type="text" name="password" size="28"></td>
</tr>

<tr>
<td colspan="2" align="center">
  <input type="submit" value="Submit">
</td>
</tr>

</table>
</form>

如何防止人们只输入空格并插入空条目? :/ 您是否发现任何其他潜在威胁?

谢谢。 /新手

【问题讨论】:

    标签: php sql


    【解决方案1】:

    您应该在调用任何 SQL 之前对字段进行验证,以防止不需要的条目以及 SQL 注入。

    您可能还想对密码长度/强度、电子邮件的正则表达式等进行一些检查。

    现在有人可以在您的代码中输入任何内容。

    此外,您是否也在 DB 端处理具有唯一电子邮件/用户名约束的重复条目?

    编辑 - 看起来你可能已经用 mysql_real_escape_string 覆盖了 SQL 注入

    【讨论】:

      【解决方案2】:

      您可以修剪这些值并检查空字符串,然后向用户询问真实的电子邮件地址。您还可以将正则表达式用作某些验证的一部分。最后,我不确定如何使用 PHP 来实现这一点,但您可以参数化 SQL。

      【讨论】:

        【解决方案3】:
        if(!empty($_POST['email']) && !empty($_POST['password'])){
          $email = trim($_POST['email']); // Remove trailing and leading spaces
          $password = trim($_POST['password']); 
          if( $email != "" && $password != ""){
            $email = mysql_real_escape_string($email);
            $password = mysql_real_escape_string($password);
            mysql_query("INSERT INTO accounts (email, password) VALUES ('$email', '$password')");
          } else {
            //DISPLAY ERROR MSG
          }
        }
        

        【讨论】:

        • 另外,永远不要在数据库中存储明文密码,你应该 md5() 或 sha1() 他们。
        • 使用正则表达式验证电子邮件地址。散列密码。
        【解决方案4】:

        您应该考虑可用性和安全性。

        为了可用性:添加 javascript-validators,当用户以错误的格式写电子邮件等时,它会为用户显示一些工具提示。

        为了安全:您应该在执行插入查询之前验证数据,验证器可以与 js-validators 相同(但“智能”用户可以简单地在浏览器中禁用 javascript)

        【讨论】:

          【解决方案5】:

          正如 schooner 所说,您应该在调用 sql 查询之前验证字段。我认为保留一个包含用于验证字段的常用函数的文件是一种很好的做法,因此您可以在代码中多次重用此函数。可以使用正则表达式进行此验证。我给你留了一个例子。

          function checkEmail($email) 
          {
            if(preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])
                         *@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/",
                         $email)){
          
              return true;
            }
            return false;
          }
          

          另外...如果您需要验证大量输入条目,也许您会对在 php 中搜索开放源代码验证库感兴趣。

          【讨论】: