Dreamweaver PHP登录注销的安全性如何?
为了知识起见,我想知道使用Dreamweaver内置的PHP登录注销身份验证功能有多好 安全吗? 我总是使用会话、帖子和很多东西来构建登录系统,但是当我使用Dreamweaver one时,它非常简单,而且看起来很安全。仍然需要专家的建议,我应该开始使用它还是传统的更好。我没有发现任何限制,只是想知道它是否足够安全 以下是Dreamweaver提供的代码:-Dreamweaver PHP登录注销的安全性如何?,php,mysql,security,dreamweaver,login-script,Php,Mysql,Security,Dreamweaver,Login Script,为了知识起见,我想知道使用Dreamweaver内置的PHP登录注销身份验证功能有多好 安全吗? 我总是使用会话、帖子和很多东西来构建登录系统,但是当我使用Dreamweaver one时,它非常简单,而且看起来很安全。仍然需要专家的建议,我应该开始使用它还是传统的更好。我没有发现任何限制,只是想知道它是否足够安全 以下是Dreamweaver提供的代码:- 这是我的登录表 这是我的错误处理代码 这是我的进一步代码 //数据库连接包括 另外,我想知道,为了建立一个高效的登录
这是我的登录表
这是我的错误处理代码
这是我的进一步代码
//数据库连接包括
另外,我想知道,为了建立一个高效的登录系统,我们还需要采取哪些其他安全措施,上面的代码是否100%完美,没有安全问题。它容易受到攻击。对不起
此外,我过去在dreamweaver有一个PHP后台客户端。他被谷歌入侵(所有数据库记录都被删除)
显然:
$\u服务器['PHP\u SELF']
时,需要使用htmlspecialchars()
对其进行转义。如果您不这样做,攻击者可以创建一个链接,当单击该链接时,该链接将窃取会话cookie,该cookie可用于在没有用户名和密码的情况下登录。
见:
2) GetSQLValueString
有问题。如果mysql\u real\u escape\u string()
不存在,则返回到mysql\u escape\u string()
。您永远不应该回到mysql\u escape\u string()
。如果mysql\u real\u escape\u string()
不可用,并且您依赖它来避免SQL注入,那么您的应用程序应该停止。
此函数还在知道数据类型之前对数据进行转义。如果您使用的是intval()、floatval()、doubleval(),则无需先执行mysql\u real\u escape\u string()
我建议将此更改为使用MySQLi或PDO参数化查询,它将自动为您处理转义
MySQLi:
PDO:
3) 在成功登录时,它似乎正在尝试(并且失败)重定向到上一页。除非您硬编码了URL或验证了用户提供的URL,否则不应重定向。如果不这样做,您可能容易受到开放式重定向/网络钓鱼攻击。
似乎有人试图通过将false
添加到if
中来解决此问题:if(isset($\u SESSION['PrevUrl')&&false){
,此语句将永远不会计算为true
,因此保留它是毫无意义的
4) .请看这一行:
$LoginRS = mysql_query($LoginRS__query, $ecs) or die(mysql_error());
如果在执行此查询时出现任何MySQL错误,则应用程序将打印出完整的MySQL错误,然后停止。这对任何试图执行SQL注入攻击的人都非常有帮助。即使您已经为SQL注入提供了安全保护,这仍然会告诉世界您数据库结构的各个部分。
您应该使用trigger\u error()
或自己记录错误,但不要在生产/现场/公共系统中向用户显示
5) 。最后,可以对登录/注销表单执行XSRF攻击。提交登录/注销等操作时,应使用反XSRF令牌。
见:
没有。我看到一些问题:
1) 首先有一个XSS漏洞。当你像那样回显$\u服务器['PHP_SELF']
时,需要使用htmlspecialchars()
对其进行转义。如果你不这样做,攻击者可以创建链接,单击该链接时,将窃取会话cookie,该cookie可用于在没有用户名和密码的情况下登录。
见:
2) GetSQLValueString
有问题。如果mysql\u real\u escape\u string()
不存在,则返回到mysql\u escape\u string()
。如果mysql\u real\u escape\u string()
不可用,并且您依赖它来避免SQL注入,您的应用程序应该停止。
此函数还在知道数据类型之前对数据进行转义。如果使用intval()、floatval()、doubleval(),则无需先执行mysql\u real\u escape\u string()
我建议将此更改为使用MySQLi或PDO参数化查询,它将自动为您处理转义
MySQLi:
PDO:
3) 成功登录时,它似乎正在尝试(但失败)重定向到上一页。除非您硬编码了URL或验证了用户提供的URL,否则不应重定向。如果不这样做,您可能会受到开放式重定向/网络钓鱼攻击。
似乎有人试图通过将false
添加到if
中来解决此问题:if(isset($\u SESSION['PrevUrl')&&false){
,此语句将永远不会计算为true
,因此保留它是毫无意义的
4) .请看这一行:
$LoginRS = mysql_query($LoginRS__query, $ecs) or die(mysql_error());
如果有我的
// 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 );
}
}
?>
Is it secure?
$LoginRS = mysql_query($LoginRS__query, $ecs) or die(mysql_error());