如何使此 php 代码容易受到 sql 注入和跨站点脚本攻击?



我目前正在学习软件安全漏洞,特别是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>";

这样,电子邮件字段就很容易被利用。

请注意,这些只是示例,可以通过无数种不同的方式实现相同的目标。

最新更新