`
yanghongxia9
  • 浏览: 115057 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

防止SQL Injection攻击

 
阅读更多
根据你的使用目的我觉得这个函数有两方面的用途:

1.防止SQL Injection攻击,也就是你必须验证用户的输入
2.操作数据的时候避免不必要的字符导致错误
mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。

下列字符受影响:

•\x00
•\n
•\r
•\
•'
•"
•\x1a
如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。

攻击的例子[1]

例子 1
<?php
$con = mysql_connect("localhost", "hello", "321");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
// 获得用户名和密码的代码

// 转义用户名和密码,以便在 SQL 中使用
$user = mysql_real_escape_string($user);
$pwd = mysql_real_escape_string($pwd);

$sql = "SELECT * FROM users WHERE
user='" . $user . "' AND password='" . $pwd . "'"

// 更多代码

mysql_close($con);
?>

例子 2
数据库攻击。本例演示如果我们不对用户名和密码应用 mysql_real_escape_string() 函数会发生什么:

<?php
$con = mysql_connect("localhost", "hello", "321");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
$sql = "SELECT * FROM users
WHERE user='{$_POST['user']}'
AND password='{$_POST['pwd']}'";
mysql_query($sql);

// 不检查用户名和密码
// 可以是用户输入的任何内容,比如:
$_POST['user'] = 'john';
$_POST['pwd'] = "' OR ''='";

// 一些代码...

mysql_close($con);
?>

那么 SQL 查询会成为这样:
SELECT * FROM users WHERE user='john' AND password='' OR ''=''这意味着任何用户无需输入合法的密码即可登陆。

例子 3
预防数据库攻击的正确做法:

<?php
function check_input($value)
{
// 去除斜杠
if (get_magic_quotes_gpc())
{
$value = stripslashes($value);
}
// 如果不是数字则加引号
if (!is_numeric($value))
{
$value = "'" . mysql_real_escape_string($value) . "'";
}
return $value;
}

$con = mysql_connect("localhost", "hello", "321");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}

// 进行安全的 SQL
$user = check_input($_POST['user']);
$pwd = check_input($_POST['pwd']);
$sql = "SELECT * FROM users WHERE
user=$user AND password=$pwd";

mysql_query($sql);

mysql_close($con);
?>

对于情况2,当使用PHP准别数据插入的时候,如果插入数据包含单引号或者双引号,会导致插入失败。通过mysql_real_escape_string就可以避免这种错误。我的经验是,这个错误不太容易发现,前天花了2个小时才找到这个错误。而且这个函数并不会增加字段的长度[2]。

参考:
[1]http://www.w3school.com.cn/php/func_mysql_real_escape_string.asp
[2]http://php.net/manual/en/function.mysql-real-escape-string.php

参数化查询(Parameterized Query 或 Parameterized Statement)是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值,这个方法目前已被视为最有效可预防SQL注入攻击 (SQL Injection) 的攻击手法的防御方式。
目录

原理
SQL 指令撰写方法
展开
原理
SQL 指令撰写方法
展开
编辑本段原理
在使用参数化查询的情况下,数据库服务器不会将参数的内容视为SQL指令的一部份来处理,而是在数据库完成 SQL 指令的编译后,才套用参数运行,因此就算参数中含有具有损的指令,也不会被数据库所运行。 有部份的开发人员可能会认为使用参数化查询,会让程序更不好维护,或者在实现部份功能上会非常不便,然而,使用参数化查询造成的额外开发成本,通常都远低于因为SQL注入攻击漏洞被发现而遭受攻击,所造成的重大损失。
编辑本段SQL 指令撰写方法
在撰写 SQL 指令时,利用参数来代表需要填入的数值,例如:
Microsoft SQL Server
Microsoft SQL Server 的参数格式是以 "@" 字符加上参数名称而成,SQL Server 亦支持匿名参数 "?"。  SELECT * FROM myTable WHERE myID = @myID  INSERT INTO myTable (c1, c2, c3, c4) VALUES (@c1, @c2, @c3, @c4)
Microsoft Acce
Microsoft Access 不支持具名参数,只支持匿名参数 "?"。  UPDATE myTable SET c1 = ?, c2 = ?, c3 = ? WHERE c4 = ?
MySQL
MySQL 的参数格式是以 "?" 字符加上参数名称而成。  UPDATE myTable SET c1 = ?c1, c2 = ?c2, c3 = ?c3 WHERE c4 = ?c4
客户端程序撰写方法
在客户端代码中撰写使用参数的代码,例如:
ADO.NET
SqlCommand sqlcmd = new SqlCommand("INSERT INTO myTable (c1, c2, c3, c4) VALUES (@c1, @c2, @c3, @c4)", sqlconn);  sqlcmd.Parameters.AddWithValue("@c1", 1); // 设定参数 @c1 的值。  sqlcmd.Parameters.AddWithValue("@c2", 2); // 设定参数 @c2 的值。  sqlcmd.Parameters.AddWithValue("@c3", 3); // 设定参数 @c3 的值。  sqlcmd.Parameters.AddWithValue("@c4", 4); // 设定参数 @c4 的值。  sqlconn.Open();  sqlcmd.ExecuteNonQuery();  sqlconn.Close();
PHP
$query = sprintf("SELECT * FROM Users where UserName='%s' and Password='%s'",  mysql_real_escape_string($Username),  mysql_real_escape_string($Password));  mysql_query($query);  或是  $db = new mysqli("localhost", "user", "pass", "database");  $stmt = $mysqli -> prepare("SELECT priv FROM testUsers WHERE username=? AND password=?");  $stmt -> bind_param("ss", $user, $pass);  $stmt -> execute();
JDBC
PreparedStatement prep = conn.prepareStatement("SELECT * FROM USERS WHERE USERNAME=? AND PASSWORD=?");  prep.setString(1, username);  prep.setString(2, password);
Cold Fusion
<cfquery name="Recordset1" datasource="cafetownsend">  SELECT *  FROM COMMENTS  WHERE COMMENT_ID =<cfqueryparam value="#URL.COMMENT_ID#" cfsqltype="cf_sql_numeric">  </cfquery>

分享到:
评论

相关推荐

    SQL Injection攻击检测工具

    - 使用ORM(对象关系映射)框架:如Hibernate,它们在一定程度上可以防止SQL注入。 - 定期安全审计:定期使用检测工具检查并更新应用程序的安全性。 总的来说,SQL Injection攻击检测工具是保障Web应用程序安全的...

    微软发布SQL Injection攻击检测工具

    Microsoft Source Code Analyzer for SQL Injection 这款被称作 MSCASI 的工具可以检测 ASP 代码并发现其中的 SQL INJECTION 漏洞(ASP 代码以 SQL INJECTION 漏洞著称),你需要向 MSCASI 提供原始代码,MSCASI 会...

    使用Python防止SQL注入攻击的实现示例

    ### 使用Python防止SQL注入攻击的实现示例 #### 文章背景与重要性 随着网络技术的发展,Web应用程序的安全性越来越受到人们的重视。开放式Web应用程序安全项目(OWASP)每几年都会发布一次关于Web应用程序最常见...

    SQL Injection (SQL注入攻击)

    在C#中,我们可以使用参数化查询或者存储过程来防止SQL注入。参数化查询确保了用户输入被当作数据而非SQL代码处理,有效隔绝了SQL注入。比如使用SqlCommand对象的ExecuteNonQuery或ExecuteReader方法,配合Sql...

    PHP中的代码安全和SQL Injection防范1

    1. **参数化查询**:使用预编译语句或参数化查询可以有效地防止SQL Injection。这种方式确保了数据不会直接与SQL语句混合在一起,从而避免了注入攻击的可能性。 例如,使用PDO(PHP Data Objects)库执行参数化...

    防sql注入式攻击SQLInjection

    "新建 文本文档 (3).txt"可能包含关于SQL注入防御的文本说明或示例代码,而"SQLInjection"可能是包含更多相关资料的子目录。 综上所述,防止SQL注入需要全面考虑应用程序的设计、开发和维护,确保所有的用户输入都...

    SqlInjection攻击PPT(繁体中文)

    此PPT主题为“SqlInjection攻击”,显然是为了教育和防范这类攻击提供详细解释。让我们深入了解一下SQL注入及其防范措施。 SQL注入攻击是通过在输入字段中插入恶意SQL代码来实现的,目的是操纵或破坏数据库。攻击者...

    Advanced SQL Injection In SQL Server Applications

    1. **参数化查询(Parameterized Queries)**:使用参数化查询或预编译的SQL语句,可以防止攻击者直接注入代码。 2. **输入验证(Input Validation)**:对用户输入进行严格的检查和清理,确保只接受预期的数据类型...

    SQL Injection(SQL注入)介绍及SQL Injection攻击检测工具.docx

    - **避免拼接SQL**:使用预编译语句或存储过程可以有效地防止SQL注入,因为它们预先定义了SQL结构,只允许用户输入作为参数,而不会改变语句的执行计划。 - **输入验证**:对用户输入进行严格的类型检查和长度限制...

    SQL Injection攻击原理与防范.pdf

    SQL Injection(SQL注入)是一种常见的网络安全威胁,主要针对基于SQL(结构化查询语言)的数据库系统。攻击者通过在Web应用程序的输入字段中插入恶意SQL代码,来操控后台数据库,获取敏感信息,甚至完全控制数据库...

    sql injection cheat sheet

    为了防止SQL注入攻击,开发者应采取以下措施: 1. **参数化查询**:使用预编译的语句和参数绑定,避免直接拼接用户输入到SQL语句中。 2. **输入验证与清理**:对所有用户输入进行严格的验证和清理,避免任何潜在的...

    微软SQL Injection攻击检测工具 URLScan 3.0

    该工具会让 IIS 限制某些类型的 HTTP 请求,通过对特定 HTTP 请求进行限制,可以防止某些有害的请求在服务器端执行。UrlScan 通过一系列关键词发现恶意请求,并阻止恶意请求的执行

    sql injection SQL注入解析 和解决方案

    - 使用预编译语句(如PDO或MySQLi扩展)可以有效防止SQL注入。 - 示例代码: ```php $stmt = $conn-&gt;prepare("SELECT * FROM users WHERE id=? AND password=?"); $stmt-&gt;bind_param("is", $username, $...

    SQL Injection Attacks and Defense.pdf

    4. **使用安全工具**:利用自动化工具和框架来帮助检测和防止SQL注入攻击。 #### 七、结论 SQL注入是一种严重威胁现代Web应用程序安全性的攻击方式。通过对应用程序的输入进行严格的验证、采用安全的编程技术、...

    利用信息摘要防御SQL Injection攻击.pdf

    因为散列函数的输出对于任何输入都是一样的,所以攻击者难以通过散列值来预测原始输入,达到防止SQL注入的目的。 然而,需要注意的是,即便使用了信息摘要,仍然需要确保使用参数化查询来构建SQL语句,这是防止SQL...

    SQL Injection Attacks and Defense 2nd Edition

    有效的防御机制对于防止SQL注入攻击至关重要。以下是一些常用的防御技术: ##### 2.1 参数化查询 - **定义**:参数化查询是一种将SQL语句中的变量替换为占位符的技术,确保用户输入不会被解释为SQL代码。 - **示例*...

    台湾胡百敬老师的sql Injection学习资料

    高级的SQL Injection攻击可能涉及到预存过程的利用,通过注入调用预存过程的SQL语句,绕过原本的安全机制。同时,攻击者可能还会利用数据库管理系统提供的工具,如SQL Server Management Studio,来进行更复杂的...

    SQL注入攻击实验报告

    - **新建网站SQLInjection项目**:使用MyEclipse创建一个新的Web项目,命名为SQLInjection。 - **index.jsp页面设计**:作为登录界面,包含用户名和密码的输入框,以及提交按钮。 - **处理流程**: - 用户输入...

Global site tag (gtag.js) - Google Analytics