gpt4 book ai didi

php - Dreamweaver PHP 登录注销有多安全?

转载 作者:行者123 更新时间:2023-11-29 03:50:44 24 4
gpt4 key购买 nike

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

安全吗?

我总是使用 session 、帖子和许多东西来构建登录系统,但是当我使用 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() 对其进行转义。如果您不这样做,攻击者可以创建链接,单击该链接时,将窃取 session cookie,这些 cookie 可用于无需用户名和密码即可登录。请参阅:PHP_SELF and XSS

2) GetSQLValueString 有问题。如果 mysql_real_escape_string() 不存在,它将返回到 mysql_escape_string()。你永远不应该退回到 mysql_escape_string()。如果 mysql_real_escape_string() 不可用并且您依赖它来避免 SQL 注入(inject),您的应用程序应该停止。该函数还在知道数据是什么数据类型之前对数据进行转义。如果您正在使用 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,否则您永远不应重定向,否则您可能容易受到开放重定向/网络钓鱼攻击。看起来有人可能试图通过在此处的 if 中添加 false 来解决此问题:if (isset($_SESSION['PrevUrl']) && false) {,此语句永远不会评估为 true,因此保留它毫无意义。

4).看看这一行:

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

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

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

关于php - Dreamweaver PHP 登录注销有多安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9680138/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com