菜单

php intval

2019年2月13日 - 金沙编程资讯

get是通过UEvoqueL传参,不难揭破,不难被sql注入,幸免sql注入的方法之一是:加intval($_GET[‘id’]);

Python中预防sql注入的点子详解,pythonsql注入详解

前言

我们应该都了然未来web漏洞之首莫过于sql了,不管选用哪个种类语言进行web后端开发,只要利用了关系型数据库,大概都会遇上sql注入攻击难题。那么在Python
web开发的长河中sql注入是怎么出现的啊,又是怎么去解决这一个难题的?

自然,作者那边并不想谈谈其余语言是怎么着幸免sql注入的,网上有关PHP(博主注:听说是社会风气上最屌的语言)防注入的各类艺术都有,Python的法子其实看似,那里我就举例来说说。

起因

漏洞发出的来由最常见的就是字符串拼接了,当然,sql注入并不只是拼接一种状态,还有像宽字节流入,特殊字符转义等等很各类,这里就说说最常见的字符串拼接,那也是低档程序员最不难犯的荒唐。

先是大家定义一个类来拍卖mysql的操作

class Database:
 aurl = '127.0.0.1'
 user = 'root'
 password = 'root'
 db = 'testdb'
 charset = 'utf8'

 def __init__(self):
  self.connection = MySQLdb.connect(self.aurl, self.user, self.password, self.db, charset=self.charset)
  self.cursor = self.connection.cursor()

 def insert(self, query):
  try:
   self.cursor.execute(query)
   self.connection.commit()
  except Exception, e:
   print e
   self.connection.rollback()

 def query(self, query):
  cursor = self.connection.cursor(MySQLdb.cursors.DictCursor)
  cursor.execute(query)
  return cursor.fetchall()

 def __del__(self):
  self.connection.close()

这段代码在小编前边很多剧本里面都会看见,涉及到Python操作mysql数据库的脚本作者都会写进去那些类,那么那些类有标题吧?
答案是:有!

其一类是有缺点的,很简单导致sql注入,上面就说说为啥会发生sql注入。

为了求证难题的真实性,那里就写一个方法来调用上边的越发类里面的方法,假如出现谬误会直接抛出特别。

def test_query(articleurl):
 mysql = Database()
 try:
  querySql = "SELECT * FROM `article` WHERE url='" + articleurl + "'"
  chanels = mysql.query(querySql)
  return chanels
 except Exception, e:
  print e

本条点子格外简单,一个最广泛的select查询语句,也利用了最简便的字符串拼接组成sql语句,很显眼传入的参数
articleurl
可控,要想举办注入测试,只须要在articleurl的值前边加上单引号即可举行sql注入测试,那个不多说,肯定是存在注入漏洞的,脚本跑四遍,看吗结果

(1064, "You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''t.tips''' at line 1")

回显报错,很熟练的一无所长,那里自个儿传入的测试参数是

t.tips'

上面再说一种导致注入的动静,对下边的方式开展多少修改后

def test_query(articleurl):
 mysql = Database()
 try:
  querySql = ("SELECT * FROM `article` WHERE url='%s'" % articleurl)
  chanels = mysql.query(querySql)
  return chanels
 except Exception, e:
  print e

本条情势里面没有从来行使字符串拼接,而是使用了 %s
来代替要传播的参数,看起来是或不是老大像预编译的sql?那那种写法能无法预防sql注入呢?测试一下便领悟,回显如下

(1064, "You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''t.tips''' at line 1")

和方面的测试结果同样,所以那种艺术也是卓殊的,而且那种格局并不是预编译sql语句,那么怎么做才能预防sql注入呢?

解决

两种方案

     1> 对传播的参数进行编码转义

澳门金沙国际 ,     2> 使用Python的MySQLdb模块自带的办法

率先种方案其实在千千万万PHP的防注入方法里面都有,对特殊字符举行转义大概过滤。

第二种方案就是使用其中方法,类似于PHP里面的PDO,那里对下面的数码库类进行容易的改动即可。

修改后的代码

class Database:
 aurl = '127.0.0.1'
 user = 'root'
 password = 'root'
 db = 'testdb'
 charset = 'utf8'

 def __init__(self):
  self.connection = MySQLdb.connect(self.aurl, self.user, self.password, self.db, charset=self.charset)
  self.cursor = self.connection.cursor()

 def insert(self, query, params):
  try:
   self.cursor.execute(query, params)
   self.connection.commit()
  except Exception, e:
   print e
   self.connection.rollback()

 def query(self, query, params):
  cursor = self.connection.cursor(MySQLdb.cursors.DictCursor)
  cursor.execute(query, params)
  return cursor.fetchall()

 def __del__(self):
  self.connection.close()

此间 execute
执行的时候传出八个参数,第四个是参数化的sql语句,第三个是呼应的骨子里的参数值,函数内部会对传播的参数值进行对应的拍卖预防sql注入,实际使用的方法如下

preUpdateSql = "UPDATE `article` SET title=%s,date=%s,mainbody=%s WHERE id=%s"
mysql.insert(preUpdateSql, [title, date, content, aid])

诸如此类就可以预防sql注入,传入一个列表之后,MySQLdb模块内部会将列表系列化成一个元组,然后开展escape操作。

总结

