需要帮助才能使logged.php安全吗

3pvhb19x  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(235)

这个问题在这里已经有答案了

如何防止php中的sql注入(28个答案)
你能用php安全地存储密码吗[重复](4个答案)
在php变量或php常量中以纯文本形式存储密码可以吗(8个答案)
两年前关门了。
我知道我必须使用pdo,但我现在不能更新它,因为旧版本中有大量php文件。如何使我的代码安全并防止sql注入?

$myusername=$_POST['myusername']; 
 $mypassword=$_POST['mypassword']; 

 $sql="SELECT * FROM user WHERE username='$myusername' AND password='$mypassword'";
 $result=mysql_query($sql);
 $count=mysql_num_rows($result);

 if($count==1)
 {
      $_SESSION["myusername"]=$myusername;

      echo"<script type='text/javascript'>
      window.location.href='dashboard.php';
      </script>";
 }
 else
 {
      $sql="SELECT * FROM user WHERE email='$myusername' AND password='$mypassword'";
      $result=mysql_query($sql);
      $count=mysql_num_rows($result);

      if($count==1)
      {
           $sql="SELECT username FROM user WHERE email='$myusername'";
           $result=mysql_query($sql);
           $myusername=mysql_result($result,0);

           $_SESSION["myusername"]=$myusername;

           echo"<script type='text/javascript'>
           window.location.href='dashboard.php';
           </script>";
      }
      else
      {
           echo"<script type='text/javascript'>
           alert('The username or password you entered is incorrect');
           window.location.href='login.php';
           </script>";
      }
 }
9bfwbjaz

9bfwbjaz1#

安全是个大字,。。。。正如您自己所建议的,您实际上不应该使用这些方法,而是应该升级到这些函数不推荐使用的地方。
但是现在。。这很有帮助

$sql=sprint("SELECT username FROM user WHERE email='%s'", mysql_real_escape_string($myusername));

http://php.net/manual/en/function.mysql-real-escape-string.php
http://php.net/manual/en/function.sprintf.php
在任何地方都要这样做,使用变量/输入数据,用于查询。

d4so4syb

d4so4syb2#

这是一个非常宽泛的问题,但我还是会尽力帮助你的。
一般信息 mysql_ 函数已被弃用并从php7中完全删除,因此不要使用它们。
您的代码不受sql注入的保护,请使用准备好的语句和函数bind_param()绑定查询参数。
我已经用准备好的语句和错误处理重写了你的代码。我将张贴在下面的结果,因为它是相当大的。
您不会散列您的密码,并将其作为纯文本存储在数据库中。这是一个重大的安全风险!
创建一个这样散列密码的函数。

function hashPassword($passwordToHash) {
    return password_hash($passwordToHash, PASSWORD_DEFAULT);
}

一个函数来验证它们。

function verifyPassword($passwordToVerify, $hash) {
    if(password_verify($passwordToVerify, $hash)) {
        return true;
    } else {
        return false;
    }
}

表单验证
你不做任何形式的验证,这意味着人们可以只注册用户名 ; DROP TABLE user 它可以删除你的用户表。
通过编写基本函数来检查输入是否包含特殊字符,您可以阻止它。

function isAlphaNumeric($stringToValidate) {
    if(ctype_alnum($stringToValidate)) {
      return true;
    } else {
      return false;
    }
}

然后你就可以验证 $_POST 像这样的输入。

if(!isAlphaNumeric($_POST['myusername']) || !isAlphaNumeric($_POST['mypassword'])) {
    $error = [
        'error' => 'Special characters are not allowed.',
        'class' => 'your class for error handling',
    ];
}

这是用准备好的语句和错误处理重写的代码。

$name = "root";
$pass = "";
$db = "yourDB";
$host = "localhost";

$connect = mysqli_connect($host, $name, $pass, $db);

if (mysqli_connect_errno()) {
  echo "Could not connect to database. Error: " . mysqli_connect_error();
}

$stmt = $connect->prepare('SELECT * FROM `user` WHERE username = ? AND password = ?');

if(!$stmt) {
  $error = [
    'error' => 'Something went wrong, please contact the administrator',
    'class' => 'your class for error handling'
  ];
}

$username = $_POST['myusername'];
$password = $_POST['mypassword'];

if(!$stmt->bind_param('ss', $username, $password)) {
  $error = [
    'error' => 'Something went wrong, please contact the administrator',
    'class' => 'your class for error handling'
  ];
}

if(!$stmt->execute()) {
  $error = [
    'error' => 'Something went wrong, please contact the administrator',
    'class' => 'your class for error handling'
  ];
} else {
  $stmt->get_result();
  $rows = $stmt->num_rows();

  if($rows > 0) {
    $_SESSION['myusername'] = $username;
    header('Location: dashboard.php');
  } else {
    $stmt = $connect->prepare('SELECT * FROM `user` WHERE email = ? AND password = ?');

    if(!$stmt) {
      $error = [
        'error' => 'Something went wrong, please contact the administrator',
        'class' => 'your class for error handling'
      ];
    }

    if(!$stmt->bind_param('ss', $username, $password)) {
      $error = [
        'error' => 'Something went wrong, please contact the administrator',
        'class' => 'your class for error handling'
      ];
    }

    if(!$stmt->execute()) {
      $error = [
        'error' => 'Something went wrong, please contact the administrator',
        'class' => 'your class for error handling'
      ];
    } else {
      $stmt->get_result();
      $rows = $stmt->num_rows();

      if($rows > 0) {
        $_SESSION['myusername'] = $username;
        header('Location: dashboard.php');
      } else {
        $error = [
          'error' => 'The username or password you entered is incorrect.',
          'class' => 'your class for error handling'
        ];
      }
    }
  }
}
eit6fx6z

eit6fx6z3#

使用可以使用

$myusername=mysql_real_escape_string(htmlspecialchars($_POST['myusername'])); 
 $mypassword=mysql_real_escape_string(htmlspecialchars($_POST['mypassword']));

而不是

$myusername=$_POST['myusername']; 
 $mypassword=$_POST['mypassword'];

添加这个小查询后,管理员页面无法绕过。这个页面会给你一个错误信息。但是试着把你的代码更新到最新版本

相关问题