CSRF

Cross Site Request Forgery, 即跨站请求伪造。

原理

前提是向目标网站注入恶意代码并获得了用户身份信息(Cookie),该恶意代码的作用是在用户主动或不知情(如img标签)的情况下请求欺诈网站,然后在欺诈网站上带上获得的用户身份信息请求目标网站,从而达到攻击的目的。简单来说就是:攻击者盗用用户身份发起恶意请求。

CSRF因为需要注入代码、获得cookie,所以是在XSS攻击基础上发起的。

防御

  • 表单提交生成表单令牌(Token), 服务端每次提交需要校验令牌。
  • 使用验证码
  • 验证referer头

XSS

Cross-site Scripting(XSS) 跨站脚本攻击,主要利用HTML和JavaScript代码注入。

主要原理

网站程序(前端和后端)未对用户提交/请求的数据进行检查和过滤,将包含JavaScript代码的数据直接输出到浏览器解释执行。

类型

  • 反射型XSS

反射型XSS只是简单的把用户输入的数据“反射”给浏览器,也就是说需要诱使用户“点击”一个恶意链接,才能攻击成功。反射型XSS也叫作“非持久型XSS”。

  • 存储型XSS

主动提交恶意数据到服务器,攻击者在数据中嵌入代码,这样当其他用户请求后,服务器从数据库中查询数据并发给用户,用户浏览此类页面时就可能受到攻击。

  • DOM-based XSS

基于DOM的XSS,通过对具体DOM代码进行分析,根据实际情况构造DOM节点进行XSS跨站脚本攻击。

防御

  • 输入过滤,对用户提交/请求的数据进行转义或过滤HTML标签
  • 输出转义
  • 考虑设置HTTP Only Cookie

参考资料

PHP运行模式和(非)线程安全

运行模式

  • CGI模式

HTTP服务器收到用户请求后,启动一个子进程(php / php.exe)去处理,处理完后结束该子进程。

  • FastCGI模式

FastCGI作为HTTP服务器和动态脚本语言(PHP)的通信接口。PHP启动FastCGI进程管理器PHP-FPM,HTTP服务器收到用户请求后转发给PHP-FPM处理。

  • Apache模块模式

 mod_php以Apache模块的形式,在Apache启动时加载进去,Apache服务器收到用户请求后交由mod_php模块处理。

  • CLI

命令行模式,直接执行 php 命令。

  • ISAPI模式

Windows服务器下作为IIS的WEB服务扩展运行。PHP 5.3版本后丢弃 ISAPI 模块支持,使用改进的 FastCGI SAPI模块替代[Link]。

线程安全和非线程安全

PHP以Apache模块模式和ISAPI模式运行时,用Thread Safe版本;其它模式用Non-Thread Safe版。

 

HTTP状态码

1xx消息


这一类型的状态码,代表请求已被接受,需要继续处理。

101 Switching Protocols

服务器已经理解了客户端的请求,并将通过Upgrade消息头通知客户端采用不同的协议来完成这个请求。如从 HTTP1.1 切换到 HTTP/2 或 Websocket

2xx成功


这一类型的状态码,代表请求已成功被服务器接收、理解、并接受

200 OK

请求已成功

206 Partial Content(RFC 7233

服务器已经成功处理了部分GET请求,如断点续传、分段下载。

3xx重定向


301 Moved Permanently

永久重定向

302 Moved Temporarily

临时重定向

4xx客户端错误


这类的状态码代表了客户端看起来可能发生了错误,妨碍了服务器的处理

400 Bad Request

The request could not be understood by the server due to malformed syntax

401 Unauthorized

未通过 HTTP Auth 认证

403 Forbidden

服务器拒绝执行

404 Not Found

服务器找不到请求资源

405 Method Not Allowed

请求行中指定的请求方法不能被用于请求相应的资源。该响应必须返回一个Allow头信息用以表示出当前资源能够接受的请求方法的列表。例如,需要通过POST呈现数据的表单上的GET请求,或只读资源上的PUT请求。

5xx服务器错误


这类状态码代表了服务器在处理请求的过程中有错误或者异常状态发生

500 Internal Server Error

通用错误消息,服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。

502 Bad Gateway

后端服务器无响应,如nginx+php-fpm架构中php-fpm没有启动

503 Service Unavailable

由于临时的服务器维护或者过载,服务器当前无法处理请求。

504 Gateway Timeout

后端处理超时,如php执行时间超过nginx的fastcgi_read_timeout时间

 

Notes


301/302 区别

用户通过浏览器访问并无感知区别,主要作用于搜索引擎,302告诉搜索引擎此处跳转是临时的,应当收录原来的地址,有可能会被搜索引擎认为作弊;301告诉搜索引擎原地址已永久转移,应当收录新地址。引用一段StackOverflow的答案:

Status 301 means that the resource (page) is moved permanently to a new location. The client/browser should not attempt to request the original location but use the new location from now on.

Status 302 means that the resource is temporarily located somewhere else, and the client/browser should continue requesting the original url.

PHP和HTTP Authentication

# 获取认证用户名和密码

$_SERVER['PHP_AUTH_USER'];
$_SERVER['PHP_AUTH_PW'];

参考资料:

    https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication
    https://www.nginx.com/resources/admin-guide/restricting-access-auth-basic/
    http://php.net/manual/fa/features.http-auth.php