我目前正在学习软件安全漏洞,特别是SQL注入和XSS攻击。我被赋予了一项使安全应用程序易受攻击的任务,但我之前没有编码 PHP 的背景。
据我了解,如果删除PDO,该应用程序可能会变得脆弱,但我对此没有特定的解决方案。谁能提供答案?我绝望了
注册
<?php
//error_reporting(0);
if(isset($_POST['signup']))
{
$fname=$_POST['fullname'];
$email=$_POST['emailid'];
$mobile=$_POST['mobileno'];
$password=md5($_POST['password']);
$sql="INSERT INTO tblusers(FullName,EmailId,ContactNo,Password) VALUES(:fname,:email,:mobile,:password)";
$query = $dbh->prepare($sql);
$query->bindParam(':fname',$fname,PDO::PARAM_STR);
$query->bindParam(':email',$email,PDO::PARAM_STR);
$query->bindParam(':mobile',$mobile,PDO::PARAM_STR);
$query->bindParam(':password',$password,PDO::PARAM_STR);
$query->execute();
$lastInsertId = $dbh->lastInsertId();
if($lastInsertId)
{
echo "<script>alert('Registration successfull. Now you can login');</script>";
}
else
{
echo "<script>alert('Something went wrong. Please try again');</script>";
}
}
?>
登录
<?php
if(isset($_POST['login']))
{
$email=$_POST['email'];
$password=md5($_POST['password']);
$sql ="SELECT EmailId,Password,FullName FROM tblusers WHERE EmailId=:email and Password=:password";
$query= $dbh -> prepare($sql);
$query-> bindParam(':email', $email, PDO::PARAM_STR);
$query-> bindParam(':password', $password, PDO::PARAM_STR);
$query-> execute();
$results=$query->fetchAll(PDO::FETCH_OBJ);
if($query->rowCount() > 0)
{
$_SESSION['login']=$_POST['email'];
$_SESSION['fname']=$results->FullName;
$currentpage=$_SERVER['REQUEST_URI'];
echo "<script type='text/javascript'> document.location = '$currentpage'; </script>";
} else{
echo "<script>alert('Invalid Details');</script>";
}
}
?>
对于 sql 注入,您可以删除bindParam
行并在登录中编写类似以下内容的内容:
$sql ="SELECT EmailId,Password,FullName FROM tblusers WHERE EmailId='$email' and Password='$password'";
由于参数现在将通过字符串连接传递给 sql,这将使它容易受到电子邮件和密码变量上的 sql 注入的影响。
对于 XSS,您必须在不编码的情况下输出用户输入。例如,在登录时,您可以在响应中写下收到的用户名,如下所示:
echo "<script>alert('Invalid Details for $email');</script>";
这样,电子邮件字段就很容易被利用。
请注意,这些只是示例,可以通过无数种不同的方式实现相同的目标。