我正在使用以下代码在我的服务器中登录和创建会话。反正黑客可以打破这个吗?这里jp_objects是类。
if (isset($_POST['username'])) {
$username = $_POST['username'];
$password = md5($_POST['password']);
$check_login = new jp_objects('id','users',"username = '".$username."' AND password = '".$password."'",'','');
if ($check_login->nbResults != '0') {
$_SESSION['user_id'] = $check_login->results[0]->id;
header("Location: home.php");
} else {
$message = '<span class="label label-danger">Please enter your correct password.</span>';
}
}
感谢您的帮助。
答案 0 :(得分:2)
不,您的代码有SQL注入漏洞。您不能过滤$ _POST [&#39;用户名&#39;]。
尝试将admin';--
(或其他真实用户名)放入您的登录表单,我认为您已经登录而没有密码。
答案 1 :(得分:0)
使用数据错误检查和验证始终符合您的最佳利益。
实施例。 $username = $_POST['username'];
$password = md5($_POST['password']);
$check_login = new jp_objects('id','users',"username = '".$username."' AND password = '".$password."'",'','');
应该进行一些错误检查或验证,例如
$username = $_POST['username'];
if((strlen($username)>20)||!(is_string($username)){
header("Location: LOCATION TO REDIRECT");
}
$password = md5($_POST['password']);
$check_login = new jp_objects('id','users',"username = '".$username."' AND password = '".$password."'",'','');
没有什么是“黑客证明”,但检查数据不一致是一种很好的做法。以上只是确保字符串不超过20个字符并且是字符串的示例。
答案 2 :(得分:0)
除了SQL注入的漏洞之外,您还没有使用密码,许多人认为MD5不应再用于加密目的。
以下是使用salt哈希密码的文档:http://www.php.net/manual/en/faq.passwords.php
答案 3 :(得分:0)
不,这是非常不安全的。
您没有消毒您的输入。来自外部(即来自用户甚至服务)的任何数据应始终清理并保证安全。这可以使用filter
扩展名来完成(filter_input()
功能更具体)。
$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
$password = filter_input(INPUT_POST, 'username', FILTER_UNSAFE_RAW);
您应该使用预先准备好的语句,这会增加一层安全性。它们可以防止您的查询容易受到SQL injections的攻击。您的数据库实现隐藏在课程后面,因此您必须自己解决这个问题。
使用md5()
哈希密码并不安全。使用免费的密码破解程序,最多需要几秒钟才能打破大多数MD5哈希密码。您应该使用password extension
来填充密码。如果你使用PHP&lt; 5.0.0然后您可以使用由compatibility library先生维护的Anthony Ferrara。
$password = password_hash($password, PASSWORD_BCRYPT);
您向我们展示的代码看起来像是来自更大脚本的代码段。如果是这样,那么您还应该在重定向用户后终止脚本。设置Location
标头后,使用exit;
停止脚本继续运行。在重定向时,使用绝对路径(给出页面的完整路径,使用/
前缀)也是一个好主意。
header("Location: /home.php");
exit;