php intval

图片 1

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

get是通过U奥迪Q7L传参,不难暴光,简单被sql注入,防止sql注入的法门之一是:加intval($_GET[‘id’]);

如此就可防止止sql注入,传入贰个列表之后,MySQLdb模块内部会将列表系列化成二个元组,然后举行escape操作。

 

解决

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

为了求证难题的真实,那里就写多少个方法来调用下边的不行类里面包车型客车艺术,借使出现错误会间接抛出万分。

那段代码在自个儿事先很多剧本里面都会映入眼帘,涉及到Python操作mysql数据库的脚本作者都会写进去这些类,那么那几个类有标题吧?

此处 execute
执行的时候传出多个参数,第④个是参数化的sql语句,第二个是呼应的实际的参数值,函数内部会对传播的参数值进行对应的处理预防sql注入,实际运用的法子如下

和下边包车型大巴测试结果一致,所以那种措施也是万分的,而且那种艺术并不是预编写翻译sql语句,那么怎么做才能幸免sql注入呢?

当然,笔者那边并不想谈谈其余语言是如何制止sql注入的,网上关于PHP(博主注:听旁人说是社会风气上最屌的言语)防注入的各个格局都有,Python的主意其实类似,那里笔者就举例来说说。

前言

本人在此以前的有个别本子中应用了存在sql注入漏洞的代码会逐步改过来,好了,以上便是那篇小说的全体内容了,希望本文的始末对大家的学习或然干活能拉动一定的扶助。

首先大家定义八个类来拍卖mysql的操作

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

这么些主意里面没有直接动用字符串拼接,而是利用了 %s
来取代要传播的参数,看起来是或不是非凡像预编写翻译的sql?这那种写法能还是不可能预防sql注入呢?测试一下便知道,回显如下

2> 使用Python的MySQLdb模块自带的章程

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, 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() 

修改后的代码

那个类是有通病的,很简单造成sql注入,上面就说说怎么会发出sql注入。

相关文章