显然,100%地防止SQL注入和XSS攻击是说起来容易做起来难,但为什么呢?
静态代码分析工具不能确保所有用户提供的输入向量(包括受用户污染的变量)都被净化了吗?还是使用限制性的编程语言或框架强制执行?
下面的规则不会使XSS和SQL注入变得不可能吗?
那么这个想法有什么问题呢?
参考文献:
发布于 2020-03-16 07:57:16
没有什么是不可能的。
但是,ORM和查询生成器已经降低了SQL注入漏洞,从而防止了最常见的错误。在我的经验中,在默认情况下使用安全(Ish)模板引擎的应用程序也有较少的XSS问题。
但主要问题是:
query),在准备好的查询中不能有任何变量,也不能设置任何异常(“输入不是用户控制的,所以很好”,“对于很少的情况下”,因为它会很快变得无法管理)。这将严重限制开发人员的可用性。让我们以PHP为例。您可以标记各种SQL函数(query等)的所有用途,并且只允许使用prepare。您还需要检查是否没有变量传递给prepare:
$stmt = $conn->prepare("SELECT test from table WHERE x=?");
$stmt->bind_param("s", $test);但是,如果您希望表名是可变的呢?或者是您首先需要构建的复杂查询?例:
$filterquery = " WHERE ";
for ($filter in $filterarray) {
$filterquery = ...
}
$stmt = $conn->prepare("SELECT test from $tablename" . $filterquery);
$stmt->bind_param("s", [...]);这是您不能允许的,因为检查$filterquery是否安全是非常重要的。但是,在查询中不允许变量会严重限制开发人员。
您可以使用querybuilder并检查是否只有绑定函数接受参数(如理论中的setParameter ),但您需要再次防止将任何变量传递给其他函数(如where)。由于有合法的用例,这也会限制开发人员的可用性。
使用XSS,这将变得更加困难。首先,您需要检查所有输出数据的函数,并防止这些函数(echo、print、die等),这样输出只能通过模板引擎完成(这当然是可行的)。
但是您不能在模板之外动态地构建HTML代码,因为您不能将复杂的变量传递给它(无法知道数据是否是(部分)用户控制的)。
您现在可以对数据进行默认的HTML编码,以防止出现许多XSS情况。但是,如何知道您是否处于JavaScript上下文中呢?或者src属性上下文(您需要在其中防止javascript:链接)?这也是不容易检查的(或者您需要您的开发人员标记该变量是在哪个上下文中打印的,这很容易出错)。
然后是基于DOM的XSS。也许您希望允许某些用户发布一个有限的HTML子集(您可以对其进行筛选,但需要模板中的异常)。
https://security.stackexchange.com/questions/227364
复制相似问题