1. 什么是sql注入如何防止sql注入
SQL注入是一种非常常见的数据库攻击手段,同时也是网络世界中最普遍的漏洞之一,简单理解就是恶意用户通过在表单中填写包含SQL关键字的数据来使数据库执行非常规代码的过程。
问题来源是,SQL数据库的操作是通过SQL语句来执行的,而无论是执行代码还是数据项都必须写在SQL语句中,也就导致如果我们在数据项中加入了某些SQL语句关键字,比如SELECT、DROP等,这些关键字就很有可能在数据库写入或读取数据时得到执行。
解决方案
方案一:
采用预编译技术
使用预编译的SQL语句,SQL语句的语义不会是不会发生改变的。预编译语句在创建的时候就已经将指定的SQL语句发送给了DBMS,完成了解析,检查,编译等工作,所以攻击者无法改变SQL语句的结构,只是把值赋给?,然后将?这个变量传给SQL语句。当然还有一些通过预编译绕过某些安全防护的操作,大家感兴趣可以去搜索一下。
方案二:
严格控制数据类型
在java、c等强类型语言中一般是不存在数字型注入的,因为在接受到用户输入id时,代码一般会做一个int id 的数据类型转换,假如我们输入的是字符串的话,那么这种情况下,程序就会报错。但是在PHP、ASP这些没有强调处理数据类型的语言,一般我们看到的接收id的代码都是如下等代码。
方案三:
对特殊的字符进行转义
数字型注入可以通过检查数据类型防止,但是字符型不可以,那么怎么办呢,最好的办法就是对特殊的字符进行转义了。比如在MySQL中我们可以对" '
"进行转义,这样就防止了一些恶意攻击者来闭合语句。当然我们也可以通过一些安全函数来转义特殊字符。如addslashes()等,但是这些函数并非一劳永逸,攻击者还可以通过一些特殊的方式绕过。
2. sql注入漏洞修复方法有什么
可以尝试以下方法:
- 使用带参数的SQL语句方法
- 调用存储过程
好处:
带参数的SQL语句本意就是用来防止注入式攻击
存储过程的话,在数据库中写好存储过程,在VS中进行调用即可
3. ps.executeUpdate(); 是什么意思
是当成功插入数据到数据库时候,这个会返回一个大于1的数字,来表明数据成功插入库之中
sql注入发生的时间,sql注入发生的阶段在sql预编译阶段,当编译完成的sql不会产生sql注入,采用jdbc操作数据时候,preparedStatement 预编译对象会对传入sql进行预编译。
那么当传入id 字符串为 "update ft_proposal set id = 3;drop table ft_proposal;" 这种情况下就会导致sql注入删除ft_proposal这张表。
预编译语句
处理使用预编译语句之外,另一种实现方式可以采用存储过程,存储过程其实也是预编译的,存储过程是sql语句的集合,将所有预编译的sql语句编译完成后,存储在数据库上。
当传入的参数为3;drop table user;当执行时可以看见打印的sql语句为:select name from usre where id = ?;不管输入何种参数时,都可以防止sql注入,因为mybatis底层实现了预编译。
4. SQL注入预编译是绝对安全的么
没错,存储过程的确能有效解决SQL注入式攻击!
理由:因为通常的数据库访问方法,都是把访问数据表的权利赋给程序,注入式攻击者通过你的程序漏洞判断和获得更多的信息,并利用你赋给程序的访问和操作权,轻者破坏本表数据,重者毁坏整个数据库!
使用存储过程则完全不同,程序中不必再有SQL语句,因此程序不必拥有访问和操作数据表的权限,只把运行存储过程的权限交给程序。程序只是把参数和存储过程名告诉数据库,然后等待结果就行了,注入式攻击者要想运行存储过程,就必需猜对存储过程名,并且还要猜对参数个数、参数名和参数的顺序,同时满足这些条件太难了,即便所以条件都满足,那么攻击者也只是往数据表里存了一组合法数据而已,不会导致其它破坏。
因此,通过存储过程能从根本上解决注入式攻击。
需要注意的是,使用存储过程后,应把原来交给程序的操作数据表的权限收回,否则就象为了防小偷锁了前门,却开着后门一样。
5. c#怎么预编译SQL语句,就是像Java里面那个PreparedStatement那样的,不知道C#哪个类是对应的
PreparedStatement.setXXX(index,Value);
本来就是设定值的。
建议设定字段还是使用+。
String List<X> getList(List<String> field){
String fieldList="";
StringBuffer buf=new StringBuffer().append(SELECT ");
for(oint i=0;i<field.size();i++){
buf.append(f);
if(i!=field.size()-1) buf.append(",");
}
buf.append(" FROM table");
...
}
6. sql是解释型语言还是编译型语言
结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统, 可以使用相同的结构化查询语言作为数据输入与管理的接口。结构化查询语言语句可以嵌套,这使它具有极大的灵活性和强大的功能。
SQL从功能上可以分为3部分:数据定义、数据操纵和数据控制。
SQL的核心部分相当于关系代数,但又具有关系代数所没有的许多特点,如聚集、数据库更新等。它是一个综合的、通用的、功能极强的关系数据库语言。其特点是:
1、数据描述、操纵、控制等功能一体化。
2、两种使用方式,统一的语法结构。SQL有两种使用方式。一是联机交互使用,这种方式下的SQL实际上是作为自含型语言使用的。另一种方式是嵌入到某种高级程序设计语言(如C语言等)中去使用。前一种方式适合于非计算机专业人员使用,后一种方式适合于专业计算机人员使用。尽管使用方式不向,但所用语言的语法结构基本上是一致的。
3、高度非过程化。SQL是一种第四代语言(4GL),用户只需要提出“干什么”,无须具体指明“怎么干”,像存取路径选择和具体处理操作等均由系统自动完成。
4、语言简洁,易学易用。尽管SQL的功能很强,但语言十分简洁,核心功能只用了9个动词。SQL的语法接近英语口语,所以,用户很容易学习和使用。
7. C语言:预编译是什么
预编译,顾名思义,从字面上看,就是提前编译,它做的是工作就是为正式编译做准备
它说处理的是有#标识的代码,如讲include的文件进行拷贝、#define的条件编译等等!关于预编译的介绍你可以到网络里进行查看,里面有详细的介绍!http://ke..com/view/176610.htm
8. sql中带有like时如何使用预编译
like语句实际上就是模糊的字段查询,通常与“%”(一个或多个)结合使用。
举例说明:
sql:SELECT * FROM tablename T WHERE T.name LIKE '%zhang%';
解释:以上语句就就是查询出tablename表中name字段带有“zhang”的所有记录。
备注:存储过程中用"||"表示连接符,用单引号(“'”)表示字符连接。
SELECT * FROM tablename T WHERE T.name LIKE '%'||'zhang'||'%'.
9. pstmt = conn.prepareStatement(sql);是什么意思
pstmt = conn.prepareStatement(sql)是执行SQL语句的一个接口。但是执行前会对SQL语句进行预编译的操作,然后就开始执行SQL语句,并把结果赋值给pstmt。conn的意思是一个数据库连接。
PreparedStatement是Statement的子接口,表示预编译的 SQL 语句的对象,SQL 语句被预编译并存储在PreparedStatement对象中。然后可以使用此对象多次高效地执行该语句。如果有参数的话还需要添加输入的参数。
(9)什么是sql预编译扩展阅读:
数据库建立连接的五大步骤:
1、加载(注册)数据库
装载驱动程序只需要非常简单的一行代码。例如,你想要使用 JDBC-ODBC 桥驱动程序,可以用下列代码装载它:Class.forName("sun.jdbc.odbc.JdbcOdbcDriver")。
你的驱动程序文档将告诉你应该使用的类名。例如, 如果类名是 jdbc.DriverXYZ ,你将用代码以下的代码装载驱动程序:Class.forName("jdbc.DriverXYZ")。
你不需要创建一个驱动程序类的实例并且用 DriverManager 登记它,因为调用 Class.forName 将自动将加载驱动程序类。加载 Driver 类后,它们即可用来与数据库建立连接。
2 、建立链接
第二步就是用适当的驱动程序类与 DBMS 建立一个连接。下列代码是一般的做法:
Connection con = DriverManager.getConnection(url,"myLogin","myPassword")
3 、执行SQL语句
我们使用 executeUpdate 方法是因为在 createTableCoffees 中的 SQL 语句是 DDL (数据定义语言)语句。创建表,改变表,删除表都是 DDL 语句的例子,要用 executeUpdate 方法来执行。
4、 处理结果集
5 、关闭数据库
参考资料来源:网络-Java数据库连接
10. 静态的SQL 和动态的SQL有什么区别
静态 SQL:静态 SQL 语句一般用于嵌入式 SQL 应用中,在程序运行前,SQL 语句必须是确定的,例如 SQL 语句中涉及的列名和表名必须是存在的。静态 SQL 语句的编译是在应用程序运行前进行的,编译的结果会存储在数据库内部。而后程序运行时,数据库将直接执行编译好的 SQL 语句,降低运行时的开销。
动态 SQL:动态 SQL 语句是在应用程序运行时被编译和执行的,例如,使用 DB2 的交互式工具 CLP 访问数据库时,用户输入的 SQL 语句是不确定的,因此 SQL 语句只能被动态地编译。动态 SQL 的应用较多,常见的 CLI 和 JDBC 应用程序都使用动态 SQL。