- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个大问题。
我拥有一个带有成员(member)区的网站。我有一个竞争对手,经常黑客攻击成员(member)的帐户。
我为此聘请了一位安全专家。他修复了一些 sql 查询,但没有发现登录代码有任何问题。
真正的问题 - 如果有人输错了密码,它会自动插入到数据库中,这样我就能知道他提交了什么字符串。
DB上的密码是用MD5加密的。但同一个竞争对手入侵了我自己的帐户,当我更改密码时,他试图提交我最后的密码。所以现在我知道他确切地知道我的密码是什么。
我的密码非常长且棘手,它不可能存在于任何在线 MD5 保留中。
你知道问题出在哪里吗?他是如何破解这个的?他是怎么知道我的密码字符串的?
谢谢!
这是包含的 login.php 文件:
if(isset($_POST['login'])){
//Input filteren
$name = htmlspecialchars(addslashes($_POST['username']));
$ww = htmlspecialchars(addslashes($_POST['password']));
//Wachtwoord omzetten naar md5
$wwmd5 = md5($_POST['password']);
//Gegevens laden voor het foute inloggen.
$inlog_fout_sql = mysql_query("SELECT `datum`, `ip`, `spelernaam` FROM `inlog_fout` WHERE `ip`='".$_SERVER['REMOTE_ADDR']."' ORDER BY `id` DESC");
$inlog_fout = mysql_fetch_array($inlog_fout_sql);
$aftellen = 1200-(time()-strtotime($inlog_fout['datum']));
//Geen inlognaam ingevuld
if($_POST['username'] == '')
$inlog_error = $txt['alert_no_username'];
//Geen wachtwoord ingevoerd
elseif($ww == '')
$inlog_error = $txt['alert_no_password'];
//Is het wel drie keer mis gegaan
elseif((mysql_num_rows($inlog_fout_sql) >= 300) AND ($inlog_fout['ip'] === $_SERVER['REMOTE_ADDR']) AND ($aftellen > 0)) {
$inlog_error = $txt['alert_time_sentence'].' <span><script type="text/javascript">writetimer("'.$aftellen.'")</script></span>';
}
else{
if($aftellen < 0)
mysql_query("DELETE FROM `inlog_fout` WHERE `ip`='".$_SERVER['REMOTE_ADDR']."'");
// Gegevens laden om te kijken voor de gebruiker
$naam = $_POST['username'];
$gegevens_sql = mysql_query("SELECT `id`, `username`, `wachtwoord`, `premiumaccount`, `account_code` FROM `members` WHERE `username`='".$naam."'");
// Gegevens laden om te kijken voor de gebruiker
$gegeven_sql = mysql_query("SELECT `username`, `wachtwoord`, `account_code` FROM `members` WHERE `wachtwoord`='".$wwmd5."' AND `username`='".$naam."'");
$gegeven = mysql_fetch_array($gegevens_sql);
if(mysql_num_rows($gegevens_sql) == 0)
$inlog_error = $txt['alert_unknown_username'];
elseif($gegeven['username'] != $naam)
$inlog_error = $txt['alert_unknown_username'];
//Kijken of account niet is verbannen
elseif(mysql_num_rows(mysql_query("SELECT id FROM ban WHERE id = '".$gegeven['id']."'")) > 0)
$inlog_error = $txt['alert_account_banned'];
elseif(mysql_num_rows($gegeven_sql) == 0){
$datum = date("Y-m-d H:i:s");
mysql_query("INSERT INTO `inlog_fout` (`datum`, `ip`, `spelernaam`, `wachtwoord`)
VALUES ('".$datum."', '".$_SERVER['REMOTE_ADDR']."', '".$naam."', '".$ww."')");
if((mysql_num_rows($inlog_fout_sql) < 300) AND ($gegeven['wachtwoord'] != $wwmd5))
$inlog_error = 'סיסמא שגויה';
}
elseif($gegeven['account_code'] != 1)
$inlog_error = $txt['alert_account_not_activated'];
else{
//If Onthoud Check box is checked save cookie
setcookie("pa_1", $gegeven['username'], time()+(60*60*24*365));
setcookie("pa_2", $_POST['password'], time()+(60*60*24*365));
//Zorgen dat gebruiker weer 3 pogingen heeft.
mysql_query("DELETE FROM `inlog_fout` WHERE `ip`='".$_SERVER['REMOTE_ADDR']."'");
//tijd opslaan dat het lid inlogt, zodat de site weet dat hij online is.
$tijd = time();
mysql_query("UPDATE `members` SET `ip_ingelogd`='".$_SERVER['REMOTE_ADDR']."', `online`='".$tijd."' WHERE `username`='".$gegeven['username']."'");
//Datum opvragen
$date = date("Y-m-d H:i:s");
//Opslaan in de inlog_logs tabel
$queryloginlogs = mysql_query("SELECT `id` FROM `inlog_logs` WHERE `ip`='".$_SERVER['REMOTE_ADDR']."' AND `speler`='".$gegeven['username']."'");
if(mysql_num_rows($queryloginlogs) == "0"){
mysql_query("INSERT INTO `inlog_logs` (`ip`, `datum`, `speler`)
VALUES ('".$_SERVER['REMOTE_ADDR']."', '".$date."', '".$naam."')");
}
else
mysql_query("UPDATE `inlog_logs` SET `datum`='".$date."' WHERE `speler`='".$gegeven['username']."' AND `ip`='".$_SERVER['REMOTE_ADDR']."'");
//zet naam in variabele, zodat het later nog gebruikt kan worden
$_SESSION['id'] = $gegeven['id'];
$_SESSION['naam'] = $gegeven['username'];
//Hash opslaan
$_SESSION['hash'] = md5($_SERVER['REMOTE_ADDR'].",".$gegeven['username']);
//Ben je wel premium
if($gegeven['premiumaccount'] > 0)
$_SESSION['userid'] = $gegeven['id'];
//naar de ingame pagina sturen
header('location: ?page=home');
}
}
}
最佳答案
我至少可以看到攻击者可以使用您的代码读取您的密码的一种方法,不会破坏 MD5 哈希值。
$naam = $_POST['username'];
. . .
$gegevens_sql = mysql_query("SELECT `id`, `username`, `wachtwoord`, `premiumaccount`, `account_code` FROM `members`
WHERE `username`='".$naam."'");
您正在将 $_POST['username']
插入 SQL 查询中,而根本没有对其进行保护。
不——等等,我错了。他们可以在您显示的代码中的至少两个位置进行 SQL 注入(inject)攻击,但我不知道他们如何读取密码,因为以下代码:
elseif($gegeven['username'] != $naam)
$inlog_error = $txt['alert_unknown_username'];
他们无法将明文密码提取到 $gegeven['username']
和通过此 if 测试。
不过,您的代码容易受到 SQL 注入(inject)攻击这一事实是一个巨大的危险信号。如果您习惯将 $_POST 变量直接复制到查询中,那么他们可能会通过另一种方式在您的应用程序的其他部分利用它,但我们在这里没有看到。
建议:
@EPB 建议重置数据库中的所有密码。
询问您的安全分析师为什么他们没有发现这一点。
切勿存储明文密码。
关于php - 如何获取md5加密的密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21896549/
我想在 md-toolbar 中使用 mf-tabs,我使用 Sithdown 在 https://github.com/angular/material/issues/1076 中提供的解决方案 它
我是新手,我设法用服务提供的数据实现了我的 md-table。现在我正在尝试实现过滤器、排序和分页功能,但我认为我做错了什么。 这是我的组件: import { Component, OnInit,
我必须打开一个 md-dialog,其中包含一个带有两个选项卡的 md-tab-group。 md-dialog 可以从两个按钮打开,这两个按钮应该打开相应的选项卡。打开 md-dialog 的模板:
我正在尝试做这样的事情: {{item}}
我正在尝试使用 md-datepicker 遍历一个月的时间间隔,因此我创建了这个 codepen 示例以便更好地演示: http://codepen.io/anon/pen/ygBGOg 当单击“P
这是关于 Codepen 的例子. 我正在设置 md-row-height="30px" 然后计算 md-rowspan 使其等于元素数 + 1。(头部加一) {{ t
当我频繁切换 md-tabs 时,Md-tabs 切换正确但多个 md-tab-item 元素同时具有“md-active”类,所以我看不到选项卡的内容是事件的,因为它与其右侧选项卡的内容重叠。 据我
我想将操作放在同一数据行上,我有两个操作,为此我使用按钮和图标作为下面的代码。 {{item.codigo}} {{it
在我的对象列表中,我可以激活/非事件对象。因此,一个图标执行事件操作,另一个图标执行非事件操作,并且两者都在同一个 md-list 中。 This is what i'm tring to do 代码
如前所述 Angular-Material md-autocomplete's documentation : The md-autocomplete uses the the md-virtual-
我也在使用 Angular 1 和 Angular Material 。我想在 ng-repeat 中使用 md-subheader 和多个 md-virtual-repeat-container。您
我正在使用 Angular Material 。 当我创建自己的指令并将其添加到 md-tab-label 时,例如 Label 然后自定义指令也应用于一些“md-dummy-tab”。 但是
我在我的项目中使用 Angular Material 有一段时间了。在使用 md-select 时,我遇到了一个问题,即出现重复的 md-option 值错误。 我知道 md-options 采用唯一
我正在根据单选按钮选择设置自动完成验证 md-require-match = true/false。 默认验证是 md-require-match = true 这样用户应该从自动完成列表中选择一个项
这个问题在这里已经有了答案: Changing capitalization of filenames in Git (11 个答案) 关闭 3 年前。 我使用“readme.md”创建了我的存储库
Github有办法吗?在例如 README.md 中包含 md 文件? # Headline Text [include](File:load_another_md_file_here.md) 它不应
我正在使用 AngularJs 开发这个动态过滤系统,并试图找出如何将 color 和 size 选项转换为在两个下拉列表中(每个类别一个)。 我尝试了以下代码,该代码成功添加了下拉列表以及选择框中的
var app = angular.module('tabsDemo', ['ngMaterial']); app.controller('TabsController',tabsController
在 md-tab 指令内嵌套 md-select 和搜索输入时遇到问题。 有两个问题: 选择框展开后,必须向上滚动才能查看搜索输入 搜索输入实际上不接受任何文本 我做了一个codepen为了更好地说明
我正在尝试处理这个片段,其中自动完成功能嵌入在芯片中。但从自动完成中选择的项目不会转换为筹码。 自动完成的数据采用以下方式:{name:"John Doe", id:"1"} 哪里错了,请指教。 问候
我是一名优秀的程序员,十分优秀!