sql正则表达式去除特殊符号 java如何防止sql注入
今天给各位分享sql正则表达式去除特殊符号的知识,其中也会对java如何防止sql注入进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
一、如何查sql表中包含的字符
1、要查找包含某个字符的SQL表中的数据,可以使用SQL查询语句中的LIKE关键字。
2、例如,假设有一个表名为"employees",其中有一个列名为"last_name",要查找包含字符"son"的姓氏,可以使用以下查询语句:
3、SELECT*FROMemployeesWHERElast_nameLIKE'%son%';
4、该查询语句使用了通配符"%"来表示任意字符的任意长度,所以它会返回包含"son"字符的任何姓氏(例如"Johnson"、"Jameson"等)的数据行。如果要查找以"son"结尾的姓氏,可以使用以下查询语句:
5、SELECT*FROMemployeesWHERElast_nameLIKE'%son';
6、该查询语句使用了通配符"%"来表示以任意字符为前缀的任意长度,所以它会返回以"son"结尾的任何姓氏(例如"Jackson"、"Williamson"等)的数据行。
7、如果要查找以"son"开头的姓氏,可以使用以下查询语句:
8、SELECT*FROMemployeesWHERElast_nameLIKE'son%';
9、该查询语句使用了通配符"%"来表示以任意字符为后缀的任意长度,所以它会返回以"son"开头的任何姓氏(例如"Song","Sondheim"等)的数据行。
10、使用LIKE关键字,您可以根据需要查找SQL表中包含的字符。
二、sql中只查一个字母怎么查
1、在SQL中,只需要在查询语句中使用通配符“%”来代表任意字符,即可查询一个字母。
2、例如,如果要查询所有以字母“a”开头的单词,可以使用以下语句:
3、SELECT*FROMtable_nameWHEREcolumn_nameLIKE'a%';这里的“%”表示任意字符,所以查询结果会包括所有以“a”开头的单词。
4、当然,也可以使用其他通配符如“_”代表一个字符,或者使用正则表达式等方式实现更复杂的查询。总之,SQL提供了丰富的语法和功能,能够帮助我们精确地查询数据。
三、java如何防止sql注入
1、java防SQL注入,最简单的办法是杜绝SQL拼接,SQL注入攻击能得逞是因为在原有SQL语句中加入了新的逻辑,如果使用PreparedStatement来代替Statement来执行SQL语句,其后只是输入参数,SQL注入攻击手段将无效,这是因为PreparedStatement不允许在不同的插入时间改变查询的逻辑结构,大部分的SQL注入已经挡住了,在WEB层我们可以过滤用户的输入来防止SQL注入比如用Filter来过滤全局的表单参数
2、04importjavax.servlet.FilterChain;
3、05importjavax.servlet.FilterConfig;
4、06importjavax.servlet.ServletException;
5、07importjavax.servlet.ServletRequest;
6、08importjavax.servlet.ServletResponse;
7、09importjavax.servlet.http.HttpServletRequest;
8、10importjavax.servlet.http.HttpServletResponse;
9、12*通过Filter过滤器来防SQL注入攻击
10、15publicclassSQLFilterimplementsFilter{
11、16privateStringinj_str="'|and|exec|insert|select|delete|update|count|*|%
12、|chr|mid|master|truncate|char|declare|;|or|-|+|,";
13、17protectedFilterConfigfilterConfig=null;
14、19*Shouldacharacterencodingspecifiedbytheclientbeignored?
15、21protectedbooleanignore=true;
16、22publicvoidinit(FilterConfigconfig)throwsServletException{
17、24this.inj_str=filterConfig.getInitParameter("keywords");
18、26publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,
19、27FilterChainchain)throwsIOException,ServletException{
20、28HttpServletRequestreq=(HttpServletRequest)request;
21、29HttpServletResponseres=(HttpServletResponse)response;
22、30Iteratorvalues=req.getParameterMap().values().iterator();//获取所有的表单参数
23、32String[]value=(String[])values.next();
24、33for(inti=0;i 25、35//TODO这里发现sql注入代码的业务逻辑代码 26、40chain.doFilter(request,response); 27、42publicbooleansql_inj(Stringstr) 28、44String[]inj_stra=inj_str.split("\\|"); 29、45for(inti=0;i 30、47if(str.indexOf(""+inj_stra[i]+"")>=0) 31、百度搜索圈T社区(www.aiquanti.com)免费视频教程 MySQL一直以来都支持正则匹配,不过对于正则替换则一直到MySQL8.0才支持。对于这类场景,以前要么在MySQL端处理,要么把数据拿出来在应用端处理。 比如我想把表y1的列str1的出现第3个action的子串替换成dble,怎么实现? 1.自己写SQL层的存储函数。代码如下写死了3个,没有优化,仅仅作为演示,MySQL里非常不建议写这样的函数。 DROPFUNCTIONIFEXISTS`func_instr_simple_ytt`$$ CREATEDEFINER=`root`@`localhost`FUNCTION`func_instr_simple_ytt`( f_strVARCHAR(1000),--Parameter1 f_substrVARCHAR(100),--Parameter2 f_timesint--timescounter.onlysupport3. declarev_resultvarchar(1000)default'ytt';--result. declarev_substr_lenintdefault0;--searchstringlength. setv_substr_len=length(f_substr); selectinstr(f_str,f_substr)into@p1;--Firstrealposition. selectinstr(substr(f_str,@p1+v_substr_len),f_substr)into@p2;Secondaryvirtualposition. selectinstr(substr(f_str,@p2+@p1+2*v_substr_len-1),f_substr)into@p3;--Thirdvirtualposition. if@p1>0&&@p2>0&&@p3>0then--Fine. concat(substr(f_str,1,@p1+@p2+@p3+(f_times-1)*v_substr_len-f_times) substr(f_str,@p1+@p2+@p3+f_times*v_substr_len-2))intov_result; setv_result=f_str;--Neverchanged. mysql>updatey1setstr1=func_instr_simple_ytt(str1,'action','dble',3); QueryOK,20rowsaffected(0.12sec) Rowsmatched:20Changed:20Warnings:0 2.导出来用sed之类的工具替换掉在导入,步骤如下:(推荐使用)1)导出表y1的记录。 mysqlmysql>select*fromy1intooutfile'/var/lib/mysql-files/y1.csv';QueryOK,20rowsaffected(0.00sec) shellroot@ytt-Aspire-V5-471G:/var/lib/mysql-files#sed-i's/action/dble/3'y1.csv 3)再次导入处理好的数据,完成。 QueryOK,0rowsaffected(0.99sec) mysql>loaddatainfile'/var/lib/mysql-files/y1.csv'intotabley1; QueryOK,20rowsaffected(0.14sec) Records:20Deleted:0Skipped:0Warnings:0 以上两种还是推荐导出来处理好了再重新导入,性能来的高些,而且还不用自己费劲写函数代码。那MySQL8.0对于以上的场景实现就非常简单了,一个函数就搞定了。 mysqlmysql>updatey1setstr1=regexp_replace(str1,'action','dble',1,3);QueryOK,20rowsaffected(0.13sec)Rowsmatched:20Changed:20Warnings:0 还有一个regexp_instr也非常有用,特别是这种特指出现第几次的场景。比如定义SESSION变量@a。 mysqlmysql>set@a='aabbcceefilucy111bs234523556119101020301040';QueryOK,0rowsaffected(0.04sec) 拿到至少两次的数字出现的第二次子串的位置。 mysqlmysql>selectregexp_instr(@a,'[:digit:]{2,}',1,2);+--------------------------------------+|regexp_instr(@a,'[:digit:]{2,}',1,2)|+--------------------------------------+|50|+--------------------------------------+1rowinset(0.00sec) 那我们在看看对多字节字符支持如何。 mysql>set@a='中国美国俄罗斯日本中国北京上海深圳广州北京上海武汉东莞北京青岛北京'; QueryOK,0rowsaffected(0.00sec) mysql>selectregexp_instr(@a,'北京',1,1); +-------------------------------+ +-------------------------------+ +-------------------------------+ mysql>selectregexp_instr(@a,'北京',1,2); +-------------------------------+ +-------------------------------+ +-------------------------------+ mysql>selectregexp_instr(@a,'北京',1,3); +-------------------------------+ +-------------------------------+ +-------------------------------+ 那总结下,这里我提到了MySQL8.0的两个最有用的正则匹配函数regexp_replace和regexp_instr。针对以前类似的场景算是有一个完美的解决方案。 1.判断sql字符串是否包含数字的方法是使用正则表达式匹配数字的模式,如果匹配成功,则说明字符串中包含数字;如果匹配失败,则说明字符串中不包含数字。 2.判断sql字符串是否包含字母的方法也是使用正则表达式匹配字母的模式,如果匹配成功,则说明字符串中包含字母;如果匹配失败,则说明字符串中不包含字母。 3.在实际编程中,使用正则表达式可以帮助我们更准确地判断字符串的类型,从而进行相应的逻辑处理。 此外,在sql语句中包含数字和字母的情况比较常见,因此在处理sql语句时要注意判断字符串中是否包含数字和字母。 关于本次sql正则表达式去除特殊符号和java如何防止sql注入的问题分享到这里就结束了,如果解决了您的问题,我们非常高兴。 ——————————————小炎智能写作工具可以帮您快速高效的创作原创优质内容,提高网站收录量和各大自媒体原创并获得推荐量,点击右上角即可注册使用四、MySQL正则表达式入门教程
五、怎样判断sql字符串中是否包含数字和字母
相关新闻推荐
- sql正则表达式取出满足条件的字符串 pycharm怎样提取出字符串 2023-11-29
- sql正则表达式去除特殊符号 java如何防止sql注入 2023-11-29
- sql正则表达式去除数据中的0(如何去掉小数点后多余的0) 2023-11-29
- sql正则表达式去除所有空格?文件中如果有很多空格怎么消除 2023-11-29
- sql正则表达式去掉字符串 去除字符串前后空格的办法 2023-11-29
- sql正则表达式去换行符?如何去掉手动换行符 2023-11-29