位置:首页 » 技术2 » 最实用有效的PHP中防止SQL注入

最实用有效的PHP中防止SQL注入

日期:2016-05-23 阅读:0num
Advertisement

SQL注入攻击的概念及危害我相信大家都有所了解,如果不了解的请自己度娘,下面我们来学习一下在php中如何有效的防止

问题描述:

如果用户输入的数据在未经处理的情况下插入到一条SQL查询语句,那么应用将很可能遭受到SQL注入攻击,正如下面的例子:

代码如下 复制代码
$unsafe_variable = $_POST['user_input'];

mysql_query("INSERT INTO `table` (`column`) VALUES ('" . $unsafe_variable . "')");

因为用户的输入可能是这样的:

代码如下 复制代码
value'); DROP TABLE table;--

那么SQL查询将变成如下:

代码如下 复制代码
INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')

应该采取哪些有效的方法来防止SQL注入?

最佳回答(来自Theo):

使用预处理语句和参数化查询。预处理语句和参数分别发送到数据库服务器进行解析,参数将会被当作普通字符处理。这种方式使得攻击者无法注入恶意的SQL。 你有两种选择来实现该方法:

1、使用PDO:

代码如下 复制代码

$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');

$stmt->execute(array('name' => $name));

foreach ($stmt as $row) {
// do something with $row
}

2、使用mysqli:

代码如下 复制代码
$stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');
$stmt->bind_param('s', $name);

$stmt->execute();

$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
// do something with $row
}

PDO

注意,在默认情况使用PDO并没有让MySQL数据库执行真正的预处理语句(原因见下文)。为了解决这个问题,你应该禁止PDO模拟预处理语句。一个正确使用PDO创建数据库连接的例子如下:

$dbConnection = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass');
$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

在上面的例子中,报错模式(ATTR_ERRMODE)并不是必须的,但建议加上它。这样,当发生致命错误(Fatal Error)时,脚本就不会停止运行,而是给了程序员一个捕获PDOExceptions的机会,以便对错误进行妥善处理。 然而,第一个setAttribute()调用是必须的,它禁止PDO模拟预处理语句,而使用真正的预处理语句,即有MySQL执行预处理语句。这能确保语句和参数在发送给MySQL之前没有被PHP处理过,这将使得攻击者无法注入恶意SQL。了解原因,可参考这篇博文:PDO防注入原理分析以及使用PDO的注意事项。 注意在老版本的PHP(<5.3.6),你无法通过在PDO的构造器的DSN上设置字符集,参考:silently ignored the charset parameter。

解析

当你将SQL语句发送给数据库服务器进行预处理和解析时发生了什么?通过指定占位符(一个?或者一个上面例子中命名的 :name),告诉数据库引擎你想在哪里进行过滤。当你调用execute的时候,预处理语句将会与你指定的参数值结合。 关键点就在这里:参数的值是和经过解析的SQL语句结合到一起,而不是SQL字符串。SQL注入是通过触发脚本在构造SQL语句时包含恶意的字符串。所以,通过将SQL语句和参数分开,你防止了SQL注入的风险。任何你发送的参数的值都将被当作普通字符串,而不会被数据库服务器解析。回到上面的例子,如果$name变量的值为 ’Sarah’; DELETE FROM employees ,那么实际的查询将是在 employees 中查找 name 字段值为 ’Sarah’; DELETE FROM employees 的记录。 另一个使用预处理语句的好处是:如果你在同一次数据库连接会话中执行同样的语句许多次,它将只被解析一次,这可以提升一点执行速度。 如果你想问插入该如何做,请看下面这个例子(使用PDO):

代码如下 复制代码

$preparedStatement = $db->prepare('INSERT INTO table (column) VALUES (:column)');

$preparedStatement->execute(array('column' => $unsafeValue));

