## 防止SQL注入,進行數據過濾
在ThinkPHP5中提供了許多數據輸入過濾方法,例如
```
//強制轉換為Email格式
$this->request->post('email','',FILTER_VALIDATE_EMAIL);
$this->request->post('email','','email');
//強制轉換為數字
$this->request->post('id/d','0');
```
常用的修飾符如下
| 修飾符 | 作用 |
| :-- | :-- |
| s | 強制轉換為字符串類型 |
| d | 強制轉換為整型類型 |
| b | 強制轉換為布爾類型 |
| a | 強制轉換為數組類型 |
| f | 強制轉換為浮點類型 |
## 防止XSS跨站注入
解決防范XSS跨站注入的首先是按照上方的SQL注入做好請求數據過濾,其次是做好數據輸出時的編碼,我們在視圖模板中編寫代碼時,可以通過添加`htmlentities`對HTML代碼做實體編碼,例如
```
<input type="text" name="username" value="{$username|htmlentities}" />
```
千萬不要直接使用以下的代碼,以下代碼都是非常不安全的
```
<input type="text" name="username" value="{$Think.get.username}" />
或
<input type="text" name="username" value="{$_GET['username']}" />
```
## CSRF跨站請求
CSRF全稱為`cross site request forgery`,中文意思為:`跨站點偽裝請求`。
>跨站點請求的原理就是`用戶A`在`站點1`發布上傳粘貼了一個`站點2`的URL,`用戶B`不明就里的點擊了`站點2`的URL,而這個URL因為是偽裝請求`站點1`修改密碼(其它危險請求)的操作。此時`用戶A`就已經獲取了`用戶B`的賬戶信息。
例如我們常常在編寫表單提交的時候都是如下的寫法
```
<form action="">
<input type="password" name="newpassword" />
<input type="submit" />
</form>
```
以上的寫法很容易產生CSRF跨站點偽裝請求。
在ThinkPHP5可以很方便的使用`token`的方式來防范這種威脅,比如我們將上面的代碼改寫為
```
<form action="">
{:token()}
<input type="password" name="newpassword" />
<input type="submit" />
</form>
```
我們添加了一個`{:token()}`,由于這個token是我們服務端動態輸出的,偽裝者的服務器沒法獲取該值,此時我們再做好服務端驗證這個`token`是否有效即可,常用的方法如下
```
$token = $this->request->post('__token__');
//驗證Token
if (!$token || !\think\Validate::is($token, "token", ['__token__' => $token])) {
$this->error("請勿非常請求");
}
```
更多Token表單令牌的使用方法可以參考ThinkPHP5官方文檔:[http://www.hmoore.net/manual/thinkphp5/193918](http://www.hmoore.net/manual/thinkphp5/193918)
## 服務器安全
### 目錄安全
目錄安全在是經常容易生產問題的一個環節,很多時候我們都會忽略或忘記進行站點目錄安全的配置。
我們建議在生產環境只開放`uploads`和`runtime`目錄的讀寫權限,其次還需要關閉`uploads`目錄執行PHP的權限,因為很多時候用戶上傳惡意腳本,而服務端`uploads`目錄又未屏蔽PHP,導致用戶數據泄漏丟失。
通常情況在生產環境下建議使用
```
chown www:www /var/www/yoursite -R
chmod 655 /var/www/yoursite -R
chmod u+w /var/www/yoursite/runtime -R
chmod u+w /var/www/yoursite/public/uploads -R
```
通過以上的配置還不夠,我們還需要繼續對服務器做WEB配置以限制PHP腳本的運行
---
### WEB配置
Nginx可以通過以下配置禁止PHP腳本執行
```
location ~ ^/(uploads|assets)/.*\.(php|php5|jsp)$ {
deny all;
}
```
Apache可以通過在`.htaccess`中配置來禁用PHP腳本執行
```
RewriteEngine on RewriteCond % !^$
RewriteRule uploads/(.*).(php)$ – [F]
```
或使用
```
<Directory "/www/yoursite/public/uploads">
<Files ~ ".php">
Order allow,deny
Deny from all
</Files>
</Directory>
```
其次在新增網站配置時務必綁定`public`目錄為運行目錄,同時啟用`open_basedir`限制只允許FastAdmin的根目錄,例如:`fastcgi_param PHP_VALUE "open_basedir=/var/www/fastadmin/:/tmp/:/proc/";`
通常也建議修改`php.ini`,禁用不安全的函數,配置如`disable_functions = passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,popen,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,`
- PHP獲取客戶端瀏覽器信息和版本
- PHP獲取客戶端操作系統信息
- 無限級分類
- git使用
- 權限檢測思路
- Vue學習
- 遇到的一些問題
- PHP的編碼思維和技巧
- mysql復習
- tp5
- ThinkPHP5.x 公共函數
- TP5登錄注冊
- TP5使用模板繼承
- ThinkPHP5.1 清除緩存
- thinkphp5實現安裝程序
- 安全
- tp中實現跨域代碼
- ThinkPHP5.1配合pjax實現菜單欄無刷新跳轉
- 獲取數據庫版本和數據庫大小
- 模型的基本CURD操作
- 商品spu
- 全局異常處理類
- ExceptionHandler
- BaseException
- PHP函數之error_reporting(E_ALL ^ E_NOTICE)詳細說明
- 微信小程序
- wx:for
- tp6
- 分離的一些模塊
- session開啟
- Spring
- 依賴注入
- 數據結構
- 二叉樹
- js獲取地址欄變量
- PHP設計模式
- 面向對象
- PHP1
- PHP性能優化
- Java學習
- static關鍵字
- 多態
- 接口、階乘
- 大佬給的面試題
- 訪問量為5000萬的博客系統設計
- PHP可變參數
- Nginx的配置案例
- 求數組中的最大值,并返回數組索引
- PHP面試方向
- PHP數組工具類ArrUtil
- 字符串工具類StrUtil
- PHP使用curl發送請求
- mysql
- PHP上傳base64圖片處理函數
- webstorm小程序常用配置
- 郵箱正則表達式
- leetcode mysql記錄
- 函數庫