前臺我們可以通過過濾用戶輸入,后臺可以通過PreparedStatement來代替Statement來執(zhí)行SQL語句。
為夏邑等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及夏邑網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都做網(wǎng)站、成都網(wǎng)站建設(shè)、夏邑網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!
在java Web體系中,可以寫自定義標(biāo)簽,過濾用戶輸入,也可以寫一個filter過濾器。比如說自定義標(biāo)簽。
開發(fā)步驟:
1 寫一個標(biāo)簽處理類
2??在/WEB-INF/目錄下,寫一個*.tld文件,目的是讓W(xué)eb容器知道自定義標(biāo)簽和標(biāo)簽處理類的對應(yīng)關(guān)系
3 在JSP頁面中,通過%@taglib%指令引用標(biāo)簽庫.
4 部署web應(yīng)用,訪問simple.jsp即可
其中,標(biāo)簽處理類可以這樣寫,轉(zhuǎn)義大于號,小于號等特殊符號。
package?cn.itcast.web.jsp.tag;
import?java.io.IOException;
import?java.io.StringWriter;
import?javax.servlet.jsp.JspException;
import?javax.servlet.jsp.PageContext;
import?javax.servlet.jsp.tagext.JspFragment;
import?javax.servlet.jsp.tagext.SimpleTagSupport;
//simple:filter標(biāo)簽處理類
public?class?FilterTag?extends?SimpleTagSupport?{
public?void?doTag()?throws?JspException,?IOException?{
JspFragment?jspFragment?=?this.getJspBody();
StringWriter?writer?=?new?StringWriter();
jspFragment.invoke(writer);
String?temp?=?writer.getBuffer().toString();
//結(jié)果必定是轉(zhuǎn)義后的字符串
temp?=?filter(temp);
PageContext?pageContext?=?(PageContext)?this.getJspContext();
pageContext.getOut().write(temp);
}
public?String?filter(String?message)?{
if?(message?==?null)
return?(null);
char?content[]?=?new?char[message.length()];
message.getChars(0,?message.length(),?content,?0);
StringBuffer?result?=?new?StringBuffer(content.length?+?50);
for?(int?i?=?0;?i??content.length;?i++)?{
switch?(content[i])?{
case?'':
result.append("lt;");
break;
case?'':
result.append("gt;");
break;
case?'':
result.append("amp;");
break;
case?'"':
result.append("quot;");
break;
default:
result.append(content[i]);
}
}
return?(result.toString());
}
}
由于在構(gòu)造查詢語句的時候,會拼接來自用戶輸入的數(shù)據(jù),如果沒有對用戶輸入數(shù)據(jù)作適當(dāng)?shù)倪^濾,用戶就可以構(gòu)造一些特殊的數(shù)據(jù),通過服務(wù)器返回的錯誤信息來獲取數(shù)據(jù)庫中的信息,當(dāng)然包括用戶名密碼類的敏感數(shù)據(jù),甚至直接修改數(shù)據(jù)。
比如:簡單的查詢 sql="select * from abc where a='" + x +"'";
構(gòu)造特殊的x:sql="select * from abc where a='" + "' having '1'='1" +"'"; //由于沒有g(shù)roup by 語句而單獨(dú)使用having ,將會出錯,服務(wù)器返回錯誤信息,錯誤信息中會包括比如字段名稱,數(shù)據(jù)庫名稱等等一些。獲取這些信息后,就可以進(jìn)一步構(gòu)造特殊語句獲取更多信息。
所以防注入的2個要點(diǎn)就是:過濾和屏蔽錯誤提示。
你在init函數(shù)中修改了 inj_str的值, 而你在調(diào)用這個函數(shù)時有沒有傳FilterConfig config啊。
三種方式:
一,HTML防注入。
一般的html注入都是在字符串中加入了html標(biāo)簽,用下JAVA代碼可以去掉這部分代碼。
代碼如下,自己封裝成方法即可。
String msge = "asdasdasdasd div id=\"f\"asdfsdf";
System.out.println(msge);
msge = msge.replace("", "");
msge = msge.replace("", "");
msge = msge.replace(" ", " ");
msge = msge.replace("", "");
msge = msge.replace("\"", """);
msge = msge.replace("'", "qpos;");
System.out.println(msge);
二、防SQL注入
最簡單最容易的是限制用戶輸入。
簡單點(diǎn)的就是不允許用戶輸入單引號 和 --,因?yàn)閱我柼?-在SQL中都是影響執(zhí)行的。
但SQL注入是多方面的,防止的方法也有很多種。
1、地址欄禁止特殊字符防SQL注入
把特殊字符(如and、or、'、")都禁止提交就可以防止注入了。
2、php過濾html字符串,防止SQL注入
批量過濾post,get敏感數(shù)據(jù)
$_GET = stripslashes_array($_GET);
$_POST = stripslashes_array($_POST);
數(shù)據(jù)過濾函數(shù)
function stripslashes_array($array) {
while(list($key,$var) = each($array)) {
if ($key != 'argc' $key != 'argv' (strtoupper($key) != $key || ''.intval($key) == "$key")) {
if (is_string($var)) {
$array[$key] = stripslashes($var);
}
if (is_array($var)) {
$array[$key] = stripslashes_array($var);
}
}
}
return $array;
}
3、替換HTML尾標(biāo)簽
function lib_replace_end_tag($str)
{
if (empty($str)) return false;
$str = htmlspecialchars($str);
$str = str_replace( '/', "", $str);
$str = str_replace("\\", "", $str);
$str = str_replace("", "", $str);
$str = str_replace("", "", $str);
$str = str_replace("SCRIPT", "", $str);
$str = str_replace("/SCRIPT", "", $str);
$str = str_replace("script", "", $str);
$str = str_replace("/script", "", $str);
$str=str_replace("select","select",$str);
$str=str_replace("join","join",$str);
$str=str_replace("union","union",$str);
$str=str_replace("where","where",$str);
$str=str_replace("insert","insert",$str);
$str=str_replace("delete","delete",$str);
$str=str_replace("update","update",$str);
$str=str_replace("like","like",$str);
$str=str_replace("drop","drop",$str);
$str=str_replace("create","create",$str);
$str=str_replace("modify","modify",$str);
$str=str_replace("rename","rename",$str);
$str=str_replace("alter","alter",$str);
$str=str_replace("cas","cast",$str);
$str=str_replace("","",$str);
$str=str_replace("","",$str);
$str=str_replace("","",$str);
$str=str_replace(" ",chr(32),$str);
$str=str_replace(" ",chr(9),$str);
$str=str_replace(" ",chr(9),$str);
$str=str_replace("",chr(34),$str);
$str=str_replace("'",chr(39),$str);
$str=str_replace("br /",chr(13),$str);
$str=str_replace("''","'",$str);
$str=str_replace("css","'",$str);
$str=str_replace("CSS","'",$str);
return $str;
}
三、專業(yè)的事情交給專業(yè)的工具去做。
安裝安全軟件。例如,在服務(wù)器中安裝“服務(wù)器安全狗”,可以設(shè)置防注入,防攻擊的設(shè)置,只要設(shè)置好安全規(guī)則,就可以屏蔽大多數(shù)攻擊入侵。
使用Hibernate框架的SQL注入防范 Hibernate是目前使用最多的ORM框架,在Java Web開發(fā)中,很多時候不直接使用JDBC,而使用Hibernate來提高開發(fā)效率。
在Hibernate中,仍然不應(yīng)該通過拼接HQL的方式,而應(yīng)使用參數(shù)化的方式來防范SQL注入。有兩種方式,一種仍然是使用JDBC一樣的占位符“?”,但更好的方式是使用Hibernate的命名參數(shù),例如檢測用戶名和密碼是否正確,使用Hibernate可以寫成:
String queryStr = “from user where username=:username ”+”password=:password”;
List result = session.createQuery(queryStr).setString("username", username).setString("password", password).list();
當(dāng)前題目:java程序防代碼注入,java防sql注入代碼
轉(zhuǎn)載來源:http://jinyejixie.com/article26/hopojg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、、Google、虛擬主機(jī)、網(wǎng)站收錄、移動網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)