【问题标题】:Preventing server-side scripting, XSS防止服务器端脚本,XSS
【发布时间】:2010-06-03 11:23:09
【问题描述】:

是否有任何可用于 PHP / MySQL 的预制脚本来防止服务器端脚本和 JS 注入?

我知道一些典型的功能,例如 htmlentities、特殊字符、字符串替换等,但是是否有一些简单的代码或功能可以为所有事情提供故障保护?

任何想法都会很棒。非常感谢:)

编辑: 一种通用的东西,可以去除任何可能危险的东西,即。大于/小于符号、分号、“DROP”等词?

我基本上只是想将所有内容压缩为字母数字,我猜...?

【问题讨论】:

  • 您的意思是“跨站点脚本”而不是“服务器端脚本”吗?还是您指的是远程代码包含/执行?

标签: php mysql security xss


【解决方案1】:

永远不要向尚未通过htmlspecialchars() 传递的 HTML 流输出任何数据,这样就完成了。简单的规则,易于遵循,完全消除任何 XSS 风险。

不过,作为一名程序员,你的工作就是这样做。

你可以定义

function h(s) { return htmlspecialchars(s); }

如果htmlspecialchars() 太长而无法在每个 PHP 文件中写入 100 次。另一方面,使用htmlentities() 则完全没有必要。


关键是:有代码,就有数据。如果将两者混为一谈,就会出现不好的情况。

在 HTML 的情况下,代码是元素、属性名称、实体、cmets。数据就是一切。数据必须转义以避免被误认为是代码。

对于 URL,代码是方案、主机名、路径、查询字符串的机制(?&=#)。数据是查询字符串中的所有内容:参数名称和值。它们必须转义以避免被误认为是代码。

嵌入在 HTML 中的 URL 必须进行双重转义(通过 URL 转义 HTML 转义),以确保正确分离代码和数据。

现代浏览器能够将异常损坏和不正确的标记解析为有用的东西。但是,不应强调这种能力。发生某些事情(例如 <a href> 中的 URL 没有应用适当的 HTML 转义)这一事实并不意味着这样做是好的或正确的。 XSS 是一个问题,其根源在于 a) 人们不知道数据/代码分离(即“转义”)或那些草率的人和 b) 人们试图聪明地知道他们不需要转义的数据部分。

如果您确保自己不属于 a) 和 b) 类别,则很容易避免 XSS。

【讨论】:

  • 不,它没有。如果你把它作为一个文本节点,那么你是安全的(假设它不在脚本或样式元素中)。另一方面,属性值? <img src="javascript:xss()">(如今,大多数浏览器都可以防止这种情况发生,但还有其他风险)
  • 好吧,但是当用户向 URL 提交 SQL 时呢?即“删除表用户”
  • “永远不要输出任何用户提供的数据”我会说。网站模板可能会避免这种危险:)
  • @Tim:对于 SQL,您应该使用参数化查询(mysqli_* 或 PDO)。因为它们完全消除了 SQL 注入。
  • @Col。弹片:由于“用户提供”和“抽象计算”之间的区别在复杂的应用程序中有时是模糊的,所以绝对逃避一切也无妨。
【解决方案2】:

我认为Google-caja 可能是一个解决方案。我为 java web 应用程序编写了一个污点分析器来自动检测和防止 XSS。但不适用于 PHP。我认为学习使用 caja 对 Web 开发人员来说并不坏。

【讨论】:

    【解决方案3】:

    不,没有。风险取决于您对数据的处理方式,您无法编写使数据对所有事物都安全的东西(除非您想丢弃大部分数据)

    【讨论】:

    • 嗯,是的,但是当谈到 Web 和 PHP 时,我们并没有这么笼统地说。显然,您会想要禁用某些字符和字符串,所以如果可能的话,我想要一个相当通用的此类内容列表。我基本上只想要字母数字信息。
    • 哪些字母?你想禁止人们使用连字符和句号吗?很少有那么简单。
    【解决方案4】:

    是否有一些简单的代码或函数可以为所有事情提供故障保护?

    没有。

    离开 PHP 的数据表示必须根据其去向进行专门转换/编码。因此应该只在它离开 PHP 的地方进行转换/编码。

    C.

    【讨论】:

      【解决方案5】:

      您可以参考 OWASP 来进一步了解 XSS 攻击:

      https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet

      为了避免js攻击,可以试试开源卓越提供的这个项目:

      https://www.opensource-excellence.com/shop/ose-security-suite.html

      我的网站之前有过 js 攻击,这个工具可以帮助我每天阻止所有的攻击。我认为它可以帮助你们避免这个问题。

      此外,你可以在你的 php 脚本中添加一个过滤器来过滤所有的 js 攻击,这里有一个可以做的模式:

      if (preg_match('/(?:[".]script\s*()|(?:\$\$?\s*(\s*[\w"])|(?:/[ \w\s]+/.)|(?:=\s*/\w+/\s*.)|(?:(?:this|window|top|parent|frames|self|content)[\s *[(,"]\s[\w\$])|(?:,\s*new\s+\w+\s*[,;)/ms', strtolower($POST ['变量的名称']))) { filter_variable($POST['VARIABLENAME']); }

      【讨论】:

        【解决方案6】:

        回答您的版本:除了<> 符号之外的所有内容都与 XSS 无关。
        并且 htmlspecialchars() 可以处理它们。

        页面文字中DROP table这个词没有害处;)

        【讨论】:

        • 那么 " 关闭一个属性然后继续你自己的代码呢? <img src="user-supplied-stuff" onerror="alert(document.cookie)"> 对我来说似乎是 XSS-y。 :-)
        • @janm htmlspecialchars 将捕获双引号,因此您应该以 <img src="user-supplied-stuff" onerror="alert(document.cookie)"> 结尾。但是对于图像,您应该首先检查图像是否存在,以避免损坏图像。
        • 这根本不正确。见stackoverflow.com/questions/2964424/…
        • @DisgruntledGoat:我的评论是关于错误的陈述“除了 符号之外的所有东西都与 XSS 无关。”
        【解决方案7】:

        用于干净的用户数据使用 html_special_chars(); str_replace() 和其他功能来减少不安全的数据。

        【讨论】:

        • mysql_escape_string 已弃用,无法正确处理字符编码。
        • 好的。在这种情况下,您可以使用 str_replace 清理您的请求。
        • str_replace 更糟糕。而 get_magic_quotes_gpc 与数据库转义无关。整个功能概念很愚蠢-它确实进行了双重转义!
        • 所以,请写一个好的函数来防止这种麻烦。我知道你有这样的)))如果没有 - 你需要 5 分钟)))
        • 要将一些 数据 放入 mysql 查询中,您可以使用 $data="'".mysql_real_escape_string($data)."'"; 或绑定。以及有关运算符/标识符的其他一些规则。但无论如何它与 XSS 无关
        猜你喜欢
        • 2011-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-06
        • 2012-10-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多