相关文章
  • 最实用有效的PHP中防止SQL注入

    SQL注入攻击的概念及危害我相信大家都有所了解,如果不了解的请自己度娘,下面我们来学习一下在php中如何有效的防止 问题描述: 如果用户输入的数据在未经处理的情况下插入到一条SQL查询语句,那么应用将很可能遭受到SQL注入攻击,正如下面的例子: 代码如下 复制代码 $unsafe_variable = $_POST['user_input']; mysql_query("INSERT INTO `table` (`column`) VALUES ('" . $unsafe_variab

  • PHP中防止SQL注入实现代码

    PHP中防止SQL注入实现代码,需要的朋友可以参考下 一. 注入式攻击的类型 可能存在许多不同类型的攻击动机,但是乍看上去,似乎存在更多的类型.这是非常真实的-如果恶意用户发现了一个能够执行多个查询的办法的话.本文后面,我们会对此作详细讨论. 如 果你的脚本正在执行一个SELECT指令,那么,攻击者可以强迫显示一个表格中的每一行记录-通过把一个例如"1=1"这样的条件注入到WHERE子句中,如下所示(其中,注入部分以粗体显示): SELECT * FROM wines WHERE va

  • ASP.NET中防SQL注入代码与实例

    防SQL注入是各种程序员的一个需要关心的问题,下面我来总结一下在asp.net中防SQL注入的一些技巧与方法,大家有兴趣可学习参考. 一,验证方法 代码如下 复制代码 /// ///SQL注入过滤 /// /// 要过滤的字符串 /// 如果参数存在不安全字符,则返回true public static bool SqlFilter2(string InText) { string word="and|exec|insert|select|delete|update|chr|mid|master

  • MYSQL中常用sql注入整理

    下面一聚教程小编给你整一下常用的MYSQL中常用sql注入方法,希望这些方法能你让在编程方面做得更安全哦. 最新在研究SQL手动注入,拿了个网站开刷.首先是找到带有SQL注入点,就去谷歌随便找了个inurl:php?id= http://rsc.xxxx.jx.cn/public/dongtai/news.php?id=228 改链接就存在SQL注入点. 第一步,进行注入测试. 最简单的方法就是 在链接后边加上 and 1=1 和 and 1=2 如果在and 1=2 显示页面不正常,而在and

  • nginx中防止SQL注入规则(非常详细)

    SQL注入通常是利用 我们程序或服务器的一些安全没有配置好而让程序出现bug从而让网站数据丢失了或服务器给黑了,下面我给各位整理一篇nginx中防止SQL注入规则供各位参考. $request_uri This variable is equal to the *original* request URI as received from the client including the args. It cannot be modified. Look at $uri for the post

  • JDBC中的SQL注入有关问题

    JDBC中的SQL注入问题: JDBC中的SQL注入问题: SQL注入是利用某些系统没有对用户输入数据进行充分的验证的情况下,用户输入了恶意的SQL命令,导致数据库完成了错误的命令,或者导致数据库崩溃的方法. 下面是一个实例: String sql = "select * from ATable where name='" + name + "'"; state = conn.createStatement(); rs = state.executeQuery(sq

  • node-mysql中防止SQL注入常用做法

    SQL注入对于网站及服务器来讲都是一个非常危险问题,程序员在这一方面没处理好的话网站可能随时给注入了,今天我们来讲一篇关于node-mysql中防止SQL注入常用做法,具体如下. 备注: 本文针对mysqljs/mysql. 为了防止SQL注入,可以将SQL中传入参数进行编码,而不是直接进行字符串拼接.在node-mysql中,防止SQL注入的常用方法有以下四种: 方法一:使用escape()对传入参数进行编码: 参数编码方法有如下三个: mysql.escape(param) connecti

  • php中防止SQL注入的最佳解决方法

    如果用户输入的是直接插入到一个SQL语句中的查询,应用程序会很容易受到SQL注入,例如下面的例子: 代码 代码如下: $unsafe_variable = $_POST['user_input']; mysql_query("INSERT INTO table (column) VALUES ('" . $unsafe_variable . "')"); 这是因为用户可以输入类似VALUE"); DROP TABLE表; - ,使查询变成: 代码 代码如下

  • 探讨php中防止SQL注入最好的方法是什么

    如果用户输入的是直接插入到一个SQL语句中的查询,应用程序会很容易受到SQL注入,例如下面的例子: . 代码如下: $unsafe_variable = $_POST['user_input']; mysql_query("INSERT INTO table (column) VALUES ('" . $unsafe_variable . "')"); 这是因为用户可以输入类似VALUE"); DROP TABLE表; - ,使查询变成: . 代码如下:

  • php中防止SQL注入的方法探讨

    如果用户输入的是直接插入到一个SQL语句中的查询,应用程序会很容易受到SQL注入,例如下面的例子: $unsafe_variable = $_POST['user_input']; mysql_query("INSERT INTO table (column) VALUES ('" . $unsafe_variable . "')"); 这是因为用户可以输入类似VALUE"); DROP TABLE表; - ,使查询变成: INSERT INTO tabl

  • Nginx中防止SQL注入攻击的相关配置介绍

    防止sql注入最好的办法是对于提交后台的所有数据都进行过滤转义. 对于简单的情况,比如包含单引号' , 分号;, <, >, 等字符可通过rewrite直接重订向到404页面来避免.用rewrite有个前提需要知道,一般用rewrite进行正则匹配只能匹配到网页的URI,也就是url中?前部分,?以后部分是请求参数.问号后面的请求参数,在nginx用$query_string表 示,不能在rewrite中匹配到,需要用if判断例如,对于参数中带有单引号的'进行匹配然后定向到错误页面, /plu

  • 迈克菲报告称中国是SQL注入攻击最多的国家

    2010 年 2 月1日,北京讯--全球最大专注于安全的厂商迈克菲(McAfee)公司今天发布了<2009年第四季度威胁报告>,报告着重介绍了2009年最引人关注的垃圾邮件的情况,以及波兰.拉脱维亚.丹麦和瑞士等国不断增加的政治黑客行为.报告还显示,2009年,平均每天产生约1355亿条垃圾邮件信息,而第四季度的垃圾邮件数量比第三季度减少了24%. 报告主要内容: ·出于政治目的的攻击行为在全球各地都有所增加: ·利用悲剧事件诱骗用户在全球范围内呈普遍上升趋势: ·恶意软件级别不断攀升: ·中

  • 浅析JSP入侵中的SQL注入之1&amp;#39;or&amp;#39;1&amp;#39;=&amp;#39;1 浅析JSP入侵中的SQL注入之1&amp;#39;or&amp;#39;1&amp;#39;=&amp;#39;1

    我们在入侵ASP站的时候,会遇到很多由于代码过滤不完全,导致的万能密码入侵,也就是我们常见的or=or入侵 在JSP中呢,这种情况也有,下面我们就从入侵实战开始到本地搭建简单分析下产生的原因,以及简单的2种修复方法 (一)入侵实战: JSP的一般直接上JSP马就可以 此完成一个简单的攻击 (二)本地搭建测试 下面我们本地简单构造一下这样的环境 创建3个JSP页 login.jsp(登录页) loginch.jsp(验证处理页) wel.jsp(登录成功后转到页) 代码分别如下 login.jsp

  • 如何在PHP应用中防止SQL注入 如何在PHP应用中防止SQL注入

    SQL注入是一个控制数据库查询的技术,往往会导致丧失机密性.在某些情况下,如果成功执行 SELECT ' 将导致服务器被攻击者拿下,而代码注入(包括SQL,LDAP,操作系统命令,XPath注入技术)长年保持在OWASP漏洞排名前十. 更多人分享有关于应用安全的知识是一件极好的事.然而不幸的是,网络上流传的大部分东西(尤其是老博客文章,高搜索引擎排名)都已经过时了.虽然是无意的误导,但是却造成了很大的威胁. 如何防止SQL注入 使用预处理语句,也被称为参数化查询.例如: $stmt = $pdo

  • php中防止SQL注入的方法

    [一.在服务器端配置] 安全,PHP代码编写是一方面,PHP的配置更是非常关键. 我们php手手工安装的,php的默认配置文件在 /usr/local/apache2/conf/php.ini,我们最主要就是要配置php.ini中的内容,让我们执行 php能够更安全.整个PHP中的安全设置主要是为了防止phpshell和SQL Injection的攻击,一下我们慢慢探讨.我们先使用任何编辑工具打开 /etc/local/apache2/conf/php.ini,如果你是采用其他方式安装,配置文件

  • PHP开发中防止SQL注入攻击

    SQL注入攻击(SQL Injection)是指通过SQL注入拿到网站数据库的访问权限,之后就可以拿到网站数据库中所有的数据,恶意的黑客可以通过SQL注入功能篡改数据库中的数据甚至会把数据库中的数据毁坏掉.做为网络开发者很有必要了解一下SQL注入这种功能方式的原理并学会如何通过代码来保护自己的网站数据库. 以下就PHP中该怎样防止SQL注入攻击进行讨论 如果用户输入的数据在未经处理的情况下插入到一条SQL查询语句,那么应用将很可能遭受到SQL注入攻击,正如下面的例子: $unsafe_varia

  • PHP查询登录中的sql注入

    比如以下一段登录的代码: if($l = @mysql_connect('localhost', 'root', '123')) or die('数据库连接失败'); mysql_select_db('test'); mysql_set_charset('utf8'); $sql = 'select * from test where username = "$username" and password = "$password"'; $res = mysql_q

  • node-mysql中防止SQL注入

    备注: 本文针对mysqljs/mysql. 为了防止SQL注入,可以将SQL中传入参数进行编码,而不是直接进行字符串拼接.在node-mysql中,防止SQL注入的常用方法有以下四种: 方法一:使用escape()对传入参数进行编码: 参数编码方法有如下三个: mysql.escape(param)connection.escape(param)pool.escape(param) 例如: var userId = 1, name = 'test';var query = connection

  • 介绍sqlmap中的SQL注入filter逃逸 介绍sqlmap中的SQL注入filter逃逸

    每当我发现一个SQL注入漏洞时,我都会在注入点使用sqlmap.这是一个操作简单易于使用的工具,不仅能证实漏洞,而且还可以提取相关数据.获得执行命令,以及执行进一步的实验操作.如果碰到filter或是网络应用防火墙,我会习惯性地打破Burp Suite并且开始手动规避筛选,但是接下来介绍的这种方法更为简便. 规避用户内置filter而试图利用SQL注入的做法往往是试着用不同的字符设置相同载荷.以下面的有效载荷为例: 根据被筛选的荷载多少,我可以使用多种方法重写这部分荷载.例如下面这个更大的荷载,

  • Pyhton中防止SQL注入的方法

    代码如下: c=db.cursor() max_price=5 c.execute("""SELECT spam, eggs, sausage FROM breakfast WHERE price < %s""", (max_price,)) 注意,上面的SQL字符串与后面的tuple之间的分隔符是逗号,平时拼写SQL用的是%. 如果按照以下写法,是容易产生SQL注入的: 代码如下: c.execute("""

最新文章
  • 对比阅读, Paul Graham 关于大学生建议的变化,大家啥看法?

    不知道有没有朋友喜欢Paul Graham的文章,我挺喜欢的 最近在读YC#Library Hiring is obsolete,http://www.paulgraham.com/hiring.html 然后就联想起了 Before Startup,http://www.paulgraham.com/before.html 这两篇文章的态度转变挺有意思的,前一篇鼓励大学生创业,因为这样能够展示自己的能力 后一篇则说大学的时候,不要创业,因为创业太难(上一篇也有承认,但却说,正是因为年轻,所以可

  • 你们的 air 屏幕在全屏黑色的时候会有那种痕迹么

    可以试一下,全屏显示黑色的时候,我的有一些区域有那种深色的痕迹,还有一些有偏白的痕迹,就像抓来似的,这个可以拿去维修么? --cut--

  • https://bintray.com/ 这个站不错啊

    Serving your binaries --cut--

  • 上海公司,求一个技术合伙人

    上海指飞网络技术公司,创业公司,业务主要类似于兼职中介.主创从大二开始跑市场,经过4,5年,在江苏有很大市场.现在发展遇到瓶颈,需要信息网络化.从零建设技术队伍,Android,ios客户端,后台服务器等等.需要一个技术合伙人(全职员工)拉起it队伍. 行业切入点很棒,一直盈利,已拿到投资,待遇从优,有合适的小伙伴们快来报名吧! 坐标:上海松江大学城六期 --cut-- loveisbug在2014-10-30 20:25:3回答到: 可以聊一下.ericnomail at gmail.com

  • 2015年优秀三八妇女节征文稿

    总感觉自己是一个小女人.小女人眼里没有大世界,只有自己的工作和家庭. 小女人是完美主义者,工作.生活两样都要兼顾,做一朵会开两种颜色的玫瑰,是小女人最大的心愿.小女人没有香车宝马,每天骑着自行车上班的路上,轻轻地哼着小曲,蓝天白云是我的伙伴,风儿是我的乐师.小女人是那么精神,那么潇洒,那么充满活力.在工作上,小女人绝不懈怠,出色地完成各项任务,为了工作,废寝忘食,是领导眼中的干将.每天总是在忙忙碌碌中度过,晚上临睡前将闹铃定好,第二天一早,铃声响起,却想捂住耳朵,装着听不到起床的信号.床是多么舒

  • 传锤子手机T2年底底发布 T2 Pro支持压力触控 传锤子手机T2年底底发布 T2 Pro支持压力触控

    不管坚果手机大家是不是买账,老罗依然兴致勃勃的在手机行业内玩命前行.随着日前打通了日本市场,目前又将前往美国开拓海外市场.而近日有消息称,锤子T2已经正式进入研发过程中,如果顺利的话,今年年底将正式与大家见面. 据透露,Smartisan T2将于11月份正式发布.按照这个时间来推测的话,Smartisan T2用骁龙820是没戏了,那么它的处理器会是什么呢? 除此之外,Smartisan T2 Pro已经在规划中了,可能搭载5.5英寸2K屏,支持指纹识别和压力触控,提供800万像素前置摄像头和

  • 致巨头:别指望靠变革就能获得新生 致巨头:别指望靠变革就能获得新生

    记者采访,问我海尔转型能成功么?我告诉她,转型失败的可能性是99%.还告诉她,不仅海尔转型会失败,巨头在面临时代转折点时候,都会失败,科技互联网it公司尤甚. 过去20年自第一次工业革命结束后,全球经济增长全靠这些公司.但是这些公司的寿命是最短的,因为处在技术变革的最前端,日益新月的新技术,新产品,老公司的管理和组织架构已经不再适合创新,被时代淘汰成为必然. 当前,日本.美国的多家拥有5-60年历史的公司都正在死去,或者已经死去.比如,索尼.松下.惠普等,他们的管理模式组织结构,人才结构,文化以

  • 春天做准妈疾病问题早预防

    春初是各种病毒感染的易感季节,随着气温的升高,各种病原体也开始活跃起来,干燥.多风的天气也为疾病的传播创造了有利的机会.胎儿在不同的发育阶段对病毒感染的敏感性不同,所谓"易感期"为妊娠早期8周左右,母体感染病毒最易影响胎儿.因此,准妈妈们在享受春光的同时,也要注意避免感染各种传染病. 风疹 风疹,是一种急性呼吸道传染病,好发于春季.任何年龄均可发生.如妇女在怀孕初期感染风疹病毒,胎儿致畸率可高达80%以上,因此,妇女在怀孕期间要特别注意预防. 风疹是一种由风疹病毒引起并通过空气传播的急

  • 在word2003文档中显示页眉页脚的方法 在word2003文档中显示页眉页脚的方法

    当我们新建一个Word2003空白文档时,页面上不会显示该文档的页眉和页脚,如图一. 图一 使用Word缺省模板新建的空白文档 选择"视图"-"页眉和页脚"菜单项,将打开"页眉和页脚"工具栏,同时在文档窗口上方显示页眉线,并允许用户输入页眉内容,如图二. 图二 显示页眉 利用"页眉和页脚"工具栏中的页眉和页脚间切换按钮(),可以切换到页脚,如图三. 图三 显示页脚

  • 你可以使用iPhone热成像手机壳做的15件事 你可以使用iPhone热成像手机壳做的15件事

    此前,我们为大家介绍过一款独特的iPhone周边--FLIR热成像外壳,它可以通过背部的红外传感器及摄像头,让iPhone变成热像仪,并将热成像照片记录下来,非常酷.当然,也许你会觉得350美元(约合人民币2152元)的价格有些昂贵,也想不出热成像到底有什么实际应用价值.我们在此列举了15种FLIR的应用形式,大家可以参考一下,再决定是否购买这款手机壳. 1. 开车之前,扫描一下车内看看哪个部分被阳光晒得最热. 2. 坐地铁时,看看把手的哪个部分刚刚被人握过,避免接触. 3. 买寿司时,看看哪盒

热门推荐