[转]PHP防止SQL注入攻击

如果用户的输入不加修改就插入到SQL查询里,这个应用程序会容易受到SQL注入,就像下面这样:
 
       $unsafe_variable = $_POST[‘user_input‘];

mysql_query("INSERT INTO `table` (`column`) VALUES (‘$unsafe_variable‘)");
 
       这是因为用户能够输入像value‘); DROP TABLE table;--之类的代码,然后这个查询就变成了:
 
       INSERT INTO `table` (`column`) VALUES(‘value‘); DROP TABLE table;--‘)
 
       怎么才能防止这样的情况发生呢?

支持率最高回答:

使用预处理语句很参数化查询。这些是被数据库服务器独立于任何参数进行发送和解析的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创建链接的一个示例如下:
 
       $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);
 
       上面的示例里的错误模式不是严格必须的,但是建议添加上它。这样的脚本在出现错误时不会因为致命错误而终止,并且他还让开发者有机会捕捉到PDO异常抛出的任何错误。
 
       第一行的setAttribute( )是强制性的,它告诉PDO禁用模拟预处理语句并使用真正的预处理语句。这保证了语句和值在被发送到MySQL服务器之前不会被PHP解析(不给潜在的攻击者注入恶意的SQL的机会)。
 
       虽然你可以在构造函数的选项中设置字符集,但要注意旧版本的PHP(小于5.3.6)会在DSN中自动忽略字符集参数。

解释

上面的代码会让你传给prepare的SQL语句被数据库服务器解析并编译。通过指定参数(可以是一个问号或者上面例子里的像:name的命名参数)你告诉数据库引擎过滤哪些部分。然后你调用执行,预处理语句和你指定的参数值就结合起来了。
 
       这里重要的是,参数值是与已经编译的语句进行结合,而不是与SQL字符串。SQL注入通过在它创建SQL发送到数据库时用包含恶意的字符串欺骗脚本的方式来实现。所以通过发送独立于参数的实际的SQL,你就会限制住一些你并不希望出现的事情的风险。你使用预处理语句发送的任何参数都只会被视为字符串(尽管数据库引擎可能会做一些优化,然后参数也可能成为数字)。在上面的示例中,如果$name变量包含‘Sarah‘;DELETE FROM employees结果仅仅是对字符串"‘Sarah‘;DELETE FROM employees"的搜索,你不会得到一个空表。
 
       使用预处理语句的另一个好处就是如果你在同一个会话中多次执行相同的语句只会被解析和编译一次,这会给你一些速度上的益处。既然你问到了如何插入,这里有一个使用PDO的示例:

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

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

原文:http://www.php100.com/html/it/focus/2014/1020/7539.html

时间: 2024-07-30 10:10:34

[转]PHP防止SQL注入攻击的相关文章

web前端安全之SQL注入攻击

一.SQL注入攻击的原理攻击者在HTTP请求中注入恶意的SQL代码,并在服务端执行.比如用户登录,输入用户名camille,密码 ' or '1'='1 ,如果此时使用参数构造的方式,就会出现 select * from user where name = 'camille' and password = '' or '1'='1' 不管用户名和密码是什么,查询出来的用户列表都不为空,这样可以随意看其他用户的信息. 二.SQL注入攻击的防御1.客户端 限制字符串输入的长度: 有效性检验. //过

【渗透攻防Web篇】SQL注入攻击高级

前言 前面我们学习了如何寻找,确认,利用SQL注入漏洞的技术,本篇文章我将介绍一些更高级的技术,避开过滤,绕开防御.有攻必有防,当然还要来探讨一下SQL注入防御技巧. 目录 第五节 避开过滤方法总结 5.1.大小写变种 5.2.URL编码 5.3.SQL注释 5.4.空字节 5.5.二阶SQL注入 第六节 探讨SQL注入防御技巧 6.1.输入验证 6.2.编码输出 正文 第五节 避开过滤方法总结 Web应用为了防御包括SQL注入在内的攻击,常常使用输入过滤器,这些过滤器可以在应用的代码中,也可以