自个儿从前的有些剧本中利用了存在sql注入漏洞的代码会渐渐改过来,好了,以上就是那篇文章的全体内容了,希望本文的始末对大家的上学或者工作能推动一定的协理,假使有疑难咱们可以留言沟通。

前言
大家应该都知道今后web漏洞之首莫过于sql了,不管选取哪类语言进行web后端开发,只…

多年来,在写程序时开首注目到sql注入的难点,由于之前写代码时不是很注意,有一对sql会设有被注入的高危害,那么防止sql注入的原理是什么样啊?大家先是通过PrepareStatement这些类来学习一下吗!
作为一个IT业爱妻士只要接触过数据库的人都应有明白sql注入的定义及有害,那么如何叫sql注入呢?作者在那边先给它来一个粗略的定义:sql注入,简单的话即便用户在前者web页面输入恶意的sql语句用来欺骗后端服务器去履行恶意的sql代码,从而造成数据库数据外泄或许遭受攻击。
那就是说,当我们在选用数据库时,怎么着去防范sql注入的发生呢?大家任天由命地就会想到在用JDBC举办连接时行使PreparedStatement类去替代Statement,只怕传播的规范参数完全不拔取String字符串,同样地,在用mybatis时,则尽量使用#{param}占位符的情势去幸免sql注入,其实jdbc和mybatis的法则是同样的。我们都知晓当我们利用PreparedStatement去写sql语句时,程序会对该条sql首先进行预编译,然后会将盛传的字符串参数以字符串的花样去处理,即会在参数的两边自动抬高单引号(’param’),而Statement则是直接省略暴虐地经过人为的字符串拼接的措施去写sql,那那样就很简单被sql注入。
那么,要是PreparedStatement只是单纯容易地通过把字符串参数两边加上引号的点子去处理,一样也很不难被sql注入,分明它并从未那么傻。比如说有如下一张表:

澳门金沙国际 1

澳门金沙国际 2

create table user
(
    id  int4  PRIMARY KEY,
    name VARCHAR(50) not null,
    class VARCHAR(50)
)

 

前言

中间有如下几条数据:

咱们应该都晓得以后web漏洞之首莫过于sql了,不管选拔哪一种语言进行web后端开发,只要利用了关系型数据库,或许都会遇见sql注入攻击难题。那么在Python
web开发的历程中sql注入是怎么现身的啊,又是怎么去化解那个难点的?

INSERT INTO `user` VALUES ('1', '张三', '1班');
INSERT INTO `user` VALUES ('2', '李四', '2班');
INSERT INTO `user` VALUES ('3', '王五', '3班');
INSERT INTO `user` VALUES ('4', '赵六', '4班');

自然,小编那边并不想谈谈其余语言是什么样防止sql注入的,网上有关PHP(博主注:传说是社会风气上最屌的语言)防注入的各类艺术都有,Python的措施其实看似,那里自个儿就举例来说说。

此间大家选择mybatis的 {param} 和 #{param} 三个不等的占位符来作为示范解释 Statement 和 PreparedStatement (mybatis和jdbc的低层原理是一样的)。首先

起因

{}是不大概防备sql注入的,它亦可透过字符串拼接的款式来随便摆弄你的sql语句,而#{}则足以很大程度上地预防sql注入,上边是关于这些的一条sql:

漏洞发出的来头最广大的就是字符串拼接了,当然,sql注入并不只是拼接一种意况,还有像宽字节流入,特殊字符转义等等很多样,那里就说说最广大的字符串拼接,那也是起码程序员最不难犯的失实。

<mapper namespace="com.sky.dao.UserMapper">
    <select id="query" parameterType="com.sky.model.User" resultType="com.sky.model.User">
        select * from user where name = '${name}'
    </select>
</mapper>

率先大家定义一个类来拍卖mysql的操作

与此同时,给出前端页面的简便的代码:

class Database:  aurl = '127.0.0.1'  user = 'root'  password = 'root'  db = 'testdb'  charset = 'utf8'    def __init__(self):   self.connection = MySQLdb.connect(self.aurl, self.user, self.password, self.db, charset=self.charset)   selfself.cursor = self.connection.cursor()    def insert(self, query):   try:    self.cursor.execute(query)    self.connection.commit()   except Exception, e:    print e    self.connection.rollback()    def query(self, query):   cursor = self.connection.cursor(MySQLdb.cursors.DictCursor)   cursor.execute(query)   return cursor.fetchall()    def __del__(self):   self.connection.close() 
<form action="<%=basePath%>query" method="get">
     <input type="input" placeholder="请输入姓名" name="name"/><input type="submit" value="查询"/>
</form>

那段代码在本人事先很多剧本里面都会看见,涉及到Python操作mysql数据库的脚本作者都会写进去这么些类,那么这一个类有标题吧?

前者页面通过form表单的样式输入查询条件并调用后端sql。显著对于地点那条sql语句,正常的操作应该是在前端页面输入一个名字,并询问结果,如:传入参数为:张三,则对应sql为:select
* from user where name =
‘张三’;那么,其结果就是:id=1;name=’张三’;classname=’1班’;不过,假若其扩散参数为:张三’
or 1=’1;则传出后台之后其相应的sql就成为:select * from user where name
= ‘张三’ or 1=’1’;那么,其出口的结果就是表中所有的数码。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图