过滤输入是指未来自外部数据中不安全的字符转义或删除。php
外部输入能够是任何东西:$_GET 和 $_POST 等表单输入数据,$_SERVER 超全局变量中的某些值,还有经过 fopen('php://input', 'r') 获得的 HTTP 请求体。记住,外部输入的定义并不局限于用户经过表单提交的数据。上传和下载的文档,session 值,cookie 数据,还有来自第三方 web 服务的数据,这些都是外部输入。html
在数据到达存储层(MySQL或Redis)前必定要过滤输入的数据,这是第一道防线。前端
假若有人在评论框中输入如下内容并提交:web
<script>alert("Helloweba");</script>
很显然,这里加了恶意的<script>
标签,若是咱们不加任何处理,那么数据就直接进存储层了,而后用户再浏览网页的时候就会输出弹出警告框了。因此这就是咱们为何不要相信任何外部输入的缘由。正则表达式
那么,如何使用PHP处理过滤输入数据呢?如下是个人几点建议:shell
一、对于须要输出到页面的内容,使用strip_tags()
函数来去除 HTML 标签或者使用 htmlentities()
或是htmlspecialchars()
函数来对特殊字符分别进行转义从而获得各自的HTML实体,避免XSS攻击。如对上面的script脚本过滤:数据库
<?php
$input = '<script>alert("Helloweba");</script>';
echo htmlentities($input, ENT_QUOTES, 'utf-8');
2、若是须要传入可以在命令行中执行的选项,调用exec()等函数时要格外当心。你可使用自带的 escapeshellarg()
函数来过滤执行命令的参数。编程
3、经过输入数据拼接构建的SQL查询语句,必定要注意使用PDO预处理。PDO是PHP内置的数据库抽象层,使用一个接口表示多种数据库。PDO预处理语句是PDO提供的一个工具,用于过滤外部数据,而后把过滤后的数据嵌入SQL语句中,避免SQL注入。后端
4、当接收外部输入来从文件系统中加载文件。这能够经过将文件名修改成文件路径来进行利用。你须要过滤掉"/", "../", null 字符或者其余文件路径的字符来确保不会去加载隐藏、私有或者敏感的文件。安全
五、尽可能不要使用正则表达式函数过滤HTML输入,如preg_replace()
和preg_replace_all()
,正则表达式很复杂,一不当心就掉坑里了,出错概率高。
与过滤输入不一样,验证数据不会从输入数据中删除信息,而是只确认输入数据是否符合预期,好比输入的数据是不是Email邮箱、手机号码、数字等等。这种数据咱们或叫作无效数据,咱们验证这种无效数据,并阻止其进入数据存储层,并适当的提示用户错误的输入信息。
PHP的filter_var()
和 filter_input()
函数能够过滤文本并对格式进行验证。PHP提供了验证布尔值、Email、浮点数、整数、IP地址、MAC地址、正则表达式以及URL地址的标志,如如下代码是验证输入的邮箱是否正确:
$input = 'hello@example.com';
$isEmail = filter_var($input, FILTER_VALIDATE_EMAIL);
if ($isEmail !== false) {
echo '验证结果:成功';
} else {
echo '验证结果:失败';
}
咱们须要特别注意filter_var()函数的返回值,若是验证成功,返回的是要验证的值,若是验证失败,则返回false。
附PHPfilter_var()
函数的验证标志:
FILTER_VALIDATE_BOOLEAN
: 布尔值
FILTER_VALIDATE_EMAIL
: Email
FILTER_VALIDATE_FLOAT
: 浮点数
FILTER_VALIDATE_INT
: 整数
FILTER_VALIDATE_IP
: IP地址
FILTER_VALIDATE_MAC
: MAC地址
FILTER_VALIDATE_REGEXP
: 正则表达式
FILTER_VALIDATE_URL
: URL地址
最后,说明下,黑客都是经过使用工具或非正常手段,绕过咱们的前端验证,构建危险数据进行WEB渗透,因此咱们代码开发时,尤为是后端开发,安全是咱们的首要任务。接下来Helloweba将继续给你们提供开发级别的安全防范文章,敬请关注。