我的登录系统安全吗?

时间:2016-02-05 02:18:41

标签: php sql

我已经做到了:

<?php

// Establishing Connection with Server by passing server_name, user_id and password as a parameter
$connection = mysql_connect("localhost", "root", "");
// Selecting Database
$db = mysql_select_db("cavallo", $connection);
session_start(); // Starting Session
// Storing Session
$user_check = $_SESSION['login_user'];
// SQL Query To Fetch Complete Information Of User
$ses_sql = mysql_query("select username from login where username='$user_check'", $connection);
$row = mysql_fetch_assoc($ses_sql);
$login_session = $row['username'];
if (!isset($login_session)) {
    mysql_close($connection); // Closing Connection
    header('Location: index.php'); // Redirecting To Home Page
}
?>

这是我做的一个会议的协议,我担心它不安全。

你认为有办法破解这种方法吗?

login.php文件:https://gist.github.com/anonymous/d7db3ea76fc4258d6512

更新:我使用在线指南重新创建了所有脚本,以便安全登录。谢谢帮助我并报告问题

4 个答案:

答案 0 :(得分:2)

将密码存储为字符串并不安全。

Read this。我认为这对你有帮助。

阅读更多关于SQL注入,密码哈希,使用带密码的盐,会话劫持的信息。

答案 1 :(得分:1)

没有。这是非常不安全的。

按照以下步骤保护您的登录系统:

  1. 以哈希格式存储密码,以便您的员工无法看到您的用户密码。

    • 如何哈希密码:

      一个。获取用户密码并立即哈希。

      $password = $_POST['password'];
      $password = hash('sha256',$password);
      

      湾将此哈希密码存储在您的数据库中。

  2. 现在如何检查用户凭证。

    $username = $_POST['username'];
    $password = $_POST['password'];
    
    settype($username,"string");
    $password = hash('sha256',$password);
    
    $stmt = $dbConnection->prepare('SELECT * FROM login WHERE username = ? and password = ?');
    $stmt->bind_param('s', $username,$password);
    
    $stmt->execute();
    
    $result = $stmt->get_result();
    while ($row = $result->fetch_assoc()) {
        // do something with $row
    }
    

答案 2 :(得分:1)

攻击者无法使用预准备语句和参数化查询来注入恶意SQL。 您可以通过PDO和Mysqli查询来尝试。

PDO的例子

PDO是您传递给prepare的SQL语句由数据库服务器解析和编译。

//setting up connection
$dbconn = new PDO('mysql:dbname=dbname;host=127.0.0.1;charset=utf8', 'root', '');
//prepare query
$user_check=$_SESSION['login_user'];
$prepareQuery = $db->prepare('INSERT INTO table (column) VALUES (:column)');

$perpareQuery->execute(array('column' => $user_check));

foreach($perpareQuery as $row) {

 }

答案 3 :(得分:0)

我发现了一个基本错误:您只是检查用户名是否存在 - 您甚至都没有查看输入密码。因此,如果我输入任何现有用户的用户名,您的登录页面将授予我访问权限。至少修复那个bug;然后去看看其他人提到的其他问题(SQL注入,没有密码哈希)。