php筛选-PHP开发安全问题总结

PHP给开发者带来了极大的灵活性,但也给安全问题带来了潜在的隐患。 近期有必要对前几年的问题进行总结。 这里我将一篇文章翻译一下php筛选,加上一些自己的感想,总结一下。

介绍

在开发互联网服务时,必须始终牢记安全概念并将其体现在开发的代码中。 PHP 脚本语言不太关心安全问题,特别是对于大多数缺乏经验的开发人员来说。 每当您谈论任何涉及金钱事务的交易时,您都需要非常小心安全考虑,例如开发峰会或购物车。

一般安全要点

不要相信表格

对于通常的Javascript前端验证来说,很难获知用户的行为,比如关闭浏览器的javascript引擎,从而将恶意数据通过POST发送到服务器,需要在服务器端进行验证,并且传递给每个php脚本的数据都经过验证,以防止XSS攻击和SQL注入

不信任用户

假设您的网站收到的每一条数据都包含恶意代码和隐藏威胁,每一条数据都必须清除

关闭全局变量

在php.ini文件中进行如下配置:

register_globals = Off

如果开启该配置选项,将会存在很大的安全风险。 例如,有一个process.php脚本文件,它将接收到的数据插入到数据库中,接收用户输入数据的形式可能如下:


这样,当数据提交到process.php时,php会注册一个$username变量,并将该变量数据提交到process.php,并为任何POST或GET请求参数设置这样的变量。 如果初始化时不显示,会出现以下问题:


这里,假设authentiated_user函数是确定$authorized变量的值。 如果启用了register_globals配置,那么任何用户都可以发送请求将$authorized变量的值设置为任何值,从而可以绕过此验证。

所有此类提交的数据都要通过PHP预定义的外部全局链表获取,包括$_POST、$_GET、$_FILES、$_SERVER、$_REQUEST等,其中$_REQUEST是一个$_GET/$_POST/$_COOKIE的联合变量三个链表中,默认顺序是$_COOKIE、$_POST、$_GET。

推荐的安全配置选项

error_reporting设置为Off:不向用户暴露错误消息,开发时可以设置为ON

安全模式设置为关闭

register_globals 设置为关闭

禁用以下函数:system、exec、passthru、shell_exec、proc_open、popen

open_basedir设置为/tmp,这样可以存放会话信息,同时可以设置单独的网站根目录

hide_php 设置为关闭

allowed_url_fopen 设置为关闭

allowed_url_include 设置为关闭

SQL注入攻击

php筛选_excel筛选后筛选_php之多条件混合筛选

对于操作数据库的SQL语句来说,需要高度注意安全性,因为用户可能输入特定的单词和语句,导致原有的SQL语句改变其功能。 像下面这样:

$sql = "select * from pinfo where product = '$product'";

此时,如果用户输入的$product参数为:

39'; DROP pinfo; SELECT 'FOO

那么最终的 SQL 语句如下所示:

select product from pinfo where product = '39'; DROP pinfo; SELECT 'FOO'

这样就会产生三个SQL语句,从而导致pinfo表被删除,从而导致严重的后果。

使用 PHP 的外部函数可以轻松解决这个问题:

$sql = 'Select * from pinfo where product = '"' 
       mysql_real_escape_string($product) . '"';

为了防止SQL注入攻击,需要做两件事:

始终对输入参数进行类型验证

始终使用 mysql_real_escape_string 函数作为特殊字符的通配符,例如单冒号、双冒号和反逗号

不过根据这里的开发经验,不要在php中启用Magic Quotes。 这个功能在php6中早就被废除了,需要的时候总是执行通配符。

excel筛选后筛选_php筛选_php之多条件混合筛选

防止基本的 XSS 攻击

与其他攻击不同,XSS 攻击是在客户端进行的。 最基本的XSS工具就是防止javascript脚本窃取用户提交的表单页面上的数据和cookie。

XSS 工具比 SQL 注入更毫无防御能力。 各大公司的网站都曾遭受过XSS攻击。 虽然这些攻击与php语言无关,但是php可以用来过滤用户数据,从而保护用户数据。 这里主要用的是对User数据进行过滤,一般过滤掉HTML标签,特别是a标签。 以下是常见的过滤方法:

