SQL 注入和解决方案 解决方案是什么?
5 回答
you should do prepared SQL statement, and the way to do it differs from one programming language to another. regarding what could he do with SQL injection worst case he could dump the DB content. how to prevent it check the following link http://www.marcofolio.net/features/how_you_can_prevent_an_sql_injection.html
我想您最好的方法是让您的 SQL 语句尽可能远离您的 UI,总体而言,您需要了解 SQL 注入是如何发生的,例如,您有这样的查询:
select name from users where password='ValueFromTxtPassword' --not good approach
攻击者可以在您的 TxtPassword 字段中写入:
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
}
使用像 Hibernate 这样的 ORM 通常会迫使您构建此查询复杂对象,因为您无法映射表映射,而只能返回域对象。
这样不好。您需要保护对客户端请求的 SQL 查询。如果太难,那么最好的方法是使用框架。例如,如果您熟悉 PHP,那么您可以使用 Symfony 或 Zend。
1) 过滤输入——停止相信你的用户:对应用程序的最大威胁来自它的用户。用户不需要像您期望的那样彬彬有礼和服从。有些用户的意图非常糟糕,有些用户只是试图测试他们的黑客技能。无论您要编写什么代码,都要使用最佳实践编写它并考虑它的安全方面。验证表单中的每个字段
2) 使用数据库包装类或 PDO——数据库包装或 PDO(在 PHP 中)可以降低直接访问数据库的输入值的风险。准备好的语句可以与 PDO 一起使用,如下所示。
http://www.itechnicalblog.com/what-is-a-sql-injection-and-how-to-fix-it/ 在此处输入链接描述
服务器端解决方案是让数据库服务器拒绝意外的 SQL 查询(解析树哈希不在一组已知哈希中的查询)。
基本上,这个想法相当简单,其他人也有类似的想法。
我的想法略有不同,因为我建议将解析从客户端移动到已经有解析步骤的服务器。
算法:
1) 在数据库服务器上,解析完 SQL 后,遍历解析树并生成一串操作码标记。计算字符串的 MD5 哈希值。
2) 这个散列然后代表解析树的形状。对于 Web 应用程序,唯一 SQL 查询的数量将相当少。
3) 数据库服务器保留每个用户的有效哈希列表,并对新哈希发出警告/失败。
4) 向 API 添加一个函数,以预加载此哈希列表,并在 Web 应用程序启动时使用已知哈希列表调用此函数。
SQL 注入的工作方式是插入字符,从而生成与程序员预想的不同的解析树。
解析树哈希可以检测到意外的解析树。
这个提议的缺点是当前没有数据库系统可以做到这一点。到目前为止,我看到的最接近的是 Postgresql,它在 pg_stat 中保留了解析树的哈希值,以供参考。