#{}和${}的区别是什么? 举例说明
#{}是预编译处理,${}是字符串替换。
Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的 set 方法来赋值;
Mybatis 在处理${}时,就是把${}替换成变量的值。
使用#{}可以有效地防止 SQL 注入,提高系统安全性。
我经常看到面试题上回答是这个,但是具体到底是怎样的呢,能举个例子吗?
举例:
select * from student name = ${name}
正常情况:name = (刘德华)
$符号:select * from student name = 刘德华
#符号:select * from student name = 刘德华
sql注入情况:name = (刘德华 or name = 周星驰)
$符号:select * from student name = 刘德华 or name = 周星驰;(这样就产生了sql注入)
#符号:select * from student name = '刘德华 or name = 周星驰';(“刘德华 or name = 周星驰” 被当成一个完整的字符串,此时无法查询到结果)
每日知识图文分享(欢迎点赞收藏):
Web漏洞最常说得有这3种:
第一种是XSS漏洞。通过XSS漏洞,黑客可以在Web应用中嵌入自己的JavaScript脚本,从而篡改Web应用在用户浏览器上的行为。通过XSS,黑客一方面可以模拟用户,直接在Web应用中进行发博关注等互动行为;另一方面,也可以通过JavaScript脚本,窃取到用户的Cookie信息。窃取到Cookie之后,黑客就能够在不知道密码的情况下,绕过登录认证环节,直接获得用户身份。
第二种是SQL注入漏洞。通过SQL注入漏洞,黑客可以利用所谓的“万能密码”,直接对登录环节进行破解。通过“万能密码”,黑客可以将原本的登录认证SQL语句进行篡改,使其变成一个恒为真的表达式,让应用误以为黑客输入的是正确的用户名和密码。这样,黑客就能破解登录认证环节,直接获得用户身份。
第三种是CSRF漏洞。通过CSRF漏洞,黑客能够直接对用户的浏览器进行控制。当黑客在自己的网页中,向其他网页发起跨域请求的时候,浏览器会自动带上对应网页的Cookie等信息。因此只要用户之前进行过认证,并且已经将登录凭证保存在浏览器中,黑客就能以用户的身份发起未授权的操作请求。
据说在车牌上贴上 SQL,可以对系统进行注入。有这种骚操作?
看图说话
ORM界的小清新JOOQ,大家都熟悉hibernate、mybatis以及spring boot推荐的jpa,但对jooq大家都很陌生,但网上评价很高,
jooq的核心优势是可以将数据库表结构映射为Java类,java代码jooq自动生成,包含表的基本描述和所有表字段。通过jooq提供的API,配合生成的Java代码,可以很方便地进行数据库操作,对数据库的操作转变为java面向对象编程,而不是写原生sql,所以对于数据的输入,是天然安全的,极大的减少了SQL注入的风险,对于这款orm框架,你会使用吗?#程序员# #头条创作挑战赛#
写出BUG的程序员可以理解,但写出有SQL注入漏洞的程序员不可饶恕。今天看了一个实习生写的一段代码后我直接让他明天不用来了。
本来是让他开发一个很简单的功能,就是提供个查询用户信息的接口给前台,结果看了他写的下面这段代码我差点掀桌子。
String sql = "select * from t_user where username=”+username;
这个拼接的SQL虽然简单,但很容易被SQL注入,危害极大,一旦有人知道这个漏洞,我们所有的用户信息都要被泄露。
我和实习生说了问题的严重性,他还觉得委屈,不知道为什么,我给他解释了什么是SQL注入,他才明白了过来。
代码里一定不要用这种带有变量的拼接SQL方式,一定要用预编译方式处理。
还好进行了代码评审,特别是没什么经验的新人写的代码一个字母都不能放过,说不定就有大坑。
这让我想起来了几年前CSDN用户数据泄露的事件,就是由于SQL注入漏洞引起的,太可怕了,我也是其中的受害者,很多网站应用的用户名、密码和CSDN是一样的,导致全部都被盗号了。
所以我现在看到这种SQL注入的漏洞的代码就非常生气,得严肃处理,让他长长记性,以后才不会犯这种严重错误。
数据库选型核心原则
1.业务需求决定数据库选型及架构
2.当前没有一种数据库可以满足所有需求场景
“All In xxDB” 脱离了场景谈数据库选型都是没意义的
数据库选型关注的六大要素:
(1)稳定性
数据多副本
高可用服务
(2)性能
低延迟
高吞吐
(3)接入成本
业务需求量
商业授权/开源免费
硬件需求:HDD/SDD/内存
(4)安全
权限设计【粒度】
审计【SQL注入】
(5)扩展性
横向扩展【海量数据支持】
纵向扩容
(6)可运维性
监控告警
备份恢复
升级迁移
故障排查【周边工具及组件】
社区生态活跃度【相关人才】
自身团队
一般企业的数据库类型组合:
(1)MySQL+NoSQL+NewSQL【关系型+KV+分布式】
(2)OLTP+OLAP
(3)存储+缓存
选型总结:
1.数据库选型必须依赖应用场景:在线选择 vs 离线、OLTP vs OLAP、日志、检索、图关系
2.数据库选型要有关键数据参考:数据总量、访问QPS、响应时间RT、读写比例
3.需求合理性判断,是否可以优化
4.当前没有一种数据库可以满足所有需求场景,不选最热的只选最合适的
5.业务进行数据库选型目标:业务适配,降本增效
6.数据库的架构及选型也是在不断演进的,要与时俱进
不懂SQL 注入,你就看不懂这个漫画。[灵光一闪]
今天看到xkcd 的一个漫画,翻译成了中文版,分享给各位。
原漫画链接: xkcd: Exploits of a Mom
【项目名称】源码审计工具
【项目详情】
1 自动化源码扫描和审计工具
2 支持多种语言,包括C/C++、C#、VB、PHP、Java和PL/SQL等
3 漏洞规则可以灵活配置
4 能够检测XSS、SQL注入、文件泄露、本地/远程文件包含、远程命令执行以及更多种类型的漏洞
5 对扫描结果进行统计和出报告
可以没有代码,但是需要有二次开发和集成能力。
【推荐阅读与分享】「中国唯一进入工信部名录的源代码安全监测软件」北大库博是一款软件源代码静态分析系统,以C、C++、Java、Python、Javascript等语言为输入,能够自动检测分析出源代码里潜在的运行时缺陷(如空指针解引用、内存泄露、缓冲区溢出等致命问题)、安全漏洞(SQL 注入、XSS跨站攻击等)、编码规则问题(国家军用标准GJB8114、国际工业编码标准MISRA)等。软件源代码的分析检测系统本身的研发门槛很高,几年前我们国家的国防工业、金融、智能制造等国家命脉部门用的都是美国、英国等国外的代码分析系统,如美国斯坦福大学研制的Coverity系统、英国利物浦大学研制的TestBed系统等。为了打破国外的技术垄断,我们国家的北京大学在2010年左右就开始着手类似系统的研究工作,在2014年做出了拥有完全独立自主产权的CoBOT(库博)源代码分析系统,并在2015年通过了国际顶级的CWE认证,也是我国目前唯一通过该认证的系统。在代码检测能力上,CoBOT已经具备替代国外检测系统的能力,这一点在很多已采购单位得到了验证。如国防工业的核九院12所、中电30所,金融行业的中国工商银行、天府银行、西藏银行,等等数百家单位都是CoBOT的资深用户。
什么是80端口?
80端口是常用的互联网通信协议超文本传输协议(HTTP)的默认端口号。用于收发未加密的网页。
当客户端试图连接服务器并发出请求时,它需要知道服务器的IP地址以及将使用哪个网络服务来传输数据。为了方便编程人员,大多数流行的网络服务都有默认的端口号。这个策略开始于1991年,当时Tim Berners-Lee最初的HTTP规范指出,如果没有为HTTP连接分配端口,则应该使用80端口。
如今,大多数网站使用HTTPS,这是HTTP协议的一个更安全的版本,使用端口443。端口443允许通过加密网络传输数据,而端口80允许以明文形式传输数据。
一些众所周知的端口号
HTTP(超文本传输协议):80
HTTPS(超文本传输安全协议):443
FTP(文件传输协议):21
Telenet:23
DNS(域名系统):53
SSH (Secure Shell) :22
SMTP(简单邮件传输协议):25
IRC (Internet Relay Chat,一种网络聊天协议):194
80端口与网络安全
尽管有些网管会建议关闭80端口以保护系统,但安全专家指出,关闭80端口并不能阻止中间人攻击的发生,或阻止SQL注入和其他类型的攻击,上述这些攻击依赖于通过互联网连接渗透系统。
80端口连接问题
在某些情况下,ISP可能会阻塞80端口,从而使访问互联网变得困难。另一个常见的问题是端口80被占用。例如,Skype就经常占用其他应用程序的80端口。
如今,云服务的兴起大大缓解了这两个问题,多个应用程序可以在浏览器上工作。通过调度,它们可以同时使用同一个端口。
轻量级、灵活和可扩展ASGI API框架Starlite,可插拔,附带依赖注入、身份验证、OpenAPI规范生成以及中间件和守卫等其他常见API框架组件。
Starlite的核心特性包括如下:
基于类的控制器;
基于装饰器的配置;
可扩展的测试支持;
广泛的类型支持如参考、验证和解析;
完整异步(ASGI)支持;
分层依赖注入;
带有Redoc UI的OpenAPI 3.1模式生成;
基于路由守卫的授权;
简单的中间件和身份验证;
支持pydantic模型和数据类;
支持标准库数据类;
支持SQLAlchem声明式类;
插件系统允许扩展支持的类;
超快的json序列化和使用orjson的反序列化。
该项目已在GitHub上获得了近800 Stars,并于今日更新了v1.5.3。
GitHub地址:网页链接
开源协议:MIT license
最近在造轮子,一个springBoot项目,目前已经完成了这些,还差啥
1、全局异常处理以及业务异常
2、接口统一返回格式,状态码
3、过滤器--打印请求路径,请求耗时,业务处理逻辑
4、拦截器-请求耗时,业务处理逻辑
5、切面Aop记录请求日志
6、自定义配置文件注入属性(应用配置类)
7、容器启动完成初始化数据步骤
8、配置日志logback.xml,日志门面slf4j
9、集成mybatis,配置显示打印sql
10、配置连接池druid(c3p0)
[what][what][what]
Mybatis自动加载的基本原理
1. mybatis-spring-boot-starter将Mybatis需要的依赖全部引入;
2. starter同时通过SPI机制引入了一个配置类:MybatisAutoConfiguration,它负责注册SqlSessionFactory和SqlSessionTemplate到Spring容器中,我们使用Mybatis时绝大部分功能靠这两个Bean实现;
3. 引入了AutoConfiguredMapperScannerRegistrar 这个bean到Spring容器,它负责将MapperScanner引入Spring容器,然后MapperScanner会将工程中所有的Dao扫描出来转换为BeanDefinition并且注册到Spring容器中;
4. 当开发的工程中使用了某个Dao时,Spring能够从容器中找到这个Dao对应的BeanDefinition,将其实例化并且注入,这样开发者就可以使用了,这也是为何我们只定义了Dao的接口,但是工程运行时能够有实例Bean的原因。