function transform_HTML($string, $length = null) {
// Helps prevent XSS attacks
    // Remove dead space.
    $string = trim($string);
    // Prevent potential Unicode codec problems.
    $string = utf8_decode($string);
    // HTMLize HTML-specific characters.
    $string = htmlentities($string, ENT_NOQUOTES);
    $string = str_replace("#", "#", $string);
    $string = str_replace("%", "%", $string);
    $length = intval($length);
    if ($length > 0) {
        $string = substr($string, 0, $length);
    }
    return $string;
}

该函数将 HTML 的特殊字符转换为 HTML 实体,浏览器在渲染此文本时以纯文本形式显示它。 如粗体会显示为:

<STRONG>粗体文本</STRONG>

上述函数的核心是htmlentities函数,该函数将html特殊标签转换为html实体字符,可以过滤大部分XSS攻击。

但对于经验丰富的 XSS 攻击者来说,还有更巧妙的攻击方式:将其恶意代码编码为十六进制或 utf-8,而不是普通的 ASCII 文本,例如,可以使用以下形式:

浏览器渲染的结果显然是:

 Dosomethingmalicious

这样就达到了攻击的目的。 为了避免这些情况,需要在transform_HTML函数的基础上将#和%转换成对应的实体符号,并添加$length参数来限制提交数据的最大粗细。

使用 SafeHTML 避免 XSS 攻击

上述针对XSS攻击的防护非常简单,但并没有包含用户的所有标签。 同时,有数百种方法可以绕过过滤功能提交javascript代码,并且没有办法完全阻止这种情况。

目前还没有单一的脚本可以保证它不会被攻击破坏,但总有相对较好的防护程度。 安全防护有两种方式:白名单和黑名单。 其中,白名单更加简单有效。

SafeHTML 是一种白名单解决方案,它足够智能,可以识别有效的 HTML,然后消除任何危险标签。 这个需要根据HTMLSax包来解析。

安装 SafeHTML 的方法:

1.进入page=safehtml下载最新的SafeHTML

2. 将文件加载到服务器的classes目录中,其中包含所有SafeHTML和HTMLSax库

3. 在您自己的脚本中包含 SafeHTML 类文件

4. 创建 SafeHTML 对象

5.使用parse方法进行过滤

< php
/* If you're storing the HTMLSax3.php in the /classes directory, along
   with the safehtml.php script, define XML_HTMLSAX3 as a null string. */
define(XML_HTMLSAX3, '');
// Include the class file.
require_once('classes/safehtml.php');
// Define some sample bad code.
$data = "This data would raise an alert alert('XSS Attack')";
// Create a safehtml object.
$safehtml = new safehtml();
// Parse and sanitize the data.
$safe_data = $safehtml->parse($data);
// Display result.
echo 'The sanitized data is 
' . $safe_data; >

SafeHTML并不能完全避免XSS攻击,它只是一种相对复杂的脚本验证方法。

采用双向HASH加密方式保护数据

单向哈希加密可确保每个用户的密码是唯一的且无法破译。 只有最终用户知道密码,系统不知道原始密码。 其中一种用途是php筛选,系统受到攻击后,攻击者很难知道原始密码数据。

加密和哈希是两个不同的过程。 与加密不同,Hash 难以破译,并且是双向的; 同时,两个不同的字符串可能得到相同的哈希值,并且无法保证哈希值的唯一性。

MD5函数处理后的哈希值基本上无法破解,但总有可能的,网上也有MD5哈希字典。

使用 mcrypt 加密数据

MD5哈希函数可以以可读的形式显示数据,但是在存储用户的信用卡信息时,需要加密存储,后期还需要解密。

最好的办法是使用mcrypt模块,它包含30多种加密方法,保证只有加密者才能解密数据。


mcrypt 函数需要以下信息:

1. 需要加密的数据

2. 用于加密和解密数据的密钥

3、用户选择的加密数据的具体算法(密码:如MCRYPT_TWOFISH192、MCRYPT_SERPENT_256、MCRYPT_RC2、MCRYPT_DES、MCRYPT_LOKI97)

4. 加密所采用的模式

5. 加密种子,用于启动加密过程的数据,是用于初始化加密算法的附加二进制数据

6、加密后的密钥和种子的宽度可以通过mcrypt_get_key_size函数和mcrypt_get_block_size函数获取

如果数据和密钥都被盗,攻击者可以遍历密码找到打开线路的方法,所以我们需要对加密后的密钥进行一次MD5以保证安全。 同时,由于mcrypt函数返回的加密数据是二进制数据,将其保存在数据库数组中会导致其他错误。 Base64encode用于将这些数据转换为十六进制数,以方便存储。

参考: