有效防止sql注入的方法演示_数据库其它

来源:脚本之家  责任编辑:小易  

SQL注入,一般由 request 提交而来,所以过滤 request参数即可。比如,正常获取 id 为 request("id") ,获取后,对其进行强制转为int型,如id = cint(request.querystring("id"))同理,凡是数字型的,一律进行判断是否数字或强制转换。如果是字符型的,要写入SQL语句的,一律对单引号进行转义,如SQLserver和Access中,替换成两个单引号。MYSQL中替换成 \' 等。可以写成一个固定的函数来代替request,可以达到防止注入的目的。网上也有一些通用的过滤程序,可以解决大部分问题,但更多的时候,也并不能防止注入的发生,同时,也会给正常提交带来一些麻烦www.zgxue.com防采集请勿采集本网。

前言

SQL注入攻击是黑客对数据库进行攻击常用的手段之一,随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想获取的数据,这就是所谓的SQL Injection,即SQL注入。

我习惯用hibernate。这个自己不会去写sql语句。这个好像能防治SQL 注入式攻击。 1 字符串过滤 2 preparedstatement 第一个以前听说过.好像是用一个类javax.servlet.Filte

一 背景

假如某高校开发了一个网课系统,要求学生选课后完成学习,数据库中有一张表course,这张表存放着每个学生的选课信息及完成情况,具体设计如下:

