[转] Htmlspecialchars 和 mysql_real_escape_stringPHP 代码注射安全

转载自: http://www.taocms.org/165.html

1. 数据库的查询时,总是尝试,并使用准备的 parameterised 的查询。mysqli 和 PDO 库支持这。这是比使用逃逸的功能,如 mysql_real_escape_string 无限的安全。

是的 mysql_real_escape_string 实际上是只是逃避函数的字符串。它不是灵丹妙药。它将所做的一切是危险的转义字符,以便它们可以安全地使用单个查询字符串中。但是,如果你不做事先 sanitise 您的输入,然后您将容易受到一定的攻击媒介。

想象一下以下的 SQL:

$result ="SELECT fields FROM table WHERE id = ".mysql_real_escape_string($_POST['id']);

您应该能够看到这就是容易受到攻击。
想象一下 id 参数包含常见的攻击:

1 OR 1=1

没有危险的字符,在那里进行编码,所以它将直接通过逃逸的筛选器。离开我们:

SELECT fields FROM table WHERE id=1 OR 1=1

这是一个可爱的 SQL 注入向量和将使攻击者能够返回的所有行。或

1or is_admin=1 order by id limit 1

这会产生

SELECT fields FROM table WHERE id=1or is_admin=1 order by id limit 1

这使得攻击者能够在此完全虚构的示例返回第一个管理员的详细信息。

虽然这些函数是有用的他们必须小心使用。您需要确保所有 web 输入进行都验证,在某种程度上。在这种情况下,我们看到我们可以利用因为我们没有检查变量,我们正在使用的数字,是实际数字。在 PHP 中广泛应使用一组函数检查输入整数、 浮点数、 字母数字等。但是,SQL 时,听取预准备语句的最大价值。上面的代码是不安全的如果它是预准备的语句的数据库功能便会知道, 1 OR 1=1 不是有效的文本。

避免注入的方法:

<?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;
}
// 进行安全的 SQL
$result = "SELECT fields FROM table WHERE id = ".check_input($_POST['id']);
?>

 

2. 至于 htmlspecialchars()。这就是它自己的雷场。

有一个真正的问题在 PHP 中有一个整体的不同的 html 相关逃逸功能,并没有明确的指导,究竟哪些功能做什么选择。

首先,如果您是 HTML 标记内,你是在真正的麻烦。看

echo '<img src= "'. htmlspecialchars($_GET['imagesrc']).'" />';

我们已经内部 HTML 标记,所以我们不需要 < 或大于做任何危险的事情。我们的攻击可能只是javascript:alert(document.cookie)

现在生成 HTML 看起来就像

<imgsrc=
备注: html源码是:
<img src= "javascript:alert(document.cookie)" />

转载于:https://www.cnblogs.com/DavidYan/articles/2416307.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值