安全建议
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
最常用的做法就是在页面增加伪随机数, 具体做法请使用搜索引擎