对于一些常见的输出目标(包括客户端、数据库教程和URL)的转义,PHP 中有内置函数可用.
如果你要写一个自己算法,做到万无一失很重要,需要找到在外系统中特殊字符的可靠和完整的列表,以及它们的表示方式,这样数据是被保留下来而不是转译了.
最常见的输出目标是客户机,使用htmlentities( )在数据发出前进行转义是最好的方法,与其它字符串函数一样,它输入是一个字符串,对其进行加工后进行输出,但是使用htmlentities( )函数的最佳方式是指定它的两个可选参数:引号的转义方式(第二参数)及字符集(第三参数),引号的转义方式应该指定为ENT_QUOTES,它的目的是同时转义单引号和双引号,这样做是最彻底的,字符集参数必须与该页面所使用的字符集相必配.
为了区分数据是否已转义,我还是建议定义一个命名机制,对于输出到客户机的转义数据,我使用$html 数组进行存储,该数据首先初始化成一个空数组,对所有已过滤和已转义数据进行保存,实例代码如下:
- <?php
- $html = array( );
- $html['username'] = htmlentities($clean['username'], ENT_QUOTES, 'UTF-8');
- echo "<p>Welcome back, {$html['username']}.</p>";
- ?>
小提示:htmlspecialchars( )函数与htmlentities( )函数基本相同,它们的参数定义完全相同,只不过是htmlentities( )的转义更为彻底,通过$html['username']把username 输出到客户端,你就可以确保其中的特殊字符不会被浏览器所错误解释,如果username 只包含字母和数字的话,实际上转义是没有必要的,但是这体现了深度防范的原则,转义任何的输出是一个非常好的习惯,它可以戏剧性地提高你的软件的安全性.
另外一个常见的输出目标是数据库,如果可能的话,你需要对SQL 语句中的数据使用PHP内建函数进行转义,对于MySQL 用户,最好的转义函数是mysql_real_escape_string(),如果你使用的数据库没有PHP 内建转义函数可用的话,addslashes( )是最后的选择.
下面的例子说明了对于MySQL 数据库的正确的转义技巧:
- <?php
- $mysql = array( );
- $mysql['username'] = mysql_real_escape_string($clean['username']);
- $sql = "SELECT *
- FROM profile
- WHERE username = '{$mysql['username']}'";
- $result = mysql_query($sql);
- ?>
|