【Javaweb】后台的字符串转义,入库之前记得先对字符串转义防止sql注入问题

在《【JavaScript】某些字符不转义可以导致网页崩溃与涉及转义字符的显示方法》(点击打开链接)提及到一种表单之前,必须把表单的输入框的内容转义的方法,但是,其实这种字符串的转义更加应该放在后台中进行。这样同时能够有效地防止sql注入的问题。

所谓的sql注入是什么呢?比如,你做了一个登录功能什么的。你必须把根据用户输入的用户名,查询存放在数据库的密码的,然后与密码比对是不是?

select语句一般这样写select username,password from userinfo表 where username=传过来的参数。

好了,如果这时候用户在自己的登录名输入a;drop database;,或者a or 1=1;则能把你的数据删除,或者任何情况都可能登录之类的,再或者能够导致你的tomcat被异常信息弄到崩溃。

同时,如果你不转义,就入库,就算用户是一个善意输入,也能够导致你的网页崩毁。

比如用户只是在交流输入框的写法,输入的内容有 <input type="text" /> 之类的,你再于数据库查询出来,则会导致你该显示<input type="text" />这个部分,变成了一个输入框。这还是小事。如果某些别有用心的用户,构造一个<form action="xx" />的表单,足以造成跨站攻击。

因此,我们对于一些不应该存在的数据,必须进行转义显示。

这里,《【JavaScript】某些字符不转义可以导致网页崩溃与涉及转义字符的显示方法》(点击打开链接)、与下面介绍的方法,用一种就可以了,否则多种字符转义的方法冲突,<转成& lt;又被你转成& amp; lt;那么用户看到的则是& lt; ,非常让人迷惑。同时注意《【jQuery】网页文本格式编辑器xheditor》(点击打开链接)这个编辑器,在提交表单就会自动帮你完成转义的。总之最后的意思就是,对于那些带编辑器的文本框,你Encode了多少次,就应该Decode多少次。对于那些单行文本框,我们只需要Encode,不对其进行Decode,因为我们推定其没有格式的!

注意:如下代码的&都用全角表示了,应该使用半角的,但是半角的&会被csdn吞了,可见csdn都已经对这些符号处理好才敢上来看网站的!

同时,还需要注意的是,某些符号在replaceAll方法的写法,毕竟replaceAll第一个参数是填正则表达式的,某些符号会对正则表达式产生冲突的。

