PHP本身内置了很多参数过滤的函数,以方便开发者简单有效且统一地进行安全防护,而这些函数可以分为多种类型,如SQL注入过滤函数,XSS过滤函数,命令执行过滤函数,代码执行过滤函数等等。

SQL注入过滤函数

SQL注入过滤函数有addslashes(),mysql_real_escape_string()以及mysql_escape_string(),它们的作用都是给字符串添加反斜杠(\)来转义掉单引号(’)、双引号(”)以及空格符NULL。

addslashes()和mysql_escape_string()函数都是直接在敏感字符串前加反斜杠,可能会存在宽字节注入。可参考我之前的博客

宽字节注入漏洞的利用与学习

而mysql_real_escape_string()函数会考虑当前连接数据库的字符集编码。

addslashes()

addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。

预定义字符是:

  • 单引号(’)
  • 双引号(”)
  • 反斜杠(\)
  • NULL
1
addslashes(string)
参数 描述
string 必需。规定要转义的字符串。
1
2
3
4
5
6
7
8
9
<?php

$id=$_GET["id"];

$str = addslashes($id);

echo $str;

?>

mysql_escape_string()

在PHP5.3中已经弃用mysql_escape_string()

1
mysql_escape_string()并不转义%和_
1
2
3
4
5
6
7
8
<?php

$id=$_GET["id"];

$str = mysql_escape_string($id);

echo $str;
?>

mysql_real_escape_string()

mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。

下列字符受影响:

  • \x00
  • \n
  • \r
  • \
  • \x1a

如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。

1
mysql_real_escape_string(string,connection)
参数 描述
string 必需。规定要转义的字符串。
connection 可选。规定 MySQL 连接。如果未规定,则使用上一个连接。
1
2
3
4
5
6
7
8
9
<?php

$id=$_GET["id"];

if($str = mysql_real_escape_string($id))
echo $str;
else
echo 'false';
?>

XSS过滤函数

XSS过滤函数有htmlspecialchars()和strip_tags()

htmlspecialchars()

htmlspecialchars() 函数把预定义的字符转换为 HTML 实体。

预定义的字符是:

1
2
3
4
5
&转换成&amp
"转换成&quot
'转换成&#039
<转换成&lt
>转换成&gt
1
2
3
4
5
6
7
8
<?php

$id=$_GET["id"];

$str = htmlspecialchars($id);

echo $str;
?>

strip_tag()函数

strip_tags() 函数剥去字符串中的 HTML、XML 以及 PHP 的标签。

1
strip_tags(string,allow)
参数 描述
string 必需。规定要检查的字符串。
allow 可选。规定允许的标签。这些标签不会被删除。
1
2
3
4
5
6
7
8
<?php

$id=$_GET["id"];

$str = strip_tags($id);

echo $str;
?>

命令执行过滤函数

PHP提供了escapeshellcmd()和escapeshellarg()两个函数对参数进行过滤

escapeshellcmd()

在Windows下过滤方式是在字符前面加上一个^符号
在Linux是在字符前加上反斜杠(\)

过滤字符如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
&
;
`
|
*
?
~
<
>
^
(
)
[
]
{
}
$
\
\
x0A
\xFF
%

1
2
3
4
5
6
7
8
<?php

$id=$_GET["id"];

$str = escapeshellcmd($id);

echo $str;
?>

escapeshellarg()

给所有参数加上一对双引号,强制为字符串

1
2
3
4
5
6
7
8
<?php

$id=$_GET["id"];

$str = escapeshellarg($id);

echo $str;
?>

Reference

《代码审计:企业级web代码安全架构》