防止xss攻击/注入

时间:2016-04-07 01:54:12

标签: javascript php html escaping xss

我已经对此做过相当多的研究,但我似乎无法找到问题的确切答案,就像在哪里放置代码一样。

所以我建立了一个简单的网站供用户登录和玩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作为文本字段的值似乎更有用,但我不确定这是否能解决问题。

2 个答案:

答案 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等的一般理解。