根据你的使用目的我觉得这个函数有两方面的用途:
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>
分享到:
相关推荐
Microsoft Source Code Analyzer for SQL Injection 这款被称作 MSCASI 的工具可以检测 ASP 代码并发现其中的 SQL INJECTION 漏洞(ASP 代码以 SQL INJECTION 漏洞著称),你需要向 MSCASI 提供原始代码,MSCASI 会...
该工具会让 IIS 限制某些类型的 HTTP 请求,通过对特定 HTTP 请求进行限制,可以防止某些有害的请求在服务器端执行。UrlScan 通过一系列关键词发现恶意请求,并阻止恶意请求的执行
– 这往往给大家造成误解,认为只要变量过滤了’就可以防止SQL Injection攻击,这种意识为大量程序可以注入埋下祸根,其实仅仅过滤’是不够的,在’被过滤的情况下我们照样玩,看下面语句: 代码如下: //...
经典的sql注入分析,从如何注入和如何防止注入两方面深入说明sql injection技术。
使得SQL Injection攻击几乎不可能被忽视。 所有@databases库都强制使用sql标记的模板文字,因此您不会意外遗漏它们。 然后将查询作为单独的字符串和值传递到数据库引擎: { text : 'SELECT * FROM users WHERE id=?...
黑客通过SQL注入攻击可以拿到网站数据库的访问权限,之后他们... 什么是SQL注入(SQL Injection)? 简单来说,SQL注入是使用代码漏洞来获取网站或应用程序后台的SQL数据库中的数据,进而可以取得数据库的访问权限。比
恶意文本检测器,约束验证,查询长度验证和基于文本的密钥生成器是用于检测和防止SQL注入攻击访问数据库的四种过滤技术。 要求 Web应用程序 一台虚拟服务器 测试客户 封包捕获软件 执行 我们正在Ubuntu中进行此项目...
Invision Power Board SQL Injection Vulnerabil Invision Power Board v1.3 Final ssi.php SQL Injection Vulnerability IPB SQL Injection L'injection (My)SQL via PHP L'injection (My)SQL via PHP Mambo Site ...
整个PHP中的安全设置主要是为了防止phpshell和SQL Injection的攻击,一下我们慢慢探讨。我们先使用任何编辑工具打开/etc/local/apache2/conf/php.ini,如果你是采用其他方式安装,配置文件可能不在该目录。
Injection这样的漏洞,攻击者也不可能马上拿下你的站点。 由于ASP的方便易用,越来越多的网站后台程序都使用ASP脚本语言。但是, 由于ASP本身存在一些安全漏洞,稍不小心就会给黑客提供可乘之机。事实上,安全不仅...
我们常常听到“注入”(Injection),如SQL注入,那么到底“注入”是什么?注入本质上就是把输入的数据变成可执行的程序语句。SQL注入是如此,XSS也如此,只不过XSS一般注入的是恶意的脚本代码,这些脚本代码可以...
htaccess_firewall 网站安全防范黑客攻击:XSS|RFI|CRLF|CSRF|Base64|Code Injection|SQL Injection
该Web应用程序还可以防止SQL注入和跨站点脚本攻击。 使用的技术 前端: HTML,CSS,JavaScript,Jquery,Bootstrap,Java服务器页面(JSP),AJAX(用于Flight Search窗口小部件) 后端: Java Servlet,Java模型...
整个PHP中的安全设置主要是为了防止phpshell和SQL Injection的攻击,一下我们慢慢探讨。我们先使用任何编辑工具打开/etc/local/apache2/conf/php.ini,如果你是采用其他方式安装,配置文件可能不在该目录。 (1) 打开...
整个PHP中的安全设置主要是为了防止phpshell和SQL Injection的攻击,一下我们慢慢探讨。我们先使用任何编辑工具打开/etc/local/apache2/conf/php.ini,如果你是采用其他方式安装,配置文件可能不在该目录。 (1) 打开...
SQL注入:如今各种SQL注入工具充斥着Internet,更甚者自动化蠕虫的Mass SQL Injection 一天就可以给成千上万的网站挂马,严重的损害了企业形象和数据安全。Safe3 Web Application Firewall采用注入模拟技术,有效拦截...
而且,它充满了您喜欢的漏洞,例如SQL Injection,跨站点脚本编写等。 当今的Web和移动应用程序以及Web服务拥有许多未经充分测试的安全漏洞的新技术。 对于IT安全专业人员来说,拥有一个易受攻击的Web应用程序以...
将 ASP.NET 2.0 应用程序服务配置为使用 SQL Server 2000 或 SQL Server 2005 ASP.NET 2.0 中的数据源控件 使用 ASP.NET 2.0 ObjectDataSource 控件 ASP.NET 2.0 的内部变化 使用SQL Cache Dependency 代替 ...