Dreamweaver PHP登录注销有多安全


How secure Dreamweaver PHP login logout is?

为了了解情况,我想知道使用Dreamweaver内置的PHP登录-注销身份验证功能有多好?

安全吗

我总是使用会话、帖子和很多东西来构建登录系统,但当我使用Dreamweaver时,它非常简单,似乎很安全。仍然需要专家的建议,我应该开始使用它还是传统的更好。我没有发现任何限制,只是想知道它是否足够安全。

以下是Dreamweaver提供的代码:-


这是我的登录表单


<form action="<?php echo $loginFormAction; ?>" method="POST" target="_self">
    <input name="ecsuser" class="form-login" title="Username" value="" size="30"
    maxlength="2048" />
    <input name="ecspass" type="password" class="form-login" title="Password" 
    value="" size="30" maxlength="2048" />
    <?php if(!empty($ERRORMESSAGE)) echo '<div style="color:#FFF; 
    font-weight:bold;">'.$ERRORMESSAGE.'</div>'; ?>
    <input name="" type="submit" value="" />
</form>

这是我的错误处理代码。


<?php
if (isset($_GET['ERRORMESSAGE']))
{
    if($_GET['ERRORMESSAGE'] == 1)
    {
    global $ERRORMESSAGE;
    $ERRORMESSAGE = "Sorry! The username or password is incorrect, 
            Please try again.";
    }
}
?>

这是我的进一步代码


// Database Connection Include
<?php require_once('Connections/ecs.php'); ?>
<?php
if (!function_exists("GetSQLValueString")) {
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") 
{
  if (PHP_VERSION < 6) {
    $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
  }
  $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);
  switch ($theType) {
    case "text":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;    
    case "long":
    case "int":
      $theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case "double":
      $theValue = ($theValue != "") ? doubleval($theValue) : "NULL";
      break;
    case "date":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
    case "defined":
      $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
      break;
  }
  return $theValue;
}
}
?>
<?php
// *** Validate request to login to this site.
if (!isset($_SESSION)) {
  session_start();
}
$loginFormAction = $_SERVER['PHP_SELF'];
if (isset($_GET['accesscheck'])) {
  $_SESSION['PrevUrl'] = $_GET['accesscheck'];
}
if (isset($_POST['ecsuser'])) {
  $loginUsername=$_POST['ecsuser'];
  $password=md5($_POST['ecspass']);
  $MM_fldUserAuthorization = "";
  $MM_redirectLoginSuccess = "index.php";
  $MM_redirectLoginFailed = "login.php?ERRORMESSAGE=1";
  $MM_redirecttoReferrer = false;
  mysql_select_db($database_ecs, $ecs);
  $LoginRS__query=sprintf("SELECT username, password FROM student WHERE username=%s AND password=%s",
    GetSQLValueString($loginUsername, "text"), GetSQLValueString($password, "text")); 
  $LoginRS = mysql_query($LoginRS__query, $ecs) or die(mysql_error());
  $loginFoundUser = mysql_num_rows($LoginRS);
  if ($loginFoundUser) {
     $loginStrGroup = "";
    if (PHP_VERSION >= 5.1) {session_regenerate_id(true);} else {session_regenerate_id();}
    //declare two session variables and assign them
    $_SESSION['MM_Username'] = $loginUsername;
    $_SESSION['MM_UserGroup'] = $loginStrGroup;       
    if (isset($_SESSION['PrevUrl']) && false) {
      $MM_redirectLoginSuccess = $_SESSION['PrevUrl'];  
    }
    header("Location: " . $MM_redirectLoginSuccess );
  }
  else {
    header("Location: ". $MM_redirectLoginFailed );
  }
}
?>

此外,我想知道,为了建立一个高效的登录系统,我们需要采取哪些其他安全措施,并且上面的代码是100%完美的,没有安全问题。

Is it secure?

没有。我看到一些问题:

1) 首先是一个XSS漏洞。当您像那样回显$_SERVER['PHP_SELF']时,它需要用htmlspecialchars()进行转义。如果你不这样做,攻击者可以创建链接,点击后会窃取会话cookie,这些cookie可以用来在没有用户名和密码的情况下登录。参见:PHP_SELF和XSS

