谈一谈 XSS 攻击,举个例子?
XSS是指恶意攻击者利用网站没有对用户提交数据进行转义处理或者过滤不足的缺点,进而添加一些脚本代码嵌入到web页面中去,使别的用户访问都会执行相应的嵌入代码,从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。
例子:
比如网站中有个留言板,作用是,某个用户提交相应留言信息 —— 将数据存储到数据库 —— 其他用户访问留言板,应用取数据并显示;而攻击者在留言板上填写: <script>alert(‘foolish!’);</script> (举个例子),并将数据提交、存储到数据库中;那么当其他用户访问留言板的时候,就会弹出alert弹窗
什么是SQL 注入?举个例子?
SQL注入就是通过把SQL命令插入到Web表单或url请求字符串,最终达到欺骗服务器执行恶意的SQL命令。
例子:
比如,在一个登录界面,要求输入用户名和密码,可以故意在账号上输入【admin' or 1=1 -- 】,密码任意输入。
然后点击登录,传输给后端,后端拼接出来的结果就是这样的:
String sql = "select * from `user` where account='admin' or 1=1 --' and password='XX'";
像password那样,account的值也会自动给加上两个单引号,前面的单引号与输入的那个单引号凑对,后面的单引号在注释内容里
然后,mapper会执行下面这条语句:
select * from `user` where account='13001980988' or 1=1 --' and password='123456'
以 MySQL 为例, -- 是 注释符号,上面语句中 --后面的相当于是注释,所以最后实际执行的 SQL 语句如下:
select * from `user` where account='13001980988' or 1=1
于是,SQL 注入就这么发生了,显然有了 or 1=1 这个条件,表中所有的记录都符合条件。如果在用户名输入框中输入的是 admin、administrator 等已知的后台管理员账号,那就可以用管理员账号直接登录系统了。
解决办法:
在 SQL 语句中支持两种格式的参数占位符,一种是 #{parameter},另一种是 ${parameter},在这两种参数占位符中,#{parameter}是安全的占位符格式,不存在SQL注入漏洞,而 ${parameter}是存在 SQL 注入漏洞的。