用户提交的数据
- 必须时常留意你的代码,以确保每一个从客户端提交的变量都经过适当的检查,然后问自己以下一些问题:
- 此脚本是否只能影响所预期的文件?
- 非正常的数据被提交后能否产生作用?
- 此脚本能用于计划外的用途吗?
- 此脚本能否和其它脚本结合起来做坏事?
- 是否所有的事务都被充分记录了?
魔术引号指令
magic_quotes_gpc
:对GET、POST、COOKIE生效;magic_quotes_runtime
:对大部分从外部获取的数据生效;magic_quotes_sybase
:覆盖magic_quotes_gpc
,会使用单引号对单引号进行转义,而双引号、反斜线 和 NULL 字符将不会进行转义;- 没有理由再使用魔术引号,因为它不再是 PHP 支持的一部分。 不过它帮助了新手在不知不觉中写出了更好(更安全)的代码;
HTTP认证
- 分为basic和digest认证两种,basic是账户密码的明文传输认证,digest摘要认证不包含密码,包含认证信息的摘要信息;
文件上传
- 要确保文件上传表单的属性是 enctype=“multipart/form-data”;
- 注意 PHP 也支持 PUT 方法的文件上传;
max_execution_time
仅仅只影响脚本本身运行的时间。任何其它花费在脚本运行之外的时间,诸如用函数 system() 对系统的调用、sleep() 函数的使用、数据库查询、文件上传等,在计算脚本运行的最大时间时都不包括在内max_input_time
以秒为单位设定了脚本接收输入的最大时间,包括文件上传。对于较大或多个文件,或者用户的网速较慢时,可能会超过默认的 60 秒;
使用远程文件
- 只要在 php.ini 文件中激活了
allow_url_fopen
选项,就可以在大多数需要用文件名作为参数的函数中使用 HTTP 和 FTP 的 URL 来代替文件名;
连接状态
- 0:正常状态;1:用户退出;2:超时退出;
- 用户超时退出可以使用
ignore_user_abort
来忽略; - 有时候让脚本执行完成或许是更好的选择;
- 3=1+2,同时设置了忽略用户退出;
数据库持久连接
- 实际上,从严格意义上来讲,持久连接不会提供任何非持久连接无法提供的特殊功能;
- 持久连接的好处在于提升效率;
- 不管在什么情况下,都可以通过使用
register_shutdown_function()
函数来注册一个简单的清理函数来打开数据表锁,或者回滚事务。或者更好的处理方法,是不在使用数据表锁或者事务处理的脚本中使用持久连接,这可以从根本上解决这个问题; - 持久连接与常规的非持久连接应该是可以互相替换的。即将持久连接替换为非持久连接时,你的脚本的行为不应该发生改变。使用持久连接只应该改变脚本的效率,不应该改变其行为;