2016-04-07 258 views
0

我已经对此做了相当多的研究,但似乎无法找到我的问题的确切答案,因为在哪个代码中放置了哪个位置。防止xss攻击/注入

因此,我正在构建一个简单的网站供用户登录和玩游戏的JavaScript游戏。该网站还没有正常运行,但我收到了一个陌生人的随机电子邮件,称我的网站容易受到XSS的攻击,并向我发送了一个重定向到我的网站的链接。当我回到我的网站时,出现了一个警报,显示了Cookie和其他一些我不知道的东西。该链接不再处于活动状态,因此我无法向您显示添加到登录表单输入字段的脚本。

有什么办法可以防止恶意用户这样做吗?如果有帮助,这是构成我的登录名的代码。

<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

http://stackoverflow.com/questions/1996122/how-to-preve nt-xss-with-html -php – epascarello

回答

0

任何注入的概念在命令和数据之间都是不明确的。当你在一个命令所在的地方使用任意数据时,你有一个潜在的注射点。

它适用于XSS仿佛攻击者可以控制通过输入狡猾使用什么是你的网页上,他们可以添加恶意脚本,并为所欲为。

你的问题是,你正在使用addslashes()。这不适用于转义在HTML上下文中使用的数据。你有文本数据,但你实际上将它视为HTML,因为你直接将它注入到页面中。攻击者可以推入一些$_POST数据,这些数据将添加脚本标记或任何内容到您的页面。

要解决此问题,请妥善地转义在不同上下文中使用的任何和所有数据。在你的情况下,你的HTML变量周围的htmlspecialchars()是你想要的。

你需要同样为您$error消息也是如此。当然,这不太可能会攻击你自己的网站,但你想生成有效的HTML正确吗?当一个流浪的支架出现在错误信息中并且破坏你的页面时,不要感到惊讶。

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']); ?>"/> 

虽然像计算器网站可以提供形式为您的问题提供点解决方案您真正需要的是对XSS等的一般理解。

+0

感谢您的回答。我其实已经在前段时间阅读过这个链接以及其他信息。从我的理解,addslashes是问题,我需要使用htmlspecialchars。但我只是想100%确定这是唯一的XSS漏洞。 – Jay

+0

看看这个以及... https://www.owasp.org/index.php/Data_Validation – Harry