Php 如何获得使用md5加密的密码

Php 如何获得使用md5加密的密码,php,mysql,sql,encryption,Php,Mysql,Sql,Encryption,我有个大问题 我拥有一个有会员区的网站。 我有一个竞争对手,一直在攻击会员的帐户 我为此雇了一位安全专家。他修复了一些sql查询,但没有发现登录代码有任何问题 真正的问题是——如果有人自动地弄错了密码,它就会被插入数据库,这样我就可以知道他提交了什么字符串 数据库上的密码是用MD5加密的。但同一个竞争对手入侵了我自己的帐户,当我更改密码时,他试图提交我的最后一个密码。所以现在我知道了一个事实,他确切地知道我的密码是什么 我的密码很长,而且很复杂,不可能出现在任何MD5在线预订中 你知道有什么问题

我有个大问题

我拥有一个有会员区的网站。 我有一个竞争对手,一直在攻击会员的帐户

我为此雇了一位安全专家。他修复了一些sql查询,但没有发现登录代码有任何问题

真正的问题是——如果有人自动地弄错了密码,它就会被插入数据库,这样我就可以知道他提交了什么字符串

数据库上的密码是用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');
    }
  }
}
if(isset($\u POST['login'])){
//输入滤波器
$name=htmlspecialchars(addslashes($\u POST['username']);
$ww=htmlspecialchars(addslashes($_POST['password']);
//Wachtwoord omzetten naar md5
$wwmd5=md5($_POST['password']);
//格格芬在洛根有一辆卡车。
$inlog\u fout\u sql=mysql\u查询(“从`inlog\u fout`中选择`datum`、`ip`、`spelernaam`,其中`ip`=”。$\u服务器['REMOTE\u ADDR']。“'ORDER BY`id`DESC”);
$inlog\u fout=mysql\u fetch\u数组($inlog\u fout\u sql);
$aftellen=1200-(time()-strotime($inlog_fout['datum']);
//吉恩因洛格纳姆因格沃德
如果($_POST['username']='')
$inlog_error=$txt['alert_no_username'];
//金·瓦赫特伍德·英格沃德
elseif($ww=='')
$inlog_error=$txt['alert_no_password'];
//他是不是很好
elseif((mysql\u num\u rows($inlog\u fout\u sql)>=300)和($inlog\u fout['ip']===$\u SERVER['REMOTE\u ADDR'])和($aftellen>0)){
$inlog_error=$txt['alert_time_SENTURE'].'writetimer(“.$aftellen.”);
}
否则{
如果($aftellen<0)
mysql_查询(“从'inlog_fout'中删除,其中'ip`='”。$\u服务器['REMOTE_ADDR'].'”);
//Gegevens装载在kijken voor de gebruiker上
$naam=$_POST['username'];
$gegevens\u sql=mysql\u查询(“从'members'中选择'id','username','wachtwoord','premiumaccount','account\u code','members',其中'username`='“$naam.”);
//Gegevens装载在kijken voor de gebruiker上
$gegeven_sql=mysql_查询(“从`members`中选择`username`、`wachtwoord`、`account_code`,其中`wachtwoord`='”、`wwmd5.”和`username`='”、`naam.”);
$gegeven=mysql\u fetch\u数组($gegevens\u sql);
if(mysql_num_rows($gegegevens_sql)==0)
$inlog_error=$txt['alert_unknown_username'];
elseif($gegeven['username']!=$naam)
$inlog_error=$txt['alert_unknown_username'];
//尼特账户的Kijken是verbannen
elseif(mysql_num_行(mysql_查询(“从ban中选择id,其中id='”。$gegeven['id'].'”))>0)
$inlog_error=$txt['alert_account_BANCED'];
elseif(mysql_num_rows($gegegeven_sql)==0){
$datum=日期(“Y-m-d H:i:s”);
mysql_查询(“插入到`inlog_fout`(`datum`、`ip`、`spelernaam`、`wachtwoord`)中)
值(“$datum.”、“$”服务器['REMOTE\u ADDR']。”、“$naam.”、“$ww.”);
如果((mysql_num_rows($inlog_fout_sql)<300)和($gegeven['wachtwoord']!=$wwmd5))
$inlog_error=';
}
elseif($gegeven[‘账户代码’!=1)
$inlog_error=$txt['alert_account_not_activated'];
否则{
//如果选中OnTouch复选框,则保存cookie
setcookie(“pa_1”,$gegegeven['username'],time()+(60*60*24*365));
setcookie(“pa_2”,$_POST['password'],time()+(60*60*24*365));
//佐尔根·达特·格布鲁伊克·韦尔·波金根·希夫特3号。
mysql_查询(“从'inlog_fout'中删除,其中'ip`='”。$\u服务器['REMOTE_ADDR'].'”);
//在本书中,hij在线网站的内容是。
$tijd=时间();
mysql_查询(“更新`members`SET`ip_ingelogd`=”、`online`=”、`online`=”、$tijd.“`username`=”、$gegeven['username']。”);
//基准opvragen
$date=日期(“Y-m-d H:i:s”);
//日志选项卡中的Opslaan
$QueryLogs=mysql\U查询(“从`inlog\U日志`WHERE`ip`='”、$\U服务器['REMOTE\U ADDR']。”、`speler`='”、$gegeven['username']。“”)中选择`id`;
if(mysql_num_rows($querylogs)=“0”){
mysql\u查询(“插入到'inlog\u日志'('ip','datum','speler'))
值(“$”服务器['REMOTE\u ADDR']。”、“$date.”、“$naam.”);
}
其他的
mysql\u查询(“更新`inlog\u日志`SET`datum`='”、$date.“,其中`speler`='”、$gegeven['username']。”和`ip`='”、$\u服务器['REMOTE\u ADDR']。”);
//瓦里亚贝勒的泽特·纳姆(zet naam),后来又去了诺格·盖布里克(nog gebruikt)的沃登(worden)
$\会话['id']=$gegegeven['id'];
$_SESSION['naam']=$gegegeven['username'];
//哈什奥普斯兰
$\u会话['hash']=md5($\u服务器['REMOTE\u ADDR'].,“$gegeven['username']);
//本杰威尔高级酒店
如果($gegeven['premiumaccount']>0)
$\会话['userid']=$gegegeven['id'];
//纳尔·德因加梅·帕吉纳·斯特伦
标题(“位置:?页面=主页”);
}
}
}

我至少可以看到一种方式,攻击者可以使用您的代码读取您的密码,而不会破坏MD5哈希

$naam = $_POST['username'];
. . .
$gegevens_sql = mysql_query("SELECT `id`, `username`, `wachtwoord`, `premiumaccount`, `account_code` FROM `members`
    WHERE `username`='".$naam."'"); 
您在SQL查询中插入
$\u POST['username']
,而根本不保护它


不,等等,我错了。在您显示的代码中,他们至少可以在两个位置执行SQL注入攻击,但我不知道他们如何读取密码,因为以下代码:

elseif($gegeven['username'] != $naam)
  $inlog_error = $txt['alert_unknown_username'];
它们不能同时将明文密码提取到
$gegegeven['username']
中并通过此if测试


尽管如此,您的代码易受SQL注入攻击这一事实仍然是一个巨大的危险信号。如果您习惯于将$u POST变量直接复制到查询中,那么他们很可能有另一种方法可以在您的应用程序的其他部分利用它,而我们