格式化功能VS参数在SQL注入方案是什么?(Format function vs Parameter

2019-09-18 08:02发布

我知道在SQL语句的参数使用,但只是出于好奇是可以放心使用的格式功能,可以防止SQL注入,而不是使用paramters。

这样的样本

sCustomer : string
begin
 AdoSql.CommandText:=Format('Select SUM(value) result from invoices where customer=%s',[QuotedStr(sCustomer)]);
end;

Answer 1:

这很可能是针对SQL注入安全的,假设QuotedStr工作正常,并且没有边缘的情况下,可以打破它。 (这绝不是一种保障手段。作为利纳在评论中指出,MySQL的让你使用\'逃脱了引号。其他DBMS可能有类似的功能。该系统的足够的理论知识,攻击者能够利用它们。 )

然而,即使QuotedStr不够好,它仍然是更好地使用参数,出于不同的原因:性能。 当您从您的查询分开你的参数,就可以结束了完全相同的查询代码中多次使用不同的参数发送。 如果你这样做,数据库可以缓存很多它在计算查询工作,所以你的数据库访问变快。 不工作(或至少不为好),当你的参数混入查询代码本身。



Answer 2:

您可以通过连接字符串一起建立一个SQL字符串的任何时间,有潜在的注入攻击,不管你怎么想安全地访问这些字符串。 对于所有你知道的,有人可能会运行调试器内的应用程式后,换上的结果断点QuotedStr()并允许之前修改其内容Format()看到它。

使用实际的SQL参数是要走的最安全的方式。 它不仅避免打针,但它也允许SQL引擎来决定如何,所以你不必担心自己的代码格式化值最好格式化参数自身需要,将其与强类型的效果很好语言(如德尔福)。 更不用说能够然后执行它在你的代码,甚至多次前提前准备在服务器端的SQL语句,大大减少了客户端和服务器,提高整体性能之间的通信的性能优势。

var
  sCustomer : string 
begin 
  AdoSql.CommandText := 'Select SUM(value) result from invoices where customer=:Customer'; 
  AdoSql.Prepared := True;
  ... 
  AdoSql.Parameters['Customer'].Value := sCustomer; 
  AdoSql1.ExecSQL;
  ...
  AdoSql.Parameters['Customer'].Value := sCustomer;
  AdoSql1.ExecSQL;
  ...
  AdoSql.Prepared := False;
end; 


Answer 3:

不, Format不提供从SQL注入安全。 这是从没有在这方面普通字符串连接不同。

在做任何事情对SQL注入问题的部分代码是调用QuotedStr ,你可以使用或不使用的Format 。 它并不像真正的参数化查询可靠的,虽然。

唯一的好处Format在这方面是整个字符串模板是在一个地方,这样你就不太可能得到空格和标点错误比你会如果你要构建具有连续的字符串+操作,其中,SQL撇号可能迷路德尔福撇号中。



文章来源: Format function vs Parameters in sql injection scenarios?