【问题标题】:how do I prevent javascript in this situation using PHP (http://my_host_here.com/publications.php/"><script>alert(1)</script>)?在这种情况下如何使用 PHP (http://my_host_here.com/publications.php/"><script>alert(1)</script>) 防止 javascript?
【发布时间】:2013-02-11 07:47:59
【问题描述】:

我已经尝试了下面的代码,但似乎在将 http 请求发送到服务器之前运行了 javascript。

谢谢

<?php

class secure
{
    function secureSuperGlobalGET(&$value, $key)
    {
        $_GET[$key] = htmlspecialchars(stripslashes($_GET[$key]));
        $_GET[$key] = str_ireplace("script", "blocked", $_GET[$key]);
        $_GET[$key] = mysql_escape_string($_GET[$key]);
        return $_GET[$key];
    }

    function secureSuperGlobalPOST(&$value, $key)
    {
        $_POST[$key] = htmlspecialchars(stripslashes($_POST[$key]));
        $_POST[$key] = str_ireplace("script", "blocked", $_POST[$key]);
        $_POST[$key] = mysql_escape_string($_POST[$key]);
        return $_POST[$key];
    }

    function secureGlobals()
    {
        echo "in here";
        array_walk($_GET, array($this, 'secureSuperGlobalGET'));
        array_walk($_POST, array($this, 'secureSuperGlobalPOST'));
    }
}

?>

【问题讨论】:

  • 不确定您要在这里做什么。你只是把那些可怜的字符串弄得面目全非 :) 总是为了手头的任务而逃避only。你能澄清一下你在什么情况下试图阻止什么吗?
  • 你之后如何使用这些值?您是将它们存储在数据库中还是将它们打印给用户?
  • 如果在请求发送到服务器之前发生了一些事情,你需要发布 HTML/Javascript 代码。

标签: php javascript sql-injection


【解决方案1】:
  1. 摆脱你的“安全”类
  2. 使用mysql_[real_]escape_string 作为进入 SQL 查询的值作为带引号的字符串
  3. 任何其他 SQL 部分都必须根据其角色进行格式化。
  4. 在组装查询之前格式化 SQL 部分,而不是其他任何地方。
  5. 或更好地使用占位符

最后,回答您的问题:在回显用户提交的值时使用 htmlspecialchars()。

【讨论】:

    【解决方案2】:

    如果 Javascript 在代码返回服务器之前运行,那么这很可能是某种形式的基于 DOM 的 XSS。 Javascript 可能会提取 /"&gt;&lt;script&gt;alert(1)&lt;/script&gt; 的值并将其直接放入 DOM。您可能必须更改在客户端处理此问题的方式。

    OWASP 对如何防御基于 DOM 的跨站点脚本攻击进行了精彩的概述,例如:https://www.owasp.org/index.php/DOM_based_XSS_Prevention_Cheat_Sheet

    【讨论】:

      猜你喜欢
      • 2023-04-03
      • 1970-01-01
      • 2016-10-13
      • 1970-01-01
      • 1970-01-01
      • 2020-07-16
      • 1970-01-01
      • 2011-02-12
      • 1970-01-01
      相关资源
      最近更新 更多