我想知道什么可以让用户破解我的网站,他们改变了我的用户名,个人信息和密码。有人可以给我一些关于它可能是什么的建议。我正在使用PHP MySQL和HTMLPURIFIER。
这是登录脚本。
<?php
if (isset($_POST['submitted'])) { // start of submit conditional.
require_once (MYSQL);
// Validate the username or email address:
if (!empty($_POST['login']) && strlen($_POST['login']) <= 255) {
$e = mysqli_real_escape_string($dbc, $purifier->purify(strip_tags($_POST['login'])));
} else if(!empty($_POST['login']) && strlen($_POST['login']) >= 256) {
$e = FALSE;
echo '<p>Your username or email address cannot exceed 255 characters!</p>';
} else {
$e = FALSE;
echo '<p>You forgot to enter your username or email address!</p>';
}
// Validate the password:
if (!empty($_POST['pass']) && strlen($_POST['pass']) <= 255) {
$p = mysqli_real_escape_string($dbc, $_POST['pass']);
} else if(!empty($_POST['pass']) && strlen($_POST['pass']) >= 256) {
$p = FALSE;
echo '<p>Your password cannot exceed 255 characters!</p>';
} else {
$p = FALSE;
echo '<p>You forgot to enter your password!</p>';
}
if(($e != FALSE) && ($p != FALSE)) { // check pass
$pass_salt = "SELECT users.password, users.salt FROM users JOIN contact_info ON contact_info.user_id = users.user_id WHERE (contact_info.email = '" . $e . "' OR users.username = '" . $e . "') AND users.active IS NULL";
$ph = mysqli_query($dbc, $pass_salt) or trigger_error("Query: $pass_salt\n<br />MySQL Error: " . mysqli_error($dbc));
while($row = mysqli_fetch_array($ph)){
$password = $row['password'];
$salt = $row['salt'];
}
if(!empty($salt)) {
$sha512 = hash('sha512', $p . $salt);
}
if(!empty($password) == !empty($sha512)){
$user_pass = TRUE;
} else {
$user_pass = FALSE;
}
}
if(isset($user_pass) && ($user_pass == TRUE) && !empty($salt)) { // If everything's OK.
// Query the database:
$q = "SELECT users.user_id, users.first_name, users.user_level FROM users JOIN contact_info ON contact_info.user_id = users.user_id WHERE (contact_info.email = '" . $e . "' OR users.username = '" . $e . "') AND users.password = '" . $sha512 . "' AND users.active IS NULL";
$r = mysqli_query ($dbc, $q) or trigger_error("Query: $q\n<br />MySQL Error: " . mysqli_error($dbc));
if (@mysqli_num_rows($r) == 1) { // A match was made.
// Register the values & redirect:
$_SESSION = mysqli_fetch_array ($r, MYSQLI_ASSOC);
// check if user is logged in then update the old login date
$u = "UPDATE users JOIN contact_info ON contact_info.user_id = users.user_id SET users.last_login = NOW(), users.deletion = 0, users.deletion_date = NULL WHERE (contact_info.email = '" . $e . "' OR users.username = '" . $e . "') AND users.password = '" . $sha512 . "' AND users.active IS NULL";
// save the info to the database
$r = mysqli_query ($dbc, $u);
mysqli_free_result($r);
mysqli_close($dbc);
$url = BASE_URL . 'home/index.php'; // Define the URL:
header("Location: $url");
exit(); // Quit the script.
} else { // No match was made.
echo '<p>Either your username, email address or password entered do not match those on file or you have not yet activated your account.</p>';
}
} else { // If everything wasn't OK.
echo '<p>Please try again.</p>';
}
mysqli_close($dbc);
} // end of submit conditional.
?>
答案 0 :(得分:2)
您应该了解SQL注入。这是我首先想到的(注意到MySql的使用)。为防止出现这种情况,您必须使用mysql_real_escape_string()
(被视为已弃用的mysql_escape_string()
)来清理用户输入。尽管有这个解决方案,我建议你使用PDO或Mysqli(我通常不鼓励这个),以便通过使用Prepared Statements来解决SQL注入问题。
然后你应该知道XSS(跨站点脚本)可能会在你的代码中“注入”某种恶意Javascript脚本。您可以使用htmlspecialchars()
稍微解决此问题,使HTML标记(例如<script>
)不被视为HTML标记。
另请查看此Vulnerability list for PHP。
<强> P.S。强>
为了让您的代码更具可读性和“正确”,我建议您将strlen($_POST['login']) >= 256
更改为strlen($_POST['login']) > 255
,这是相同的,但会让读者立即明白实际限制不是{ {1}} 256
。
答案 1 :(得分:0)
首先,确保它们无法执行SQL注入。这可能就是他们所做的。这通常是由执行的输入字段引起的。这样做的人只需输入一个SQL命令。
您可以查看有关此here的详细信息。
哦,欢迎来到StackOverflow.com!我希望你喜欢这个网站!
答案 2 :(得分:0)
除了DalexL答案,请检查您是否有强密码才能连接到数据库。
答案 3 :(得分:0)
我很确定原始海报不会发生这种情况,但众所周知,欺骗性公司会向拥有网站的公司发送“账单”。 “账单”中的细则将域名从公司转移到欺骗性公司。
以下是一个示例:Domain Registry of America scam
答案 4 :(得分:0)
如果您允许用户上传图片,您可能是GIF漏洞的受害者。如果您的服务器设置不安全,查看包含嵌入式PHP代码的GIF将执行代码。检查您的系统上是否可以找到任何.gif.php(或.php.gif)文件,如果黑客忘记自行清理,它们可能仍在那里。
答案 5 :(得分:0)
如果为所有面向数据库的输入正确实现了HTMLPURIFIER,那么您应该评估传输登录的方式。您是否在客户端提交之前进行预先散列。
我认为原因是表单上有一个未经过滤的输入,它允许一些SQL注入代码。