English
 电子信箱
 加入收藏

  威盾防火墙 >> 新闻中心 >> 业界动态 >> 如何防范SQL注入——编程篇

 

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

威盾防火墙 2015-01-26

 
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 }

相关内容: 最新内容:
浅析C#启动停止SQL数据库服务之方法[2015-01-26]
Sqlparameter防SQL注入[2015-01-26]
什么是SQL注入攻击,有什么危害[2015-01-26]
中小企业安全调查 SQL注入仍是主要威胁[2015-01-26]
黑客对ASP.Net平台网站发起SQL注入攻击[2015-01-26]
人人网分站SQL注入+反射型xss[2015-01-26]
浅析C#启动停止SQL数据库服务之方法[2015-01-26]
Sqlparameter防SQL注入[2015-01-26]
用状态机实现XML解析器 - C++环境[2015-01-26]
什么是SQL注入攻击,有什么危害[2015-01-26]
中小企业安全调查 SQL注入仍是主要威胁[2015-01-26]
黑客对ASP.Net平台网站发起SQL注入攻击[2015-01-26]