使用SQLMAP对网站和数据库进行SQL注入攻击

from:http://www.blackmoreops.com/2014/05/07/use-sqlmap-sql-injection-hack-website-database/ 0x00 背景介绍 1. 什么是SQL注入? SQL注入是一种代码注入技术,过去常常用于攻击数据驱动性的应用,比如将恶意的SQL代码注入到特定字段用于实施拖库攻击等.SQL注入的成功必须借助应用程序的安全漏洞,例如用户输入没有经过正确地过滤(针对某些特定字符串)或者没有特别强调类型的时候,都容易造成异常地执行SQL

网络攻防之SQL注入攻击

SQL注入攻击的根源是因为SQL规范的漏洞,但是,因为规范的长期存在以及使用,几乎已经不太可能去修改规范了,只能够从开发者本身去避免攻击,虽然SQL注入之前很严重,但现在相对控制的很好,这里仅仅作为一种学习的内容. 测试过程如下: 1:搭建PHP,mysql开发环境,可以详见我的另一篇博客自定义开发PHP环境 2:添加数据库,表,以及表内容. 3:分别测试 万能密码,万能用户名 数字注入 测试如下: 万能密码:password ' or 1='1 (password可以任意的填写,注:这里如果粘

Web安全篇之SQL注入攻击

在网上找了一篇关于sql注入的解释文章,还有很多技术,走马观花吧 文章来源:http://www.2cto.com/article/201310/250877.html ps:直接copy,格式有点问题~ 大家早上好!今天由我给大家带来<web安全之SQL注入篇>系列晨讲,首先对课程进行简单介绍,SQL注入篇一共分为三讲:       第一讲:"纸上谈兵:我们需要在本地架设注入环境,构造注入语句,了解注入原理.":       第二讲:"实战演练:我们要在互联网上

参数化登陆防止SQL注入攻击

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Data.SqlClient; namespace _01参数化登陆防止SQL注入攻击 { public

2015-9-28 SQL注入攻击

SQL注入攻击实例 (1)SQL命令插入到Web表单的输入域  或   页面请求的查询字符串,欺骗服务器执行恶意的SQL命令 一个简单的登录页面 private bool NoProtectLogin(string userName, string password) { int count = (int)SqlHelper.Instance.ExecuteScalar(string.Format ("SELECT COUNT(*) FROM Login WHERE UserName='{0}'

PHP的SQL注入攻击的技术实现以及预防措施

SQL 攻击(SQL injection,台湾称作SQL资料隐码攻击),简称注入攻击,是发生于应用程序之数据库层的安全漏洞.简而言之,是在输入的字符串之中注入SQL指 令,在设计不良的程序当中忽略了检查,那么这些注入进去的指令就会被数据库服务器误认为是正常的SQL指令而运行,因此遭到破坏. 有部份人认为SQL注入攻击是只针对Microsoft SQL Server而来,但只要是支持批处理SQL指令的数据库服务器,都有可能受到此种手法的攻击.1.原因在应用程序中若有下列状况,则可能应用程序正暴露在

SQL 注入攻击

一位客户让我们针对只有他们企业员工和顾客能使用的企业内网进行渗透测试.这是安全评估的一个部分,所以尽管我们之前没有使用过SQL注入来渗透网络,但对其概念也相当熟悉了.最后我们在这项任务中大获成功,现在来回顾一下这个过程的每一步,将它记录为一个案例. "SQL注入"是一种利用未过滤/未审核用户输入的攻击方法("缓存溢出"和这个不同),意思就是让应用运行本不应该运行的SQL代码.如果应用毫无防备地创建了SQL字符串并且运行了它们,就会造成一些出人意料的结果. 我们记录下

PHP防SQL注入攻击

PHP防SQL注入攻击 收藏 没有太多的过滤,主要是针对php和mysql的组合. 一般性的防注入,只要使用php的 addslashes 函数就可以了. 以下是一段copy来的代码: PHP代码 $_POST = sql_injection($_POST); $_GET = sql_injection($_GET); function sql_injection($content) { if (!get_magic_quotes_gpc()) { if (is_array($content))