他们告诉我这个登录是脆弱的,但我不知道如何使它安全,我寻求帮助,如果有人想帮助我,我真的很感激。
当我添加这个:"1' OR 1=1 LIMIT 1#"到密码时,它进入登录表单。
代码如下:
<?php
session_start();
include 'inc/header.php';
include 'panel_funciones.php';
$usuario = $_POST["nombre"];
$pass = $_POST["pass"];
try {
$bd = new PDO("mysql:host=localhost;dbname=b9_16267033_1","b9_16267033","12346");
$bd->query("SET NAMES 'utf8'");
} catch (Exception $e){
echo "No se ha podido conectar";
exit;
}
try{
$sql= "SELECT usuario, pass FROM usuarios WHERE usuario='$usuario' and pass='$pass'";
}catch(Exception $e){
echo "Error en consulta";
exit;
}
$iniciosesion = $bd->query($sql);
$result = $iniciosesion->fetchAll();
$contar = count($result);
// AQUI COMIENZA COMPROBACIÓN
if ($_SESSION['Logueado'] = TRUE) {
panel();
}
elseif ($contar == 1) {
$_SESSION['Logueado'] = TRUE;
panel();
}
else{
echo "El usuario o contraseña es incorrecto";
}
include 'inc/footer.php';
?>
这个页面有几个众所周知的问题:
-
SQL注入
$sql= "SELECT usuario, pass FROM usuarios WHERE usuario='$usuario' and pass='$pass'";
问题是您使用文本处理在查询中插入一些内容。现在假设我修改了我的密码并指定它为
' or 'a'='a'
,在这种情况下,我得到了入口。因为'a'='a'
。此外,它允许我做各种各样的查询。比如'; DROP TABLE usuarios
。您最好总是使用准备好的语句(或类似的语句),在这些语句中您不需要自己输入参数。准备好的语句将转义参数,这样就不能在这些参数中注入SQL。应该使用预处理语句;比如:
$sql= "SELECT usuario, pass FROM usuarios WHERE usuario=? and pass=?"; $stm = $bd->prepare($sql); $stm->execute(array($usuario,$pass)); $result = $stm->fetchAll(); $contar = count($result);
-
非散列密码:这是一个关于密码散列的手册。永远不要存储密码本身。假设黑客在你的网站上找到了一个薄弱环节,并设法访问了你的数据库,那么你就完蛋了。黑客可以复制所有密码并轻易修改。此外,还有很多用户在所有应用程序上使用相同的密码,这使得黑客更容易入侵其他网站。
-
您发现自己的第三个方面是
if
语句中的赋值:if ($_SESSION['Logueado'] = TRUE) { panel(); } elseif ($contar == 1) { $_SESSION['Logueado'] = TRUE; panel(); } else{ echo "El usuario o contraseña es incorrecto"; }
这里将
TRUE
赋值给$_SESSION
变量。一个更好的方法是:if($contar == 1) { $_SESSION['Logueado'] = TRUE; } if($_SESSION['Logueado']) { panel(); } else{ echo "El usuario o contraseña es incorrecto"; }
另一方面:您无法使页面不受攻击:黑客很有可能最终找到绕过许多保护措施的方法。安全性不是一个是或否。关键是你必须让它变得非常困难,以至于大多数黑客都无法绕过安全。