【问题标题】:preventing xss attacks / injection防止xss攻击/注入
【发布时间】:2016-04-07 01:54:11
【问题描述】:

我对此进行了相当多的研究,但我似乎无法找到我的问题的确切答案,比如将代码放在哪里。

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

【问题讨论】:

标签: javascript php html escaping xss


【解决方案1】:

任何类型的注入中的概念都是命令和数据之间的歧义。当您遇到任意数据与命令在同一位置使用的情况时,您就有可能被注入。

它适用于 XSS,就好像攻击者可以通过巧妙地使用输入来控制您网页上的内容,他们可以添加恶意脚本并为所欲为。

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

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

您的$error 消息也需要相同的内容。当然,您不太可能攻击自己的网站,但您想生成有效的 HTML 对吗?当杂散括号最终出现错误消息并破坏您的页面时,请不要感到惊讶。

【讨论】:

    【解决方案2】:

    永远不要相信来自你无法控制的设备的任何东西,在这种情况下,我假设它是一个浏览器。您必须清理或以其他方式过滤所有内容,以使其在返回给浏览器时无法在浏览器中执行。您还需要确保它不能用于 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 等有一个大致的了解。

    【讨论】:

    • 感谢您的回答。实际上,我确实在一段时间前阅读了该链接以及其他信息。据我了解,addlashes 是问题所在,我需要使用 htmlspecialchars。但我只是想 100% 确定这是唯一的 XSS 漏洞。
    猜你喜欢
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2018-07-16
    相关资源
    最近更新 更多