我已经对此做了相当多的研究,但我似乎无法找到问题的确切答案,比如在哪里放置哪些代码。
因此,我正在建立一个简单的网站,供用户登录和玩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而不是加号似乎更有用,但我不确定这是否会解决问题。
发布于 2016-04-07 01:59:50
任何类型注入中的概念都是命令和数据之间的歧义。当您遇到与命令在同一个位置使用任意数据的情况时,您就有了一个可能的注入点。
它适用于XSS,就像攻击者可以通过巧妙地使用输入来控制网页上的内容一样,他们可以添加恶意脚本并做他们想做的事情。
您遇到的问题是您在哪里使用addslashes()。这不适合于转义HTML上下文中使用的数据。您有文本数据,但是您实际上将其作为HTML来处理,因为您将它直接注入到页面中。攻击者可以插入一些$_POST数据,这些数据将向页面添加脚本标记或其他任何内容。
若要解决此问题,请正确转义在不同上下文中使用的任何和所有数据。在您的例子中,在HTML中围绕变量的htmlspecialchars()是您想要的。
对于您的$error消息,您也需要同样的信息。当然,您不太可能攻击您自己的站点,但是您希望生成有效的HTML,对吗?当一个偏离的括号出现在错误消息中并破坏您的页面时,不要感到惊讶。
发布于 2016-04-07 02:07:07
永远不要相信来自你无法控制的设备的任何东西,在这种情况下,我假设它是一个浏览器。您必须对所有内容进行净化或以其他方式过滤,以便在返回到浏览器时不能在浏览器中执行。您还需要确保它不能用于SQL注入等,但这是另一个问题。
您需要尽可能多地阅读XSS。这个网站非常有用..。
在以下情况下发生跨站点脚本(XSS)攻击: 数据通过不受信任的源(最常见的是Web请求)进入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']); ?>"/>虽然像堆栈溢出这样的站点可以为您的问题提供一个点解决方案,但您真正需要的是对XSS等的一般理解。
https://stackoverflow.com/questions/36465342
复制相似问题