首页
论坛
专栏
课程

分享:
SQL Injection注入漏洞的防范: 1、对输入进行严格的转义和过滤 2、使用参数化(Parameterized Query 或 Parameterized Statement) --推荐的做法 3、使用存储过程 1、PHP防范案例 转义举例: ``` function escape($link,$data){ if(is_string($data)){ return mysqli_real_escape_string($link,$data); } if(is_array($data)){ foreach ($data as $key=>$val){ $data[$key]=escape($link,$val); } } return $data; } ``` 过滤举例:(黑名单) ``` str_replace("%","",$_POST['username']),把post里面的数据里面含有%的替换成空 ``` 推荐的做法:使用参数化(先解析语法,而不是直接将参数拼接到SQL中) ``` $username=$_GET['username']; $password=$_GET['password']; try{ $pdo=new PDO('mysql:host=localhost;dbname=ant', 'root', 'root'); $sql="select * from admin where username=? and passowrd=?"; $stmt=$pdo->prepare($sql);//先不传参数,先解析语法 // var_dump($stmt); $stmt->execute(array($username,$password)); //这个时候在把参数传进去,以索引数组的方式传进去,就成功防止了注入 }catch (PDOException $e){ echo $e->getMessage(); } ?> ``` 2、python防范案例 不安全的写法: 直接将变量拼到SQL,产生注入 ``` import psycopg2 def bla_range_result(self,startid,endid): range_result = “select * from result where id>=%s and id<=%s” % (startid,endid) self.cur.execute(range_result) self.db.commit() ``` 不安全的写法: 使用psycopg2的占位符写法 ``` import psycopg2 def bla_range_result(self,startid,endid): range_result = "select * from result where id>=%s and id<=%s" self.cur.execute(range_result,(startid,endid)) self.db.commit() ``` 3、使用存储过程 使用存储过程的效果和参数化查询语句类似,其区别就是存储过程需要先将SQL语句定义在数据库中。但需要注意的是,存储过程中也可能会存在注入问题。因此应该避免在存储过程内使用动态的SQL语句。

上一篇 :
下一篇 :
讨论 (0)
沪ICP备16048531号-1
沪公网安备 31011502006611号