首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使SQL/HTML注入攻击无法编程

使SQL/HTML注入攻击无法编程
EN

Security用户
提问于 2020-03-16 03:59:50
回答 1查看 204关注 0票数 4

显然,100%地防止SQL注入和XSS攻击是说起来容易做起来难,但为什么呢?

静态代码分析工具不能确保所有用户提供的输入向量(包括受用户污染的变量)都被净化了吗?还是使用限制性的编程语言或框架强制执行?

下面的规则不会使XSS和SQL注入变得不可能吗?

  • SQL注入豁免--对数据库执行每个查询都是使用准备好的语句和绑定变量完成的。
    • 对于准备好的语句以不可接受的方式损害性能的罕见情况,针对底层数据库技术的上下文强制执行强有力的验证和/或字符转义规则。

  • HTML注入免疫-强制使用模板完成所有HTML生成的页面(就像准备好的带有绑定变量的语句一样),其中每个用户提供的变量或用户受污染的变量都被放入带有特定上下文规则的槽中,用于转义或删除特殊字符。
  • 编码混合免疫-强制所有输入和输出之间的编码一致性。

那么这个想法有什么问题呢?

  • 这不是对所有用例都是可行的吗?如果是这样的话,这些规则不可行的示例用例是什么?
    • 我认为,对于那些在没有遵循这些规则的情况下开发的现有web应用程序来说,这可能是不可行的,从业务的角度来看,重新设计它们可能不符合成本效益。但是新的网络应用程序开发项目呢?在允许它进入生产之前,这些规则是否可以以编程方式强制执行?

  • 我对这些规则的假设是错误的吗?这些规则能百分之百地防止这些攻击吗?

参考文献:

EN

回答 1

Security用户

发布于 2020-03-16 07:57:16

没有什么是不可能的。

但是,ORM和查询生成器已经降低了SQL注入漏洞,从而防止了最常见的错误。在我的经验中,在默认情况下使用安全(Ish)模板引擎的应用程序也有较少的XSS问题。

但主要问题是:

  • 输入卫生设施永远无法解决所有问题,因为您无法对所有上下文的输入进行消毒。
  • 在水槽里有适当的处理。您需要标记所有不安全的函数调用(例如本机query),在准备好的查询中不能有任何变量,也不能设置任何异常(“输入不是用户控制的,所以很好”,“对于很少的情况下”,因为它会很快变得无法管理)。这将严重限制开发人员的可用性。
  • XSS非常通用,并不是所有的情况都可以通过模板(例如DOM )来预防。

示例: SQL注入

让我们以PHP为例。您可以标记各种SQL函数(query等)的所有用途,并且只允许使用prepare。您还需要检查是否没有变量传递给prepare

代码语言:javascript
运行
复制
$stmt = $conn->prepare("SELECT test from table WHERE x=?");
$stmt->bind_param("s", $test);

但是,如果您希望表名是可变的呢?或者是您首先需要构建的复杂查询?例:

代码语言:javascript
运行
复制
$filterquery = " WHERE ";
for ($filter in $filterarray) {
    $filterquery = ...
}

$stmt = $conn->prepare("SELECT test from $tablename" . $filterquery);
$stmt->bind_param("s", [...]);

这是您不能允许的,因为检查$filterquery是否安全是非常重要的。但是,在查询中不允许变量会严重限制开发人员。

您可以使用querybuilder并检查是否只有绑定函数接受参数(如理论中的setParameter ),但您需要再次防止将任何变量传递给其他函数(如where)。由于有合法的用例,这也会限制开发人员的可用性。

示例: XSS

使用XSS,这将变得更加困难。首先,您需要检查所有输出数据的函数,并防止这些函数(echoprintdie等),这样输出只能通过模板引擎完成(这当然是可行的)。

但是您不能在模板之外动态地构建HTML代码,因为您不能将复杂的变量传递给它(无法知道数据是否是(部分)用户控制的)。

您现在可以对数据进行默认的HTML编码,以防止出现许多XSS情况。但是,如何知道您是否处于JavaScript上下文中呢?或者src属性上下文(您需要在其中防止javascript:链接)?这也是不容易检查的(或者您需要您的开发人员标记该变量是在哪个上下文中打印的,这很容易出错)。

然后是基于DOM的XSS。也许您希望允许某些用户发布一个有限的HTML子集(您可以对其进行筛选,但需要模板中的异常)。

票数 6
EN
页面原文内容由Security提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://security.stackexchange.com/questions/227364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档