Web应用程序安全的基础是对输出进行通配符或对特殊字符进行编码以保持原始含义。 例如,O'Reilly 在发送到 MySQL 数据库之前要求通配符为 O'Reilly。 单冒号前面的反斜杠意味着单引号是数据本身的一部分,而不是其原始含义。
我指的输出通配符具体分为三步:
l 识别输出
l 输出通配符
l 区分通配符和非通配符数据
有必要仅对过滤后的数据使用通配符。 尽管通配符可以防止许多常见的安全漏洞,但它们并不能替代输入过滤。 必须首先过滤受污染的数据,然后过滤通配符。
对输出进行通配符时,必须首先识别输出。 通常,这比识别输入简单得多,因为它取决于您执行的操作。 例如,在识别客户端的输出时php 特殊字符,可以在代码中查找以下句子:
回声
打印
打印函数
作为应用程序的开发人员,您必须了解外部系统的每个输出。 它们构成了输出。 与过滤一样,转义过程因情况而异。 对于不同类型的数据,过滤也不同,转义也根据你传输到不同系统的信息使用不同的技术。
PHP 中有内置函数可用于某些常见输出目标的通配符php 特殊字符,包括客户端、数据库和 URL。
如果您要编写自己的算法,那么万无一失很重要。 有必要在外国系统中找到可靠且完整的特殊字符及其表示形式的列表,以便保存数据而不是翻译数据。
最常见的输出目的地是客户端计算机,在发送数据之前使用 htmlentities( ) 对数据进行通配符是最好的技巧。 与其他字符串函数一样,它的输入是字符串,经过处理后输出。 但使用 htmlentities( ) 函数的最佳方法是指定它的两个可选参数:引号的通配符形式(第二个参数)和字符集(第三个参数)。 引号的通配符形式应指定为ENT_QUOTES,其目的是同时通配单冒号和双冒号,这是最彻底的,并且字符集参数必须与页面使用的字符集匹配。
为了区分数据是否带有通配符,我仍然建议定义一个命名方案。 对于输出到客户端的通配符数据,我使用$html数组进行存储,它首先初始化为一个空链表,用于保存所有过滤和通配符数据。
$html = 数组( );
$html['用户名'] = htmlentities($clean['用户名'], ENT_QUOTES, 'UTF-8');
回声”
欢迎回来,{$html['username']}。
”;
暗示
htmlspecialchars( ) 函数与 htmlentities( ) 函数基本相同,它们的参数定义完全相同,只是 htmlentities( ) 的通配符更加彻底。通过 $html['username 将用户名输出到客户端'],可以保证里面的特殊字符不会被浏览到
被仪器误解。 如果用户名只包含字母和数字,通配符实际上是不必要的,但这体现了深度防御的原理。 转义任何输出是一个非常好的习惯,可以显着提高软件的安全性。
另一个常见的输出目标是数据库。 如果可能的话,需要使用PHP内置函数对SQL语句中的数据进行通配符。 对于 MySQL 用户来说,最好的通配符函数是 mysql_real_escape_string( )。 如果您使用的数据库没有可用的 PHP 内置通配符函数,addslashes( ) 是最后的手段。
以下示例说明了 MySQL 数据库的正确通配符方法:
$mysql = 数组( );
$mysql['用户名'] = mysql_real_escape_string($clean['用户名']);
$sql = "选择*
来自个人资料
WHERE 用户名 = '{$mysql['用户名']}'";
$结果= mysql_query($sql);