public class EncodeDecodeUtil {
	/*
	 * 所有文本框,都必须先经过htmlEncode再入库(防sql注入)
	 * 所有显示,如果是单行文本框无须经过htmlDecode
	 * 定义:单行文本框输入的内容都是没有格式的内容 推定:所有在单行文本框输入html标签的都是不良行为
	 * 带编辑器的多行文本框的内容应该经过htmlDecode,保持其固有格式
	 * 注意到script已经被强力转义不再decode还原,因此给你有格式又怎么样?
	 */
	public static String htmlEncode(String html) {
		if (html != null) {
			// 必要
			return html
					.replaceAll("&", "&amp;")
					.replaceAll("<", "&lt;")
					.replaceAll(">", "&gt;")
					.replaceAll("\"", "&quot;")
					.replaceAll(" ", "&nbsp;")
					// 一些可能出现问题的半角符号,还是要转义的。
					// ,+、*、|、\、?等符号在正则表达示中有相应的不同意义。要写成\\,\\+之类
					.replaceAll("[+]", "+")
					.replaceAll("-", "-")
					// \最为特殊,对于正则表达式敏感也对于java字符串敏感,其在replace的写法为\\\					.replaceAll("\\\\", "\").replaceAll("/", "/")
					.replaceAll("[*]", "*")
					.replaceAll(":", ":")
					.replaceAll("[?]", "?")
					.replaceAll("[|]", "|")
					// 非必要,但是还是转义吧
					.replaceAll("¢", "&cent;").replaceAll("£", "&pound;")
					.replaceAll("¥", "&yen;").replaceAll("§", "&sect;")
					.replaceAll("©", "&copy;").replaceAll("®", "&reg;")
					.replaceAll("×", "&times;").replaceAll("÷", "&divide;");
		} else {
			//避免控制入库导致报错,如果遇到空值,先替换成一个空格
			//主要是防止表单验证时,某些浏览器因为兼容性问题,取不到表单某些项的值
			return " ";
		}
	}
	// 这里与htmlEncode成轴对称!正如汇编语言,变量的出栈入栈互成对子才能保护现场一样
	// 写得我很蛋疼,手工把它反过来了
	public static String htmlDecode(String html) {
		if (html != null) {
			return html.replaceAll("&divide;", "÷")
					.replaceAll("&times;", "×")
					.replaceAll("&reg;", "®")
					.replaceAll("&copy;", "©")
					.replaceAll("&sect;", "§")
					.replaceAll("&yen;", "¥")
					.replaceAll("&pound;", "£")
					.replaceAll("&cent;", "¢")
					// “非必要,但是还是转义吧”部分
					.replaceAll("|", "|").replaceAll("?", "?")
					// 在replace中,在第一个位置要写成[*],在第二个位置就不用这样写
					// 因为这里不是正则表达式
					.replaceAll(":", ":").replaceAll("*", "*")
					.replaceAll("/", "/").replaceAll("\", "\\")
					.replaceAll("-", "-")
					.replaceAll("+", "+")
					// “一些可能出现问题的半角符号,还是要转义的。”部分
					.replaceAll("&nbsp;", " ").replaceAll("&quot;", "\"")
					.replaceAll("&gt;", ">").replaceAll("&lt;", "<")
					.replaceAll("&amp;", "&");
					.replaceAll("<script", "&lt;script")
			// “必要”部分

		} else {
			return null;
		}
	}
}

这时,再来回顾文章一开头那个问题,如果用户在输入框输入a;drop database;,或者a or 1=1;之类的,执行数据库查询之前,这段字符早变成a;drop& nbsp;database了。

根本就不会再什么sql注入问题了。而一些正常输入的英文、中文字符则完全没有问题。经过Encode与Decode还是原来的样子!

时间: 2024-10-11 18:04:01

【Javaweb】后台的字符串转义,入库之前记得先对字符串转义防止sql注入问题的相关文章

JavaWeb后台从input表单获取文本值的两种方式

JavaWeb后台从input表单获取文本值的两种方式 #### index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <input type="text" name="n

利用SQL注入漏洞登录后台的实现方法 。。。。转载

一.SQL注入的步骤 a) 寻找注入点(如:登录界面.留言板等) b) 用户自己构造SQL语句(如:' or 1=1#,后面会讲解) c) 将sql语句发送给数据库管理系统(DBMS) d) DBMS接收请求,并将该请求解释成机器代码指令,执行必要的存取操作 e) DBMS接受返回的结果,并处理,返回给用户 因为用户构造了特殊的SQL语句,必定返回特殊的结果(只要你的SQL语句够灵活的话). 下面,我通过一个实例具体来演示下SQL注入 二.SQL注入实例详解(以上测试均假设服务器未开启magic

利用SQL注入漏洞登录后台的实现方法

利用SQL注入漏洞登录后台的实现方法 作者: 字体:[增加 减小] 类型:转载 时间:2012-01-12我要评论 工作需要,得好好补习下关于WEB安全方面的相关知识,故撰此文,权当总结,别无它意.读这篇文章,我假设读者有过写SQL语句的经历,或者能看得懂SQL语句 早在02年,国外关于SQL注入漏洞的技术文章已经很多,而国内在05年左右才开始的.  如今,谈SQL注入漏洞是否已是明日黄花,国内大大小小的网站都已经补上漏洞.但,百密必有一疏,入侵是偶然的,但安全绝对不是必然的.  前些天,网上传

利用SQL注入漏洞登录后台

题记:工作需要,得好好补习下关于WEB安全方面的相关知识,故撰此文,权当总结,别无它意.读这篇文章,我假设读者有过写SQL语句的经历,或者能看得懂SQL语句 早在02年,国外关于SQL注入漏洞的技术文章已经很多,而国内在05年左右才开始的. 如今,谈SQL注入漏洞是否已是明日黄花,国内大大小小的网站都已经补上漏洞.但,百密必有一疏,入侵是偶然的,但安全绝对不是必然的. 前些天,网上传得沸沸扬扬的“拖库”事件给我们敲响了安全警钟. 在开发网站的时候,出于安全考虑,需要过滤从页面传递过来的字符.通常

addslashes,htmlspecialchars,htmlentities转换或者转义php特殊字符防止xss攻击以及sql注入

一.转义或者转换的目的 1. 转义或者转换字符串防止sql注入 2. 转义或者转换字符防止html非过滤引起页面布局变化 3. 转义或者转换可以阻止javascript等脚本的xss攻击,避免出现类似恶意弹窗等等形式 二.函数 1. addslashes($str); 此函数转义预定义的字符:单引号(‘),双引号(“),反斜线(\)与NULL(NULL字符) 转义出现在html中的单引号(‘)和双引号(“),经过测试效果不是很好,转义html中的特字符就使用htmlspecialchar()函数

C语言:将s所指字符串中下标为偶数同时ASCII值为奇数的字符删去,-将a所指字符串中的字符和b所指字符串中的字符的顺序交叉,-将形参s所指字符串中的所有数字字符顺序前移,

//函数fun功能:将s所指字符串中下标为偶数同时ASCII值为奇数的字符删去,s所指串中剩余的字符形成的新串放在t所指的数组中. 1 #include <stdio.h> 2 #include <string.h> 3 4 void fun(char *s, char t[]) 5 { 6 int i=0,j=0; 7 while (s[i] != '\0') 8 { 9 if (i % 2 == 0) 10 { 11 if ((int)(s[i]) % 2 == 1)//判断A

某shop后台sql注入漏洞

前言 最近看了下tpshop,审计出几个鸡肋的漏洞,这个SQL注入漏洞是其中之一.然后审计完网上搜了一下发现有一堆后台的sql注入漏洞,应该是觉得后台的SQL不用修叭(我个人是可以理解的). 漏洞触发点 首先要登录后台,这也是我说漏洞很鸡肋的原因.漏洞位于在后台的商城->文章->文章列表处的搜索抓包,存在漏洞的参数是keywords,当输入payload' or length(database())=10)#时,页面返回文章数0, 而当输入payload' or length(database

面试题之java 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 要求不能出现截半的情况

题目:10. 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串. 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”. 一.需要分析 1.输入为一个字符串和字节数,输出为按字节截取的字符串-------------->按照字节[byte]截取操作字符串,先将String转换成byte类型 .2.汉字不可以截半----------------------------------

java中字符串常量,堆栈的区别和字符串函数intern()

转自:http://txy821.iteye.com/blog/760957 java.lang.String的intern()方法 "abc".intern()方法的返回值还是字符串"abc",表面上看起来好像这个方法没什么用处.但实际上,它做了个小动作: 检查字符串池里是否存在"abc"这么一个字符串,如果存在,就返回池里的字符串:如果不存在,该方法会把"abc"添加到字符串池中,然后再返回它的引用. 我们做个测试: Ja