SQL注入及其解决方案

SQL注入及其解决方案,sql,sql-injection,Sql,Sql Injection,SQL注入及其解决方案 解决方案是什么?您应该执行准备好的SQL语句,并且执行方法因编程语言而异。关于SQL注入的最坏情况,他可以转储DB内容。如何防止它检查以下链接它不好。您需要保护对客户端请求的SQL查询。如果太难,那么最好的方法就是使用框架。例如,如果您熟悉PHP,那么您可以使用Symfony或Zend。我想您最好的方法是让SQL语句尽可能远离您的UI,总的来说,您需要了解SQL注入是如何发生的,因此,例如,您有这样一个查询: select name from users where pa

SQL注入及其解决方案
解决方案是什么?

您应该执行准备好的SQL语句,并且执行方法因编程语言而异。关于SQL注入的最坏情况,他可以转储DB内容。如何防止它检查以下链接

它不好。您需要保护对客户端请求的SQL查询。如果太难,那么最好的方法就是使用框架。例如,如果您熟悉PHP,那么您可以使用Symfony或Zend。

我想您最好的方法是让SQL语句尽可能远离您的UI,总的来说,您需要了解SQL注入是如何发生的,因此,例如,您有这样一个查询:

select name from users where password='ValueFromTxtPassword' --not good approach
攻击者可以在您的TXT密码字段中写入以下内容:

0 or 1=1; select * from creditcards --
这将有效地生成如下有效查询:

select name from users where password=0 or 1=1; ======> valid query is always true
select * from creditcards -- ===> makes another query and ignores the rest of the lines in your SQL statement, giving you all the records from your creditcard table
因此,为了避免这种情况,可以使用如下存储过程

 authenticate(username, password) --Stored procedures force you to pass only the needed info
另一个好方法是使用“查询”复杂对象,该对象根据需要构建sql语句

public class query{
    public List<column> projections {get; set;} //use this to build your SELECT
    public List<condition> filters { get; set;} //use this to build your WHERE
    public List<condition> sorting { get; set;} //use this to build your ORDER BY
}
公共类查询{
公共列表投影{get;set;}//使用它来构建您的选择
公共列表筛选器{get;set;}//使用它来构建您的WHERE
公共列表排序{get;set;}//使用此命令通过
}
使用诸如Hibernate之类的ORM通常会迫使您构建这个查询复杂的对象,因为您不能映射表映射,而只能返回域对象

1)过滤输入-不要相信用户:应用程序最大的威胁来自用户。用户不必像您期望的那样彬彬有礼、听话。有些用户的意图非常恶劣,有些只是试图测试他们的黑客技能。无论你要编写什么代码,都要使用最佳实践来编写它,并考虑它的安全性方面。验证表单中的每个字段

2) 使用数据库包装类或PDO– 数据库包装器或PDO(在PHP中)可以降低直接访问数据库输入值的风险。 准备好的语句可以与PDO一起使用,如下所示


服务器端解决方案是让数据库服务器拒绝意外的SQL查询(其解析树哈希不在一组已知哈希中的查询)

基本上,这个想法相当简单,其他人也有类似的想法

我的想法稍有不同,我建议将解析从客户端移动到已经有解析步骤的服务器

算法:

1) 在数据库服务器上,解析SQL之后,遍历解析树并生成操作码令牌字符串。在字符串上计算MD5哈希

2) 然后,该散列表示解析树的形状。对于web应用程序,唯一SQL查询的数量将非常少

3) 数据库服务器保留每个用户的有效哈希列表,并在新哈希上发出警告/失败

4) 向API添加一个函数以预加载此哈希列表,并在web应用程序启动时使用已知哈希列表调用此函数

SQL注入的工作方式是插入字符,从而生成不同于程序员所设想的解析树

解析树哈希可以检测意外的解析树


这个建议的缺点是目前没有数据库系统能够做到这一点。到目前为止,我所看到的最接近的是Postgresql,它在pg_stat中保留解析树的散列以供参考。

这是一个编程网站@see生成此查询的代码是什么,它是用什么语言编写的?如果没有这一点,除了对准备好的语句的一般性评论之外,很难获得任何帮助。请不要通过编辑删除代码。如果你想删除一个问题,请引起主持人的注意。