我已经做了这个:
<?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
}
?>
这是我制定的会话协议,我担心它不安全。
你认为有办法破解这种方法吗?
登录.php文件: https://gist.github.com/anonymous/d7db3ea76fc4258d6512
更新:我使用在线指南重新创建了所有脚本以进行安全登录.感谢您帮助我并报告了问题
将
密码存储为字符串并不安全。
阅读此内容。我认为这可能会对你有所帮助。
并阅读有关SQL注入,密码散列,使用带有密码的盐,会话劫持的更多信息。
攻击者不可能使用预准备语句和参数化查询注入恶意 SQL。您可以通过PDO和Mysqli查询进行尝试。
PDO示例
PDO 是您传递给准备的 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) {
}
否,这是非常不安全的。
请按照以下步骤保护您的登录系统:
-
以哈希格式存储密码,以便您的员工看不到您的用户密码。
-
如何对密码进行哈希处理:
a. 获取用户密码并立即对其进行哈希处理。
$password = $_POST['password']; $password = hash('sha256',$password);
b. 将此哈希密码存储在数据库中。
-
-
现在如何检查用户凭据。
$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 }
我看到一个基本错误:您只检查用户名是否存在 - 您甚至没有查看输入密码。因此,如果我输入任何现有用户的用户名,您的登录页面将授予我访问权限。至少修复该错误;然后去看看其他人提到的其他问题(SQL注入,没有密码哈希)。