2012-03-13 110 views
1

只是为了知识的缘故,我想知道如何使用PHP登录注销认证的Dreamweaver内置功能?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); 
    } 
} 
?> 

另外,我想知道,有什么我们需要建立一个有效的登录系统的所有其他安全措施并且上面的代码是完美的,没有任何安全问题。

+0

如果链接和示例代码提供这将是非常有帮助,在此先感谢:) – 2012-03-13 07:52:09

+1

https://wiki.mozilla.org/WebAppSec/Secure_Coding_Guidelines#Password_Storage – zuallauz 2012-03-13 08:10:26

回答

9
Is it secure? 

号我看到了几个问题:

1)首先,有一个XSS漏洞。当你像这样回应$_SERVER['PHP_SELF']时,它需要用htmlspecialchars()转义。如果你不这样做,攻击者可以创建链接,点击后会窃取可用于登录的会话cookie,而无需用户名和密码。 参见:PHP_SELF and 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.php PDO:http://us2.php.net/manual/en/book.pdo.php

3)这似乎是试图(和失败),以重定向到成功登录前一页。除非您对URL进行了硬编码,或者您验证了用户提供的URL,否则您不应该重定向,如果您不这样做,您可能容易受到打开的重定向/网络钓鱼攻击。 看起来有人可能试图通过在if这里添加false来解决这个问题: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

+1

感谢您的帮助:)其真正的描述性和充分的知识......为您的三个欢呼... – 2012-03-13 11:22:24

2

它很容易受到CSRF的影响。抱歉。

另外,我在Dreamweaver中有一个PHP后台客户端。他被谷歌黑客入侵(所有数据库记录被删除)。

显然:

  1. 有些地方并不安全 - 没有验证凭据

  2. 有“删除”,这并没有强迫任何确认链接和GET工作(标准失败)

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

+0

嘿漂亮的笔记,我还没有碰到过CSRF尚未来到...谢谢你包括这个...... – 2012-03-13 08:30:22

+0

这很搞笑:) – 2013-01-22 14:27:01

+0

是的,这让我觉得,如果Dreamweaver依赖像symfony这样的框架而不是生成可怕的代码,也许Dreamweaver看起来很严肃。 – jpic 2013-01-23 11:36:29

1

当然不是防弹的。说实话,它介于两者之间。有问题,但我看到最坏的情况。

$ _SERVER ['PHP_SELF']上的XSS是已知的,但并不像人们认为的那样具有破坏性,我向你保证许多网站都会受到它的影响。

mysql_escape_string()不好,所有那段代码都不好,但是如果你的服务器有mysql_real_escape_string(),它就不会崩溃。如果你的服务器拥有它,那么它就不会掉下来。

如果您拥有旧版本的PHP,那么您有XSS并有可能被搞砸,但是如果您有这样一个老版本,那么您很容易受到攻击。

如果您将您的工作建立在Dreamweaver上,请尝试添加验证和清理以形成元素,但这里有一些扩展。注意使用服务器端验证dreamweaver扩展作业(检查市场)。

我假设你的问题是与Dreamweaver相关的,你想知道使用Dreamweaver服务器行为和命令创建的应用程序有多安全。不是那么安全,不是那么脆弱。

从其他用户那里得到的建议是正确的,准备好的语句比较好,mysqli应该是最低标准。但是如果你必须用Dreamweaver(诗人编程)来完成你的工作,那么比我的建议是检查一些Dreamweaver扩展以进行表单元素的服务器端验证,你可能会购买一个更昂贵的Dreamweaver扩展,它可能会为你提供相同的功能和与Dreamweaver相同的集成我想你正在寻找,但是当涉及到“注册”模块时,它有更好的代码。市场上有一些。

例如Web Assist有这样的事情。我不喜欢它们,因为代码的结果很混乱,页面比较臃肿。学习曲线也是一个问题,你可能更愿意学习PHP,而不是学习推动这些扩展的按钮。

FelixOne是此类扩展的另一个提供商,价格更便宜,学习曲线比Web Assist更好。给他们一个尝试。