如何防范SQL注入——编程篇

发表于:2009-12-21 14:38

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:jamesking    来源:51Testing软件测试博客

  SQL注入想必大家都已经非常熟悉,具体的概念我在这里就不做赘述了,SQL注入往往是在程序员编写包含用户输入的动态数据库查询时产生的,但其实防范SQL注入的方法非常简单。程序员只要a)不再写动态查询,或b)防止用户输入包含能够破坏查询逻辑的恶意SQL语句,就能够防范SQL注入。在这篇文章中,我们将会说明一些非常简单的防止SQL注入的方法。

  我们用以下Java代码作为示例:

String query ="SELECT account_balance FROM user_data WHERE user_name ="
  + request.getParameter("customerName");
 
try {
Statement statement =
connection.createStatement( …);
ResultSet results =
Statement.executeQuery(query);
}

  在以上代码中,我们可以看到并未对变量customerName做验证,customerName的值可以直接附在query语句的后面传送到数据库执行,则攻击者可以将任意的sql语句注入。

  防范方法1:参数化查询

  参数化查询是所有开发人员在做数据库查询时首先需要学习的,参数化查询迫使所有开发者首先要定义好所有的SQL代码,然后再将每个参数逐个传入,这种编码风格就能够让数据库辨明代码和数据。

  参数化查询能够确保攻击者无法改变查询的内容,在下面修正过的例子中,如果攻击者输入了UsrID是“’or ‘1 ‘=’1”,参数化查询会去查找一个完全满足名字为‘or ‘1 ‘=’ 1的用户。

  对于不同编程语言,有一些不同的建议:

  Java EE——使用带绑定变量的PreparedStatement();

  .Net——使用带绑定变量的诸如SqlCommand()或OleDbCommand()的参数化查询;

  PHP——使用带强类型的参数化查询PDO(使用bindParam());

  Hibernate——使用带绑定变量的createQuery()。

  Java示例:

String custname = request.getParameter("customerName");
String query ="SELECT account_balance FROM user_data WHERE user_name= ?";
 
PreparedStatement pstmt = connection.prepareStatement(query);
Pstmt.setString1,custname();
ResultSet results = pstmt.executeQuery();

  C# .Net示例:

String query ="SELECT account_balance FROM user_data WHERE user_name = ?";
Try {    
   OleDbCommand command = new OleDbCommand(query,connection);
   command.Parameters.Add(new OleDbParameter("customerName",CustomerName.Text));
   OleDbDataReader reader = command.ExecuteReader();
  } catch (OleDbException se){
  //error handling
}

31/3123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号