2) GetSQLValueString存在问题。如果mysql_real_escape_string()不存在,则返回到mysql_escape_string()。你永远不应该回到mysql_escape_string()。如果mysql_real_escape_string()不可用,并且您依赖它来避免SQL注入,那么您的应用程序应该停止。这个函数还在知道数据类型之前对数据执行转义。如果您使用intval()、floatval()和doubleval(),则不需要先执行mysql_real_escape_string()

我建议将其更改为使用MySQLi或PDO参数化查询,这将自动为您处理转义。

MySQLi:http://php.net/manual/en/mysqli.prepare.phpPDO:http://us2.php.net/manual/en/book.pdo.php

3) 在成功登录时,它似乎正在尝试(但失败了)重定向到上一个页面。除非你已经对URL进行了硬编码或验证了用户提供的URL,否则你永远不应该重定向。如果你不这样做,你可能会受到开放重定向/网络钓鱼攻击。看起来有人可能试图通过将false添加到这里的if来解决这个问题:if (isset($_SESSION['PrevUrl']) && false) {,这个语句永远不会计算为true,所以保留它是毫无意义的。

4) 。看看这一行:

$LoginRS = mysql_query($LoginRS__query, $ecs) or die(mysql_error());

如果执行此查询时出现任何MySQL错误,应用程序将打印出完整的MySQL错误,然后停止。这对任何试图执行SQL注入攻击的人都非常有帮助。即使您已经确保了SQL注入,这仍然会告诉世界您的数据库结构的各个部分。您应该使用trigger_error()或自己记录错误,但不要在生产/生活/公共系统中向用户显示。

5) 。最后,可以对登录/注销表单进行XSRF攻击。在提交登录/注销等操作时,应使用反XSRF令牌。请参阅:http://en.wikipedia.org/wiki/Cross-site_request_forgery

易受CSRF攻击。很抱歉

此外,我以前在dreamweaver有一个PHP后台客户。他被谷歌黑了(所有数据库记录都被删除了)。

显然:

  1. 一些页面不安全-没有验证凭据

  2. 有"删除"链接,没有强制任何确认,并在GET(标准失败)中工作

  3. 谷歌很好地爬到了后台,并删除了所有内容(在日志中说)

当然不是防弹的。老实说,它介于两者之间。有问题,但我见过最糟糕的情况。

$_SERVER['HP_SELF']上的XSS是众所周知的,但并不像人们所相信的那样具有破坏性,我向你保证,许多网站都会受到影响。

mysql_escape_string()很糟糕,所有的代码都很糟糕,但如果您的服务器有mysql_real_escape/string(),它就不必失败。如果你的服务器有它,那么它就不会掉下来。

如果你有旧版本的php,你就有XSS和被搞砸的机会,但如果你有这样一个旧版本,你无论如何都很容易受到攻击。

如果您的工作基于dreamweaver,尝试为表单元素添加验证和净化,那么这方面有一些扩展。请注意为作业使用服务器端验证dreamweaver扩展(查看市场)。

我想你的问题与dreamweaver有关,你想知道用dreamweaverserver行为和命令创建的应用程序有多安全。不是那么安全,也不是那么脆弱。

到目前为止,你从其他用户那里得到的建议是正确的,准备好的语句更好,mysqli应该是最低标准。但是,如果你必须使用dreamweaver(为诗人编程),我的建议是检查一些dreamweaver扩展以进行表单元素的服务器端验证,而不是购买一个更昂贵的Dreamweather扩展,它可能会为你提供与Dreamweave相同的功能和集成,我想你正在寻找,但在"注册"模块方面有更好的代码。市场上有一些。

例如,Web Assist就有这样的功能。我不喜欢它们,因为生成的代码很乱,页面也很臃肿。学习曲线也是一个问题,你可能宁愿学习PHP,也不愿学习这些扩展上的按钮。

FelixOne是另一个此类扩展的提供商,它比Web Assist更便宜,学习曲线也更好。试试看。