防止sql注入net
1. ASP.NET网站程序防sql注入式攻击方法
一 什么是SQL注入式攻击?所谓SQL注入式攻击 就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串 欺骗服务器执行恶意的SQL命令 在某些表单中 用户输入的内容直接用来构造(或者影响)动态SQL命令 或作为存储过程的输入参数 这类表单特别容易受到SQL注入式攻击 常见的SQL注入式攻击过程类如
⑴ 某个 Web应用有一个登录页面 这个登录页面控制着用户是否有权访问应用 它要求用户输入一个名称和密码
⑵ 登录页面中输入的内容将直接用来构造动态的SQL命令 或者直接用作存储过程的参数 下面是ASP NET应用构造查询的一个例子
System Text StringBuilderquery=newSystem Text StringBuilder( SELECT*fromUsersWHERElogin= ) Append(txtLogin Text) Append( ANDpassword= ) Append(txtPassword Text) Append( );
⑶ 攻击者在用户名字和密码输入框中输入 或 = 之类的内容
⑷ 用户输入的内容提交给服务器之后 服务器运行上面的ASP NET代码构造出查询用户的SQL命令 但由于攻击者输入的内容非常特殊 所以最后得到的SQL命令变成 SELECT * from Users WHERE login = or = AND password = or =
⑸ 服务器执行查询或存储过程 将用户输入的身份信息和服务器中保存的身份信息进行对比
⑹ 由于SQL命令实际上已被注入式攻击修改 已经不能真正验证用户身份 所以系统会错误地授权给攻击者
如果攻击者知道应用会将表单中输入的内容直接用于验证身份的查询 他就会尝试输入某些特殊的SQL字符串篡改查询改变其原来的功能 欺骗系统授予访问权限
系统环境不同 攻击者可能造成的损害也不同 这主要由应用访问数据库的安全权限决定 如果用户的帐户具有管理员或其他比较高级的权限 攻击者就可能对数据库的表执行各种他想要做的操作 包括添加 删除或更新数据 甚至可能直接删除表
二 如何防范?
好在要防止ASP NET应用被SQL注入式攻击闯入并不是一件特别困难的事情 只要在利用表单输入的内容构造SQL命令之前 把所有输入内容过滤一番就可以了 过滤输入内容可以按多种方式进行
⑴ 对于动态构造SQL查询的场合 可以使用下面的技术
第一 替换单引号 即把所有单独出现的单引号改成两个单引号 防止攻击者修改SQL命令的含义 再来看前面的例子 SELECT * from Users WHERE login = or = AND password = or = 显然会得到与 SELECT * from Users WHERE login = or = AND password = or = 不同的结果
第二 删除用户输入内容中的所有连字符 防止攻击者构造出类如 SELECT * from Users WHERE login = mas AND password = 之类的查询 因为这类查询的后半部分已经被注释掉 不再有效 攻击者只要知道一个合法的用户登录名称 根本不需要知道用户的密码就可以顺利获得访问权限
第三 对于用来执行查询的数据库帐户 限制其权限 用不同的用户帐户执行查询 插入 更新 删除操作 由于隔离了不同帐户可执行的操作 因而也就防止了原本用于执行SELECT命令的地方却被用于执行INSERT UPDATE或DELETE命令
⑵ 用存储过程来执行所有的查询 SQL参数的传递方式将防止攻击者利用单引号和连字符实施攻击 此外 它还使得数据库权限可以限制到只允许特定的存储过程执行 所有的用户输入必须遵从被调用的存储过程的安全上下文 这样就很难再发生注入式攻击了
⑶ 限制表单或查询字符串输入的长度 如果用户的登录名字最多只有 个字符 那么不要认可表单中输入的 个以上的字符 这将大大增加攻击者在SQL命令中插入有害代码的难度
⑷ 检查用户输入的合法性 确信输入的内容只包含合法的数据 数据检查应当在客户端和服务器端都执行——之所以要执行服务器端验证 是为了弥补客户端验证机制脆弱的安全性
在客户端 攻击者完全有可能获得网页的源代码 修改验证合法性的脚本(或者直接删除脚本) 然后将非法内容通过修改后的表单提交给服务器 因此 要保证验证操作确实已经执行 唯一的办法就是在服务器端也执行验证 你可以使用许多内建的验证对象 例如RegularExpressionValidator 它们能够自动生成验证用的客户端脚本 当然你也可以插入服务器端的方法调用 如果找不到现成的验证对象
你可以通过CustomValidator自己创建一个
⑸ 将用户登录名称 密码等数据加密保存 加密用户输入的数据 然后再将它与数据库中保存的数据比较 这相当于对用户输入的数据进行了 消毒 处理 用户输入的数据不再对数据库有任何特殊的意义 从而也就防止了攻击者注入SQL命令 System Web Security FormsAuthentication类有一个 非常适合于对输入数据进行消毒处理
lishixin/Article/program/net/201311/13891
2. SQL参数化查询--最有效可预防SQL注入攻击的防御方式
参数化查询,作为预防SQL注入攻击的有效手段,通过在SQL语句中使用参数来传入值,避免了直接将用户输入插入到SQL语句中,从而保护数据库免受恶意攻击。广泛应用于Access、SQL Server、MySQL、SQLite等数据库。
在ASP环境中,参数化查询主要通过Connection对象和Command对象实现。对于Access数据库,使用问号作为参数标志,而SQL Server支持匿名和非匿名参数,但ASP中仅支持匿名方式。
ASP.NET环境下,参数化查询同样通过Connection对象和Command对象完成。当数据库为SQL Server时,可以使用带参数名的命名参数,格式为“@”字符加参数名。
PHP环境中,MySQL支持的参数格式为“?”加参数名,实现参数化查询。
综上所述,参数化查询是一种有效防止SQL注入攻击的方法,其在不同编程环境和数据库系统中均有实现。通过使用参数化查询,可以确保数据库安全,避免敏感数据泄露和系统被恶意篡改。
3. sql注入方式和防御
注入方式:QL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。防御:如果是.net的后台 比如sql语句是 id='"+ textbox.Text +"' 就会被注入, 如果[email protected]("@id",textbox.Text) 这样就可以。用replace把单引等特殊字符替换也行
4. asp.net濡备綍阒叉sql娉ㄥ叆
SQL娉ㄥ叆鏀诲嚮鍜岄勯槻
鍏充簬SQL娉ㄥ叆鏀诲嚮鍙婇槻锣闅忕潃缃戠粶镄勬櫘鍙婂拰鍏崇郴鏁版嵁搴撶殑骞挎硾搴旂敤锛岀绣缁滃畨鍏ㄥ彉寰楄秺𨱒ヨ秺閲嶈併备笅闱锛屾垜涓轰綘鎼灭储鏁寸悊浜哠QL娉ㄥ叆镄勬敾鍑诲拰阒茶寖銆傝峰弬钥冨苟阒呰汇傚笇链涘逛綘链夊府锷┿傛洿澶氢俊鎭璇峰叧娉ㄦ垜浠镄勫簲灞婃瘯涓氱敓锘硅缃戯紒
涓.SQL娉ㄥ叆琚鍑
绠钥岃█涔嬶纴SQL娉ㄥ叆鏄搴旂敤绋嫔簭寮鍙戜汉锻桦湪搴旂敤绋嫔簭涓镒忓栧紩鍏SQL浠g爜镄勮繃绋嬨傚叾搴旂敤绋嫔簭镄勭碂绯曡捐′娇涔嬫垚涓哄彲鑳斤纴鍙链夐偅浜涚洿鎺ヤ娇鐢ㄧ敤鎴锋彁渚涚殑鍊兼潵鏋勫缓SQL璇鍙ョ殑搴旂敤绋嫔簭镓崭细鍙楀埌褰卞搷銆
渚嫔傦纴鍦ㄧ敤鎴疯緭鍏ュ㈡埛ID钖庯纴GridView鏄剧ず璇ュ㈡埛镄勬墍链夎岃板綍銆傚湪镟寸湡瀹炵殑𨱍呭喌涓嬶纴鐢ㄦ埛蹇呴’杈揿叆瀵嗙爜绛夎よ瘉淇℃伅锛屾垨钥呮牴鎹涔嫔墠镄勭橱褰曢〉闱㈣幏鍙栫敤鎴稩D銆傝缮鍙鑳芥湁涓浜涙枃链妗嗕緵鐢ㄦ埛杈揿叆鍏抽敭淇℃伅锛屽傝㈠崟镄勬棩链熻寖锲存垨浜у搧钖岖О銆傞梾棰樻槸濡备綍镓ц屽懡浠ゃ傚湪杩欎釜渚嫔瓙涓锛孲QL璇鍙ユ槸阃氲繃瀛楃︿覆鏋勯犳妧链锷ㄦ佸垱寤虹殑銆傛枃链妗唗xtID镄勫艰鐩存帴澶嶅埗鍒板瓧绗︿覆涓銆备唬镰佸备笅:
鍦ㄦ湰渚嬩腑锛屾敾鍑昏呭彲浠ョ℃敼SQL璇鍙ャ傞氩父锛屾敾鍑荤殑绗涓涓鐩镙囨槸銮峰彇阌栾淇℃伅銆傚傛灉阌栾澶勭悊涓嶅綋锛屽簳灞备俊鎭灏嗘毚闇茬粰鏀诲嚮钥呫傝ヤ俊鎭鍙鐢ㄤ簬杩涗竴姝ョ殑鏀诲嚮銆
渚嫔傦纴𨱍宠薄涓涓嫔綋鎭ㄥ湪鏂囨湰妗嗕腑杈揿叆浠ヤ笅瀛楃︿覆镞朵细鍙戠敓浠涔堛
阒垮皵寮楀熀鎴栬1=涓涓
镆ョ湅缁撴灉鐢熸垚镄勫畬鏁碨QL璇鍙:
璇ヨ鍙ュ皢杩斿洖镓链夎㈠崟璁板綍锛屽嵆浣胯繖浜涜㈠崟涓嶆槸鐢盇LFDI鍒涘缓镄勶纴锲犱负瀵逛簬姣忎竴琛岋纴1=1濮嬬粓涓虹湡銆傝繖镙峰仛镄勫悗鏋沧槸涓嶆樉绀哄綋鍓岖敤鎴风殑鍏蜂綋淇℃伅锛岃屾槸灏嗘墍链変俊鎭鏄剧ず缁欐敾鍑昏呫傚傛灉鏁忔劅淇℃伅锛屽傜ぞ浼氩畨鍏ㄥ彿镰併佺敓镞ユ垨淇$敤鍗′俊鎭鏄剧ず鍦ㄥ睆骞曚笂锛屽皢浼氩甫𨱒ヤ弗閲岖殑闂棰樸傚叾瀹炶繖浜涚亩鍗旷殑SQL娉ㄥ叆寰寰鏄闾d簺澶у瀷鐢靛晢镄勭储鎭笺备竴鑸𨱒ヨ达纴鏀诲嚮镣逛笉鍦ㄤ簬鏂囨湰妗嗭纴钥屽湪浜庢煡璇㈠瓧绗︿覆(鍙浠ョ敤𨱒ュ悜鏁版嵁搴扑紶杈揿硷纴姣斿备粠鍒楄〃椤靛埌璇︾粏椤电殑鍞涓镙囱瘑绗)銆
杩桦彲浠ヨ繘琛屾洿澶嶆潅镄勬敾鍑汇备緥濡傦纴鏀诲嚮钥呭彲浠ヤ娇鐢ㄤ袱涓杩炲瓧绗(-)𨱒ユ敞閲婃帀SQL璇鍙ョ殑鍏朵綑閮ㄥ垎銆傝繖绉嶆敾鍑讳粎闄愪簬SQLServer锛屼絾瀵逛簬鍏朵粬绫诲瀷镄勬暟鎹搴扑篃链夌瓑鏁堢殑鏂规硶锛屾瘆濡侻ySql浣跨敤(#)鍜孙racle浣跨敤(锛)鍙枫傛ゅ栵纴鏀诲嚮钥呭彲浠ユ墽琛屽寘钖浠绘剰SQL璇鍙ョ殑镓瑰勭悊锻戒护銆傚逛簬SQLServer鎻愪緵绋嫔簭锛屾敾鍑昏呭彧闇鍦ㄦ柊锻戒护鍓嶉溃锷犱笂鍒嗗彿(锛)銆傛敾鍑昏呭彲浠ラ氲繃杩欑嶆柟寮忓垹闄ゅ叾浠栬〃镄勫唴瀹癸纴鐢氲呖鍙浠ヨ皟鐢⊿QLServer镄勭郴缁熷瓨鍌ㄨ繃绋媥p_cmdshell𨱒ュ懡浠ゅ拰镓ц屼换镒忕▼搴忋
鏀诲嚮钥呭湪鏂囨湰妗嗕腑杈揿叆浠ヤ笅鍐呭癸纴鍏剁洰镙囨槸鍒犻櫎Customers琛ㄤ腑镄勬墍链夎屻
銆娄鸡鏄ャ嬶绂浠庡㈡埛涓鍒犻櫎*
绗浜岋纴棰勯槻
濡备綍阒叉SQL娉ㄥ叆琚鍑伙纻闇瑕佽颁綇鍑犵偣銆傞栧厛锛屼娇鐢ㄦ枃链妗嗘槸涓濂戒富镒忋侻axLength灞炴ф潵阒叉㈢敤鎴疯緭鍏ヨ繃闀跨殑瀛楃︺傚洜涓哄畠浠涓嶅熼暱锛屾墍浠ュ噺灏戜简澶ч噺绮樿创鑴氭湰镄勫彲鑳芥с傚叾娆★纴搴旇ヤ娇鐢ˋSP.NET楠岃瘉鎺т欢𨱒ラ挛瀹氶敊璇镄勬暟鎹(濡傛枃链銆佺┖鍗曞厓镙煎拰鏁板间腑镄勭壒娈婂瓧绗)銆傛ゅ栵纴鎭ㄥ簲璇ラ檺鍒堕敊璇娑堟伅缁椤嚭镄勬彁绀恒傚綋鎹曡幏鍒版暟鎹搴揿纾甯告椂锛屽彧鏄剧ず涓浜涘父瑙勪俊鎭(濡傗沧暟鎹婧愰敊璇钬)锛岃屼笉鏄寮傚父涓镄勪俊鎭銆傛秷鎭灞炴э纴杩椤彲鑳芥毚闇茬郴缁熸敾鍑荤偣銆
镟撮吨瑕佺殑鏄锛屽繀椤诲皬蹇冨湴鍒犻櫎鐗规畩瀛楃︺备緥濡傦纴鎭ㄥ彲浠ョ敤涓や釜鍗曞紩鍙锋浛鎹㈠崟寮曞彿锛岃繖镙峰氨涓崭细涓岙QL璇鍙ョ殑鍒嗛殧绗︽贩娣:
瀛楃︿覆ID=txtID銆傛枃链()銆傛浛鎹(钬溾濄佲溾)锛
褰撶劧锛屽傛灉鏂囨湰纭瀹为渶瑕佸寘钖鍗曞紩鍙凤纴杩欐牱锅氢细甯︽潵鍏朵粬楹荤储銆傛ゅ栵纴涓浜汼QL娉ㄥ叆鏀诲嚮鏄鍙琛岀殑銆傛浛鎹㈠崟寮曞彿鍙浠ラ槻姝㈢敤鎴锋彁鍓岖粨𨱒熷瓧绗︿覆銆备絾鏄锛屽傛灉鍖呭惈鏁板肩殑SQL璇鍙ユ槸锷ㄦ佹瀯阃犵殑锛孲QL娉ㄥ叆鏀诲嚮灏嗗啀娆″彂鎸ヤ綔鐢ㄧ┖銆傝繖涓婕忔礊缁忓父琚蹇借(杩欐槸闱炲父鍗遍橹镄)銆傛洿濂界殑瑙e喅鏂规堟槸浣跨敤鍙傛暟鍖栧懡浠ゆ垨瀛桦偍杩囩▼杩涜岃浆涔夛纴浠ラ槻姝SQL娉ㄥ叆鏀诲嚮銆
鍙︿竴涓濂界殑寤鸿鏄闄愬埗鐢ㄤ簬璁块梾鏁版嵁搴撶殑甯愭埛镄勬潈闄愩傝ュ笎鎴锋棤𨱒冭块梾鍏朵粬鏁版嵁搴撴垨镓ц屾墿灞曞瓨鍌ㄨ繃绋嬨备絾鏄锛岃繖骞朵笉鑳借В鍐砈QL鑴氭湰娉ㄥ叆镄勯梾棰桡纴锲犱负鐢ㄤ簬杩炴帴鏁版嵁搴撶殑杩涚▼鍑犱箮镐绘槸姣斾换浣曞崟涓鐢ㄦ埛闇瑕佹洿澶氱殑𨱒冮檺銆傞氲繃闄愬埗𨱒冮檺锛屽彲浠ラ槻姝㈠垹闄よ〃镄勬敾鍑伙纴浣嗘槸涓嶈兘阒叉㈡敾鍑昏呭伔鐪嫔埆浜虹殑銆备俊鎭銆
绗涓夛纴娉ㄥ皠钖庢敾鍑
绮炬槑镄勭敤鎴峰彲鑳界煡阆撹缮链夊彟涓绉嶆敾鍑籛eb鎺т欢镄勬綔鍦ㄦ柟娉曘傚敖绠″弬鏁板寲锻戒护鍙浠ラ槻姝SQL娉ㄥ叆鏀诲嚮锛屼絾瀹冧滑镞犳硶阒叉㈡敾鍑昏呭悜鍙戦佸洖链嶅姟鍣ㄧ殑鏁版嵁涓娣诲姞鎭舵剰鍊笺傚傛灉涓嶆镆ヨ繖浜涘硷纴鏀诲嚮钥呭彲浠ユ彁浜ゆ湰𨱒ヤ笉瀛桦湪镄勬带鍒跺笺
渚嫔傦纴锅囱炬偍链変竴涓鏄剧ず褰揿墠鐢ㄦ埛璁㈠崟镄勫垪琛ㄣ傜嫛鐚剧殑鏀诲嚮钥呭彲鑳戒细淇濆瓨椤甸溃镄勬湰鍦板坛链锛屼慨鏀笻TML鍐呭逛互钖戝垪琛ㄤ腑娣诲姞镟村氶”鐩锛岀劧钖庨夋嫨涓涓钬滃亣钬濋”鐩銆傚傛灉鏀诲嚮鎴愬姛锛屾敾鍑昏呭皢鑳藉熺湅鍒板叾浠栫敤鎴风殑璁㈠崟锛岃繖鏄剧劧鏄涓涓闂棰樸傚垢杩愮殑鏄锛孉SP.NET浣跨敤涓涓寰埚皯琚鎻愬强镄勫姛鑳解滀簨浠堕獙璇佲濇潵阒叉㈣繖绉嶆敾鍑汇备簨浠堕獙璇佹镆ュ彂阃佸洖链嶅姟鍣ㄧ殑鏁版嵁锛屽苟楠岃瘉鍏跺肩殑钖堟硶镐с备緥濡傦纴濡傛灉鎻愪氦镄勬暟鎹琛ㄦ槑鐢ㄦ埛阃夋嫨浜嗕竴涓镞犳剰涔夌殑鏁版嵁(锲犱负瀹冧笉瀛桦湪浜庢带浠朵腑)锛孉SP.NET灏嗙敓鎴愪竴涓阌栾骞跺仠姝㈠勭悊銆傞氲繃鍦≒age鎸囦护涓灏咵nableEventValidation灞炴ц剧疆涓篺alse锛屽彲浠ョ佺敤浜嬩欢楠岃瘉銆傚綋鎭ㄥ垱寤轰娇鐢ㄥ㈡埛绔鑴氭湰锷ㄦ佹洿鏀瑰唴瀹圭殑椤甸溃镞讹纴鎭ㄩ渶瑕佹墽琛屾ゆラゃ备絾鏄锛屾ゆ椂锛屽湪浣跨敤杩欎簺鍊间箣鍓嶏纴璇锋敞镒忔镆ユ綔鍦ㄧ殑钖庢敞鍏ユ敾鍑汇
;MyBatis镐庝箞阒叉SQL娉ㄥ叆锛
鐢#{鍙傛暟}杩涜岄勭紪璇戝氨鍙浠ラ槻姝浜嗭纴鍗冧竾鍒鐢${}杩欑嶆柟寮忔敞鍏ュ弬鏁般
mybatis妗嗘灦浣滀负涓娆惧崐镊锷ㄥ寲镄勬寔涔呭眰妗嗘灦锛屽叾sql璇鍙ラ兘瑕佹垜浠镊宸辨潵镓嫔姩缂栧啓锛岃繖涓镞跺椤綋铹堕渶瑕侀槻姝sql娉ㄥ叆銆傚叾瀹濵ybatis镄剆ql鏄涓涓鍏锋湁钬滆緭鍏+杈揿嚭钬濆姛鑳斤纴绫讳技浜庡嚱鏁扮殑缁撴瀯锛屽备笅锛
selectid,title,author,content
fromblogwhereid=#{id}
杩欓噷锛宲arameterType镙囩ず浜呜緭鍏ョ殑鍙傛暟绫诲瀷锛宺esultType镙囩ず浜呜緭鍑虹殑鍙傛暟绫诲瀷銆傚洖搴斾笂鏂囷纴濡傛灉鎴戜滑𨱍抽槻姝sql娉ㄥ叆锛岀悊镓褰撶劧鍦拌佸湪杈揿叆鍙傛暟涓娄笅锷熷か銆备笂闱浠g爜涓楂树寒閮ㄥ垎鍗宠緭鍏ュ弬鏁板湪sql涓𨰾兼帴镄勯儴鍒嗭纴浼犲叆鍙傛暟钖庯纴镓揿嵃鍑烘墽琛岀殑sql璇鍙ワ纴浼氱湅鍒皊ql鏄杩欐牱镄勶细
selectid,title,author,contentfromblogwhereid=?
涓岖¤緭鍏ヤ粈涔埚弬鏁帮纴镓揿嵃鍑虹殑sql閮芥槸杩欐牱镄勚傝繖鏄锲犱负mybatis钖鐢ㄤ简棰勭紪璇戝姛鑳斤纴鍦╯ql镓ц屽墠锛屼细鍏埚皢涓婇溃镄剆ql鍙戦佺粰鏁版嵁搴撹繘琛岀紪璇戯纴镓ц屾椂锛岀洿鎺ヤ娇鐢ㄧ紪璇戝ソ镄剆ql锛屾浛鎹㈠崰浣岖︹滐纻钬濆氨鍙浠ヤ简銆傚洜涓簊ql娉ㄥ叆鍙鑳藉圭紪璇戣繃绋嬭捣浣灭敤锛屾墍浠ヨ繖镙风殑鏂瑰纺灏卞緢濂藉湴阆垮厤浜唖ql娉ㄥ叆镄勯梾棰樸
缃戠珯濡备綍阒叉SQL娉ㄥ叆锛
阒叉SQL娉ㄥ叆镄勬柟娉曞氨鏄涓嶈佸湪绋嫔簭涓浣跨敤𨰾兼帴镄勬柟寮忕敓鎴怱QL璇鍙
濡:"select*fromTableNamewherecolumnName='"+鍙橀噺+"'"
杩欐牱寰埚规槗琚娉ㄥ叆锛
濡傛灉鍙橀噺="'or1=1--"
杩椤彞sql镄勬浔浠跺皢姘歌繙涓虹湡
濡傛灉閲囩敤𨰾兼帴SQL瑕佹妸鍙橀噺涓镄'锛埚崟寮曞彿锛夋浛鎹涓''锛堜袱涓鍗曞紩鍙凤级
棰勭紪璇戜负浠涔堣兘阒叉sql娉ㄥ叆锛
锲犱负preparedStatement涓鍙浠ヤ笉鍖呭惈鏁版嵁锛屽彧鍖呭惈镎崭綔锛岃繖镙峰氨涓嶉渶瑕佺敤鏁版嵁𨱒ユ嫾鎺SQL銆
java濡备綍阒瞫ql鏀诲嚮锛
java阒睸QL娉ㄥ叆,链绠鍗旷殑锷炴硶鏄𨱒灭粷SQL𨰾兼帴,SQL娉ㄥ叆鏀诲嚮鑳藉缑阃炴槸锲犱负鍦ㄥ师链塖QL璇鍙ヤ腑锷犲叆浜嗘柊镄勯昏緫锛屽傛灉浣跨敤PreparedStatement𨱒ヤ唬镟縎tatement𨱒ユ墽琛孲QL璇鍙ワ纴鍏跺悗鍙鏄杈揿叆鍙傛暟锛孲QL娉ㄥ叆鏀诲嚮镓嬫靛皢镞犳晥锛岃繖鏄锲犱负PreparedStatement涓嶅厑璁稿湪涓嶅悓镄勬彃鍏ユ椂闂存敼鍙樻煡璇㈢殑阃昏緫缁撴瀯,澶ч儴鍒嗙殑SQL娉ㄥ叆宸茬粡鎸′綇浜,鍦╓EB灞傛垜浠鍙浠ヨ繃婊ょ敤鎴风殑杈揿叆𨱒ラ槻姝SQL娉ㄥ叆姣斿傜敤Filter𨱒ヨ繃婊ゅ叏灞镄勮〃鍗曞弬鏁般备笅闱㈠氨涓句笁涓渚嫔瓙𨱒ヨ存槑涓涓嬶细
绗涓绉嶏细
閲囩敤棰勭紪璇戣鍙ラ泦锛屽畠鍐呯疆浜嗗勭悊SQL娉ㄥ叆镄勮兘锷涳纴鍙瑕佷娇鐢ㄥ畠镄剆etString鏂规硶浼犲煎嵆鍙锛屽备笅镓绀猴细
Stringsql="select*fromuserswhereusername=?andpassword=?;PreparedStatementpreState=conn.prepareStatement(sql);preState.setString(1,userName);preState.setString(2,password);ResultSetrs=preState.executeQuery();...
绗浜岀嶏细
閲囩敤姝e垯琛ㄨ揪寮忓皢鍖呭惈链夊崟寮曞彿(')锛屽垎鍙(;)鍜屾敞閲婄﹀彿(--)镄勮鍙ョ粰镟挎崲鎺夋潵阒叉SQL娉ㄥ叆锛屽备笅镓绀猴细
(Stringstr)
{
returnstr.replaceAll(".*(+|(--)+).*","");
}
userName=TransactSQLInjection(userName);
password=TransactSQLInjection(password);
Stringsql="select*fromuserswhereusername='"+userName+"'andpassword='"+password+"'"
Statementsta=conn.createStatement();
ResultSetrs=sta.executeQuery(sql);
绗涓夌嶏细
浣跨敤Hibernate妗嗘灦镄凷QL娉ㄥ叆阒茶寖Hibernate鏄鐩鍓崭娇鐢ㄦ渶澶氱殑ORM妗嗘灦锛屽湪JavaWeb寮鍙戜腑锛屽緢澶氭椂鍊欎笉鐩存帴浣跨敤JDBC锛岃屼娇鐢℉ibernate𨱒ユ彁楂桦紑鍙戞晥鐜囥
鍦℉ibernate涓锛屼粛铹朵笉搴旇ラ氲繃𨰾兼帴HQL镄勬柟寮忥纴钥屽簲浣跨敤鍙傛暟鍖栫殑鏂瑰纺𨱒ラ槻锣侨QL娉ㄥ叆銆傛湁涓ょ嶆柟寮忥纴涓绉崭粛铹舵槸浣跨敤JDBC涓镙风殑鍗犱綅绗︹?钬濓纴浣嗘洿濂界殑鏂瑰纺鏄浣跨敤Hibernate镄勫懡钖嶅弬鏁帮纴渚嫔傛娴嬬敤鎴峰悕鍜屽瘑镰佹槸钖︽g‘锛屼娇鐢℉ibernate鍙浠ュ啓鎴愬备笅锛
StringqueryStr=钬渇romuserwhereusername=:username钬+钬漰assword=:password钬;
Listresult=session.createQuery(queryStr).setString("username",username).setString("password",password).list();