我已经对此做过相当多的研究,但我似乎无法找到问题的确切答案,就像在哪里放置代码一样。
所以我建立了一个简单的网站供用户登录和玩javascript游戏。该网站还没有运行但我收到一封来自陌生人的随机电子邮件,说我的网站容易受到XSS攻击,并向我发送了一个重定向到我网站的链接。当我回到我的网站时,会出现一个警告,显示我不知道的饼干和其他一些东西。该链接不再处于活动状态,因此我无法向您显示添加到登录表单输入字段的脚本。
有没有办法阻止恶意用户这样做?如果它有帮助,这是构成我的登录的代码。
<form method="post">
<p>Login</p>
<div class="form-group">
<label for="login" style="float:left">Email or username</label>
<input class="form-control" name="login" value="<?php echo addslashes($_POST['login']); ?>"/>
<label for="loginpassword" style="float:left">Password</label>
<input class="form-control" type="password" name="loginpassword" value="<?php echo addslashes($_POST['loginpassword']); ?>"/>
</div>
<input type="submit" class="btn btn-success btn-lg wrap" name="submit" value="login"/>
<?php
if($error) {
echo '<div class="alert alert-danger" id="errorDiv">'.addslashes($error).'</div>';
}
?>
</form>
来自login.php文件:
<?php
if ($_POST['submit']=="login")
{
$login = mysqli_real_escape_string($connection_info, $_POST['login']);
$loginpw = $_POST['loginpassword'];
//check database see if correct login details
// if not found then $error = "incroorect login details" etc
// if login details then match assign id from database as session variable for authentication
}
?>
有人可以告诉我我需要做什么,以避免XSS这个特定的形式?从我读过的内容来看,使用htmlspecialchars而不是addslashes作为文本字段的值似乎更有用,但我不确定这是否能解决问题。
答案 0 :(得分:0)
任何类型注入的概念都是命令和数据之间的歧义。当您遇到与命令在同一位置使用任意数据的情况时,您有可能进行注射。
它适用于XSS,好像攻击者可以通过狡猾的输入使用来控制网页上的内容,他们可以添加恶意脚本并做任何他们想做的事情。
您遇到的问题是您使用addslashes()
的地方。这不适合转义要在HTML上下文中使用的数据。您有文字数据,但您实际上将其视为 HTML ,因为您已将其直接注入您的网页。攻击者可以推送一些$_POST
数据,这些数据会为您的网页添加脚本标记或其他内容。
要解决此问题,请正确转义在不同上下文中使用的所有数据。在您的情况下,HTML中的变量周围的htmlspecialchars()
就是您想要的。
您的$error
消息也需要相同的内容。当然,您不太可能会攻击自己的网站,但是您想生成有效的HTML吗?当一个迷路支架在错误信息中结束并打破你的页面时,不要感到惊讶。
答案 1 :(得分:0)
永远不要相信任何来自您无法控制的设备,在这种情况下我假设它是一个浏览器。您必须清理或以其他方式过滤所有内容,以便在返回到浏览器时无法在浏览器中执行。您还需要确保它不能用于SQL注入等,但这是另一个问题。
您需要尽可能多地阅读XSS。这个网站非常有用......
https://www.owasp.org/index.php/Cross-site_Scripting_(XSS)
跨站点脚本(XSS)攻击发生在:
数据通过不受信任的来源进入Web应用程序,最常见的是Web请求。
数据包含在发送到网络的动态内容中 用户未经过恶意内容验证。
在您的示例中,您有一个表单似乎正在接收原始POST数据并将其返回给用户,即
<input class="form-control" name="login" value="<?php echo addslashes($_POST['login']); ?>"/>
和
<input class="form-control" type="password" name="loginpassword" value="<?php echo addslashes($_POST['loginpassword']); ?>"/>
虽然像stackoverflow这样的网站可以为您的问题提供一个解决方案,但您真正需要的是对XSS等的一般理解。