Php 登录表单的简单sql注入解决方案?

Php 登录表单的简单sql注入解决方案?,php,sql,login,code-injection,Php,Sql,Login,Code Injection,我看到了一些示例和使用这种方式以登录表单查询数据库的人。 我不完全确定这是安全登录表单的最佳方式 这是PHP中的查询: $query = "SELECT * FROM users WHERE usern = '".$_POST['username']."' AND passw = '".md5($_POST['password'])."'"; 密码上有md5()是否足以避免sql注入?。 我认为md5函数将把所有字符和sql字符串转换成32个字符的字符串 还有哪些方法可以保护登录表单?

我看到了一些示例和使用这种方式以登录表单查询数据库的人。 我不完全确定这是安全登录表单的最佳方式

这是PHP中的查询:

    $query = "SELECT * FROM users WHERE usern = '".$_POST['username']."' AND passw = '".md5($_POST['password'])."'";
密码上有md5()是否足以避免sql注入?。 我认为md5函数将把所有字符和sql字符串转换成32个字符的字符串


还有哪些方法可以保护登录表单?

在让数据靠近数据库之前,您必须清理数据。最简单的方法是使用
mysql\u real\u escape\u字符串($\u POST['username'])
,但这只是您需要做的最起码的事情

如果您使用的是像CodeIgniter这样的框架,那么您可以使用它们的内置功能来剥离$\u POST或$\u GET输入的任何XSS风险。否则,我推荐这些帖子:


在让数据靠近数据库之前,您必须对数据进行清理。最简单的方法是使用
mysql\u real\u escape\u字符串($\u POST['username'])
,但这只是您需要做的最起码的事情

如果您使用的是像CodeIgniter这样的框架,那么您可以使用它们的内置功能来剥离$\u POST或$\u GET输入的任何XSS风险。否则,我推荐这些帖子:


    • mysql\u real\u escape\u字符串($\u POST['username'])

      尽管最好使用
      mysqli
      扩展并使用准备好的语句

      (假设您使用的是MySQL)

      编辑:对于下面的评论,最好将其用于
      之类的
      查询:


      addcslashes(mysql\u real\u escape\u string($\u POST['username']),'%\u')
      mysql\u real\u escape\u string($\u POST['username'])

      尽管最好使用
      mysqli
      扩展并使用准备好的语句

      (假设您使用的是MySQL)

      编辑:对于下面的评论,最好将其用于
      之类的
      查询:


      addcslashes(mysql\u real\u escape\u string($\u POST['username']),“%”
      您还需要转义
      $\u POST['username']

      是的,
      md5
      将保护您免受sql注入的影响

      对于这个例子,类似这样的东西就可以了

      $query = "SELECT * FROM users WHERE MD5(usern) = '".md5($_POST['username'])."' AND passw = '".md5($_POST['password'])."'";
      

      您还需要转义
      $\u POST['username']

      是的,
      md5
      将保护您免受sql注入的影响

      对于这个例子,类似这样的东西就可以了

      $query = "SELECT * FROM users WHERE MD5(usern) = '".md5($_POST['username'])."' AND passw = '".md5($_POST['password'])."'";
      

      您轻松构建查询的方式允许在用户名中插入代码片段。您可以使用准备好的语句来避免:


      准备好的语句基本上会描述语句的结构,然后添加数据。这样,用户就不能用输入数据改变语句的结构

      您轻松构建查询的方式允许在用户名中插入代码片段。您可以使用准备好的语句来避免:


      准备好的语句基本上会描述语句的结构,然后添加数据。这样,用户就不能用输入数据改变语句的结构

      如果你做了一个函数,它可以清理所有帖子,让你变得安全

      function clean() { 
          foreach($_POST as $key => $val) { 
              $_POST[$key] = mysql_real_escape_string($val);
          } 
      }
      

      您也可以使用变量,PDO将自动清除。

      如果您创建一个函数来清理所有帖子并确保您是安全的

      function clean() { 
          foreach($_POST as $key => $val) { 
              $_POST[$key] = mysql_real_escape_string($val);
          } 
      }
      
      <?php
      
      try {
          $dbh = new PDO("mysql:host=$hostname;dbname=$db", $dbusername, $dbpassword);
      
          $query = "SELECT * FROM users WHERE usern = ? AND passw = ?";
          $sth=$dbh->prepare($sql);
          $sth->execute(array($_POST['username'], md5($_POST['password']));
          $result =  $sth->fetch();
      }
      } catch(PDOException $e) {
          echo $e->getMessage();
          exit;
      }
      

      也可以使用变量,PDO将自动清除。

      只有一个简单的解决方案将参数用于用户名和密码等字段,这样SQL命令字符串将从参数中分离发送,然后攻击者将只得到空白响应。使用参数时,SQL命令字符串将与参数分开进行分析和编译。使用准备好的语句是最好的解决方案。

      只有一个简单的解决方案,即对用户名和密码等字段使用参数,以便SQL命令字符串与参数分开发送,然后攻击者只会得到空白响应。使用参数时,SQL命令字符串将与参数分开分析和编译。使用准备好的语句是最好的解决方案。

      +1对于准备好的语句-最好将要插入的数据作为数据传递,而不是将编写的SQL字符串与来自准备好的语句的userdefinally+1的不受信任字符串混合在一起。。。请注意,“mysql\u real\u escape\u string()”不会转义“%”。查看php.net/manual/en/function.mysql-real-escape-string.phpYes中的notes部分,尽管这只是像使用
      一样使用
      时的问题。您可以使用
      addcslashes()
      来帮助实现这一点。+1用于准备好的语句-将要插入的数据作为数据传递比将您编写的SQL字符串与来自userdefinally+1的不受信任字符串混合用于准备好的语句要好得多。。。请注意,“mysql\u real\u escape\u string()”不会转义“%”。查看php.net/manual/en/function.mysql-real-escape-string.phpYes中的notes部分,尽管这只是像使用
      一样使用
      时的问题。你可以使用
      addcslashes()
      来帮助解决这个问题。我知道这不是一个好主意,在问题的上下文中回答,但不是比较用户名,而是比较md5的用户名。至少,这样,您就不必担心登录时的注入。直到他尝试执行
      插入
      更新
      设置
      用户n
      :)“我知道这不是一个好主意,”在问题的上下文中回答说,但不是比较用户名,而是比较md5的用户名。至少,这样你就不必担心登录时的注入。直到他尝试执行
      插入
      更新
      设置
      用户名之前,
      <?php
      
      try {
          $dbh = new PDO("mysql:host=$hostname;dbname=$db", $dbusername, $dbpassword);
      
          $query = "SELECT * FROM users WHERE usern = ? AND passw = ?";
          $sth=$dbh->prepare($sql);
          $sth->execute(array($_POST['username'], md5($_POST['password']));
          $result =  $sth->fetch();
      }
      } catch(PDOException $e) {
          echo $e->getMessage();
          exit;
      }