安全建议


CP的数据库操作默认使用PDO, 每一条SQL的执行都需要先prepare, 然后再发送参数执行, 从很大程度上保证了数据安全.

强制类型转换

虽然CP对URL做了过滤处理(防止XSS), 但也不能防止恶意构造的"合法"请求, 比如如下请求:

?id[]=!=&id[]=1

可能组装的SQL条件如下

id != 1

当我们明确知道某个参数的类型时, 接收参数用强制类型转换:

$id = (int) $this->params['id']

这样能防止大部分恶意请求

filter_var

使用filter_var, filter_var_array 函数

FILTER_CALLBACK	调用用户自定义函数来过滤数据。
FILTER_SANITIZE_STRING	去除标签,去除或编码特殊字符。
FILTER_SANITIZE_STRIPPED	"string" 过滤器的别名。
FILTER_SANITIZE_ENCODED	URL-encode 字符串,去除或编码特殊字符。
FILTER_SANITIZE_SPECIAL_CHARS	HTML 转义字符 '"<>& 以及 ASCII 值小于 32 的字符。
FILTER_SANITIZE_EMAIL	删除所有字符,除了字母、数字以及 !#$%&'*+-/=?^_`{|}~@.[]
FILTER_SANITIZE_URL	删除所有字符,除了字母、数字以及 $-_.+!*'(),{}|//^~[]`<>#%";/?:@&=
FILTER_SANITIZE_NUMBER_INT	删除所有字符,除了数字和 +-
FILTER_SANITIZE_NUMBER_FLOAT	删除所有字符,除了数字、+- 以及 .,eE。
FILTER_SANITIZE_MAGIC_QUOTES	应用 addslashes()。
FILTER_UNSAFE_RAW	不进行任何过滤,去除或编码特殊字符。
FILTER_VALIDATE_INT	在指定的范围以整数验证值。
FILTER_VALIDATE_BOOLEAN	如果是 "1", "true", "on" 以及 "yes",则返回 true,如果是 "0", "false", "off", "no" 以及 "",则返回 false。否则返回 NULL。
FILTER_VALIDATE_FLOAT	以浮点数验证值。
FILTER_VALIDATE_REGEXP	根据 regexp,兼容 Perl 的正则表达式来验证值。
FILTER_VALIDATE_URL	把值作为 URL 来验证。
FILTER_VALIDATE_EMAIL	把值作为 e-mail 来验证。
FILTER_VALIDATE_IP	把值作为 IP 地址来验证

具体用法请查询PHP手册

正则验证

当接收的参数为一个不规则字符串的时候, 应该使用正则表达式判断参数的值是否正确

CSRF

最常用的做法就是在页面增加伪随机数, 具体做法请使用搜索引擎