数据库分以下6种常见入侵,当然还有其他更多方法以下是比较常见的。 强力(或非 SQL注入窃取备份(未加密)的磁带 防范SQL入侵。你密码不能太简单..更不能是弱口令

数据如下:

SQL注入,一般由 request 提交而来,所以过滤 request参数即可。 比如,正常获取 id 为 r \\' 等。 可以写成一个固定的函数来代替request,可以达到防止注入的目的。 网上也有

本系统采用mysql做为数据库,使用Jdbc来进行数据库的相关操作。系统提供了一个功能查询该学生的课程完成情况,代码如下。

SQL注入,一般由 request 提交而来,所以过滤 request参数即可。 比如,正常获取 id 为 re \\' 等。 可以写成一个固定的函数来代替request,可以达到防止注入的目的。 网上也有一

@RestControllerpublic class Controller { @Autowired SqlInject sqlInject; @GetMapping("list") public List<Course> courseList(@RequestParam("studentId") String studentId){ List<Course> orders = sqlInject.orderList(studentId); return orders; }}

以java为例,最有效的办法就是不拼接Sql语句而是通过传递参数的方式,PreparedStatement代替Statement,可以有效防止sql注入。

@Servicepublic class SqlInject { @Autowired private JdbcTemplate jdbcTemplate; public List<Course> orderList(String studentId){ String sql = "select id,course_id,student_id,status from course where student_id = "+ studentId; return jdbcTemplate.query(sql,new BeanPropertyRowMapper(Course.class)); }}

1:采用带参数传递 sqlparameter[] paras= new sqlparameter[]{ new sqlparameter("@id",sqltytpe.int), new sqlparameter("@title",sqltype.varchar)} 2:使用存

二 注入攻击演示

xxx.php?pwd=123 ' or 1=1 php中: $sql = "select * from user_table where password='" . $_GET['pwd'] . "'"; 这样的话你执行都是会返回true···这样就绕

1. 正常情况下查询一个学生所选课程及完成情况只需要传入student_id,便可以查到相关数据。

用 SqlParameter 给你个例子,这个是代码生成器生成的。

根据响应结果,我们很快便能写出对应的sql,如下:

sql注入后你会发现sql注入会用到一些特殊字符,比如" ' "," -- ",等等.由此我们可以简单的过滤一下一些危险字符可以有效防止sql注入.此外对提交数据

select id,course_id,student_id,status from course where student_id = 4

SQL防止注入方法 昨天我们说了SQL注入漏洞有哪些?本节为读者讲解如何利用ADO. Parameters集合演示代码如下: 请读者注意,使用存储过程并不一定能防止SQL注入。

2. 如果我们想要获取这张表的所有数据,只需要保证上面这个sql的where条件恒真就可以了。

使用参数 (Parameter) 来给值,这个方法目前已被视为最有效可预防SQL注入攻击 (SQL 所以就可以防止SQL注入,如果不能重用执行计划,就有可能出现SQL注入,存储过程也是

select id,course_id,student_id,status from course where student_id = 4 or 1 = 1

} 在需要防注入的输入文本框添加如下方法 txtName.Attributes.Add("onblur", "AntiSqlValid(this)");//防止Sql脚本注入 关于JS代码防止SQL注入的方法小编

请求接口的时候将studendId 设置为4 or 1 = 1,这样这条sql的where条件就恒真了。sql也就等同于下面这样

MYSQL注入攻击需要预防7个要点php mysql_real_escape_string addslashes及mysql绑定参数防SQL注入攻击PHP简单实现防止SQL注入的方法PHP实现表单提交数据的验证

select id,course_id,student_id,status from course

php防止sql注入的方法详解PHP简单预防sql注入的方法PHP中防止SQL注入方法详解php中$_GET与$_POST过滤sql注入的方法Discuz7.2版的faq.php SQL注入漏洞分析PHP防

请求结果如下,我们拿到了这张表的所有数据

本篇文章是对php中过滤html字符串,防止SQL注入的方法进行了详细的分析介绍,需要的朋友参考下   批量过滤post,get敏感数据 复制代码 代码如下: $_GET = stripslash

3. 查询mysql版本号,使用union拼接sql

union select 1,1,version(),1

4. 查询数据库名

union select 1,1,database(),1

5. 查询mysql当前用户的所有库

union select 1,1, (SELECT GROUP_CONCAT(schema_name) FROM information_schema.schemata) schemaName,1

看完上面这些演示后,你害怕了吗?你所有的数据配置都完全暴露出来了,除此之外,还可以完成很多操作,更新数据、删库、删表等等。

三 如何防止sql注入

1. 代码层防止sql注入攻击的最佳方案就是sql预编译

public List<Course> orderList(String studentId){ String sql = "select id,course_id,student_id,status from course where student_id = ?"; return jdbcTemplate.query(sql,new Object[]{studentId},new BeanPropertyRowMapper(Course.class));}

这样我们传进来的参数 4 or 1 = 1就会被当作是一个student_id,所以就不会出现sql注入了。

2. 确认每种数据的类型,比如是数字,数据库则必须使用int类型来存储

3. 规定数据长度,能在一定程度上防止sql注入

4. 严格限制数据库权限,能最大程度减少sql注入的危害

5. 避免直接响应一些sql异常信息,sql发生异常后,自定义异常进行响应

6. 过滤参数中含有的一些数据库关键词

@Componentpublic class SqlInjectionFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException { HttpServletRequest req=(HttpServletRequest)servletRequest; HttpServletRequest res=(HttpServletRequest)servletResponse; //获得所有请求参数名 Enumeration params = req.getParameterNames(); String sql = ""; while (params.hasMoreElements()) { // 得到参数名 String name = params.nextElement().toString(); // 得到参数对应值 String[] value = req.getParameterValues(name); for (int i = 0; i < value.length; i++) { sql = sql + value[i]; } } if (sqlValidate(sql)) { throw new IOException("您发送请求中的参数中含有非法字符"); } else { chain.doFilter(servletRequest,servletResponse); } } /** * 关键词校验 * @param str * @return */ protected static boolean sqlValidate(String str) { // 统一转为小写 str = str.toLowerCase(); // 过滤掉的sql关键字,可以手动添加 String badStr = "'|and|exec|execute|insert|select|delete|update|count|drop|*|%|chr|mid|master|truncate|" + "char|declare|sitename|net user|xp_cmdshell|;|or|-|+|,|like'|and|exec|execute|insert|create|drop|" + "table|from|grant|use|group_concat|column_name|" + "information_schema.columns|table_schema|union|where|select|delete|update|order|by|count|*|" + "chr|mid|master|truncate|char|declare|or|;|-|--|+|,|like|//|/|%|#"; String[] badStrs = badStr.split("\\|"); for (int i = 0; i < badStrs.length; i++) { if (str.indexOf(badStrs[i]) >= 0) { return true; } } return false; }}

总结

到此这篇关于有效防止sql注入的文章就介绍到这了,更多相关防止sql注入内容请搜索真格学网以前的文章或继续浏览下面的相关文章希望大家以后多多支持真格学网!

(1)对于动态构造SQL查询的场合,可以使用下面的技术: 第一:替换单引号,即把所有单独出现的单引号改成两个单引号,防止攻击者修改SQL命令的含义。再来看前面的例子,“SELECT * from Users WHERE login = ''' or ''1''=''1' AND password = ''' or ''1''=''1'”显然会得到与“SELECT * from Users WHERE login = '' or '1'='1' AND password = '' or '1'='1'”不同的结果。 第二:删除用户输入内容中的所有连字符,防止攻击者构造出类如“SELECT * from Users WHERE login = 'mas' -- AND password =''”之类的查询,因为这类查询的后半部分已经被注释掉,不再有效,攻击者只要知道一个合法的用户登录名称,根本不需要知道用户的密码就可以顺利获得访问权限。 第三:对于用来执行查询的数据库帐户,限制其权限。用不同的用户帐户执行查询、插入、更新、删除操作。由于隔离了不同帐户可执行的操作,因而也就防止了原本用于执行SELECT命令的地方却被用于执行INSERT、UPDATE或DELETE命令。 ⑵ 用存储过程来执行所有的查询。SQL参数的传递方式将防止攻击者利用单引号和连字符实施攻击。此外,它还使得数据库权限可以限制到只允许特定的存储过程执行,所有的用户输入必须遵从被调用的存储过程的安全上下文,这样就很难再发生注入式攻击了。 ⑶ 限制表单或查询字符串输入的长度。如果用户的登录名字最多只有10个字符,那么不要认可表单中输入的10个以上的字符,这将大大增加攻击者在SQL命令中插入有害代码的难度。 ⑷ 检查用户输入的合法性,确信输入的内容只包含合法的数据。数据检查应当在客户端和服务器端都执行——之所以要执行服务器端验证,是为了弥补客户端验证机制脆弱的安全性。 在客户端,攻击者完全有可能获得网页的源代码,修改验证合法性的脚本(或者直接删除脚本),然后将非法内容通过修改后的表单提交给服务器。因此,要保证验证操作确实已经执行,唯一的办法就是在服务器端也执行验证。你可以使用许多内建的验证对象,例如RegularExpressionValidator,它们能够自动生成验证用的客户端脚本,当然你也可以插入服务器端的方法调用。如果找不到现成的验证对象,你可以通过CustomValidator自己创建一个。 ⑸ 将用户登录名称、密码等数据加密保存。加密用户输入的数据,然后再将它与数据库中保存的数据比较,这相当于对用户输入的数据进行了“消毒”处理,用户输入的数据不再对数据库有任何特殊的意义,从而也就防止了攻击者注入SQL命令。System.Web.Security.FormsAuthentication类有一个HashPasswordForStoringInConfigFile,非常适合于对输入数据进行消毒处理。 ⑹ 检查提取数据的查询所返回的记录数量。如果程序只要求返回一个记录,但实际返回的记录却超过一行,那就当作出错处理。 --------------------------------------------------------------------------------------------------------------------------- 关键是明白原理,其实防范很简单的, 1.过滤SQL需要的参数中的敏感字符(注意加入忽略大小写) 2.禁用数据库服务器的xp_cmdshell存储过程,删除相应用到的dll 3.屏蔽服务器异常信息内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • php中防止sql注入的最佳解决方法
  • php中防止sql注入实现代码
  • php防止sql注入详解及防范
  • 有效防止sql注入的5种方法总结
  • 防止xss和sql注入:js特殊字符过滤正则
  • js代码防止sql注入的方法(超简单)
  • php中防止sql注入攻击和xss攻击的两个简单方法
  • discuz的php防止sql注入函数
  • c#.net全站防止sql注入类的代码
  • php简单实现防止sql注入的方法
  • mysql与oracle sql语言差异比较一览
  • spark sql操作json字段的小技巧
  • sybase 复制与热切换数据
  • 掌握sql server数据库快照的工作原理
  • 最新统计排名前十的sql和nosql数据库排行榜
  • access转sqlserver的注意事项
  • 详解数据库中跨库数据表的运算
  • mysql与oracle 差异比较之七 其它
  • 如何在mac中修改环境变量path
  • sqlserver 2005 和oracle 语法的一点差异小结
  • 怎么样防止Sql注入?
  • asp+sql 如何有效的防止sql注入
  • PHP中防止SQL注入方法详解
  • STRUTS 中如何有效的防止 SQL 注入式攻击
  • 在STRUTS框架 中如何有效的防止 SQL 注入式攻击
  • 怎样有效防止SQL2000数据库批量注入
  • asp+sql 如何有效的防止sql注入
  • asp+sql 如何有效的防止sql注入
  • 如何防止sql注入
  • 像这样可以有效防止sql注入吗?
  • 字符串拼接不能有效防止sql注入吗
  • asp.net如何有效防止SQL注入攻击
  • 如何防止SQL注入攻击?
  • SQL防止注入方法
  • c# 传参的方式能完全防止sql注入吗
  • JS代码防止SQL注入的方法(超简单)
  • PHP+mysql防止SQL注入的方法小结
  • PHP简单实现防止SQL注入的方法
  • 浅析php过滤html字符串,防止SQL注入的方法
  • 如何防止SQL注入漏洞 有哪些方法 具体介绍一下
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全mssqlmysqlmariadboracledb2mssql2008mssql2005sqlitepostgresqlmongodbredisaccess数据库文摘数据库其它首页php中防止sql注入的最佳解决方法php中防止sql注入实现代码php防止sql注入详解及防范有效防止sql注入的5种方法总结防止xss和sql注入:js特殊字符过滤正则js代码防止sql注入的方法(超简单)php中防止sql注入攻击和xss攻击的两个简单方法discuz的php防止sql注入函数c#.net全站防止sql注入类的代码php简单实现防止sql注入的方法mysql与oracle sql语言差异比较一览spark sql操作json字段的小技巧sybase 复制与热切换数据掌握sql server数据库快照的工作原理最新统计排名前十的sql和nosql数据库排行榜access转sqlserver的注意事项详解数据库中跨库数据表的运算mysql与oracle 差异比较之七 其它如何在mac中修改环境变量pathsqlserver 2005 和oracle 语法的一点差异小结sql join on 用法mysql mysqldump命令使用详解sqlserver、mysql、oracle三种数sql中代替like语句的另一种写法如何让sql运行得更快关于adox的相关知识如何取得一个表的所有字段名用逗sql server下数据库链接的使用方sql server 2005的表分区sql 查询语句积累hadoop2.x/yarn环境搭建--centos7.0 jdk配sqlserver与oracle常用函数实例对比汇总介绍postgresql中的jsonb数据类型mybatis映射xml文件详解及实例ado.net数据库访问技术14张图看懂什么是区块链技术用sql server访问sybase中的表的方法sql四舍五入、向下取整、向上取整函数介绍数据库中的左连接(left join)和右连接(ri大数据量,海量数据处理方法总结
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved