如何使此登录不受攻击


How to make this login unvulnerable

他们告诉我这个登录是脆弱的,但我不知道如何使它安全,我寻求帮助,如果有人想帮助我,我真的很感激。

当我添加这个:"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';
?>

这个页面有几个众所周知的问题:

  1. 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);
    
  2. 非散列密码:这是一个关于密码散列的手册。永远不要存储密码本身。假设黑客在你的网站上找到了一个薄弱环节,并设法访问了你的数据库,那么你就完蛋了。黑客可以复制所有密码并轻易修改。此外,还有很多用户在所有应用程序上使用相同的密码,这使得黑客更容易入侵其他网站。

  3. 您发现自己的第三个方面是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";
    }
    

另一方面:您无法使页面不受攻击:黑客很有可能最终找到绕过许多保护措施的方法。安全性不是一个是或否。关键是你必须让它变得非常困难,以至于大多数黑客都无法绕过安全。