![]() |
1
7
哈。不幸的是,它几乎总是取决于货币和管理决策的适当性,但“它非常乏味”通常被认为是无效的 工程 担忧——这只是适当重构代码的借口。 同时,问题要求使用非预处理语句方法:简而言之,如果您无法将工作卸载到库中(例如预处理语句),那么唯一的另一种方法是为每个“注入”项自己执行。无论哪种方式,都必须执行检查输入的工作。唯一的问题是它是在哪里完成的,以及程序员的专业知识是如何生成输入验证代码的。 例如,考虑一个简单的SELECT语句:
为了完整性,我们可以假设注入示例,其中
在这种情况下,您可以让语言语义至少确保
或者,如果它是一个字符串,您可以使用正则表达式这样做:
但是,如果您有没有任何语法或结构保证的较长输入(例如web表单textarea),则需要进行较低级别的字符替换,以避开潜在的坏字符。根据声明。每个变量。每种数据库风格(PostgreSQL、Oracle、MySQL、SQLite等)。这是一罐虫子。 当然,其好处是,如果您不使用预处理语句,并且还没有人做过其他工作来避免应用程序的SQL注入攻击,那么您就别无选择了。 同时,我敦促,敦促, 你必须重新考虑你的立场,即“由于种种原因,我们不能使用事先准备好的声明。”更重要的是,正如戈尔·汤普森在下面的评论中正确指出的那样,“无论如何,这将是一项相当大的工作,为什么不把它做好并加以利用呢?” 写了以上内容后,我突然想到,有些人可能会认为,仅仅写一份准备好的声明就意味着更好的安全性。实际上,这是事先准备好的声明 带绑定参数 这提高了安全性。例如,可以这样写:
在这一点上,您所做的仅仅是准备一个已经注入恶意代码的语句。相反,请考虑参数的实际绑定:
后一个例子做了两件事。它首先创建一个已知的安全格式,并发送 那个 至配电盘进行准备。然后 DB已经返回了一个预处理语句的句柄,我们是否绑定了变量,并最终执行了该语句。 |
![]() |
Samuel Ludwig · 执行查询[重复]后立即关闭结果集 6 年前 |
![]() |
Peter · 为什么在生成的jar中找不到jdbc驱动程序?[副本] 6 年前 |
![]() |
Vince · 是否遍历DataProvider的JDBC结果集? 6 年前 |
![]() |
Kask · spark将字符串转换为时间戳类型 6 年前 |
![]() |
watery · 等待jdbc出站通道适配器完成,然后再进行进一步处理 6 年前 |