互聯網API開放平臺安全設計(一)--Web安全漏洞

什麼是XSS攻擊手段

XSS攻擊使用Javascript腳本注入進行攻擊

例如在提交表單後,展示到另一個頁面,可能會受到XSS腳本注入,讀取本地cookie遠程發送給黑客服務器端。

<script>alert('sss')</script>

<script>window.location.href='http://www.itmayiedu.com';</script>

對應html源代碼: &lt;script&gt;alert('sss')&lt;/script&gt;

 如何防禦XSS攻擊

將腳本特殊字符,轉換成html源代碼進行展示。

// 重寫HttpServletRequestWrapper 防止XSS攻擊
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
	private HttpServletRequest request;

	/**
	 * @param request
	 */
	public XssHttpServletRequestWrapper(HttpServletRequest request) {
		super(request);
		this.request = request;
	}

	@Override
	public String getParameter(String name) {
		// 過濾getParameter參數 檢查是否有特殊字符
		String value = super.getParameter(name);
		System.out.println("value:" + value);
		if (!StringUtils.isEmpty(value)) {
			// 將中文轉換爲字符編碼格式,將特殊字符變爲html源代碼保存
			value = StringEscapeUtils.escapeHtml(value);
			System.out.println("newValue:" + value);
		}
		return value;
	}

}

SQL注入攻擊

什麼是SQL注入

SQL注入:利用現有應用程序,將(惡意)的SQL命令注入到後臺數據庫執行一些惡意的操作。造成SQL注入的原因是因爲程序沒有有效過濾用戶的輸入,使攻擊者成功的向服務器提交惡意的SQL查詢代碼,程序在接收後錯誤的將攻擊者的輸入作爲查詢語句的一部分執行,導致原始的查詢邏輯被改變,額外的執行了攻擊者精心構造的惡意代碼

SQL注入防攻擊手段

不要使用拼接SQL語句方式、最好使用預編譯方式,在mybatis編寫sql語句的時候,最好使用?傳參數方式,不要使用#傳參數,因爲#傳參數方式,可能會受到sql語句攻擊。

Http請求防盜鏈

什麼是防盜鏈

比如A網站有一張圖片,被B網站直接通過img標籤屬性引入,直接盜用A網站圖片展示。

如何實現防盜鏈

  判斷http請求頭Referer域中的記錄來源的值,如果和當前訪問的域名不一致的情況下,說明該圖片可能被其他服務器盜用。

public class ImgFilter implements Filter {

	@Value("${domain.name}")
	private String domainName;

	public void init(FilterConfig filterConfig) throws ServletException {

	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		HttpServletRequest req = (HttpServletRequest) request;
		String referer = req.getHeader("Referer");
		if (StringUtils.isEmpty(referer)) {
			request.getRequestDispatcher("/imgs/error.png").forward(request, response);
			return;
		}
		String domain = getDomain(referer);
		if (!domain.equals(domainName)) {
			request.getRequestDispatcher("/imgs/error.png").forward(request, response);
			return;
		}
		chain.doFilter(request, response);
	}

	/**
	 * 獲取url對應的域名
	 *
	 * @param url
	 * @return
	 */
	public String getDomain(String url) {
		String result = "";
		int j = 0, startIndex = 0, endIndex = 0;
		for (int i = 0; i < url.length(); i++) {
			if (url.charAt(i) == '/') {
				j++;
				if (j == 2)
					startIndex = i;
				else if (j == 3)
					endIndex = i;
			}

		}
		result = url.substring(startIndex + 1, endIndex);
		return result;
	}

	public void destroy() {

	}
}

防禦CSRF攻擊手段

使用圖形驗證碼防止機器模擬接口請求攻擊,在調用核心業務接口時,比如支付、下單、等接口,最好使用手機短信驗證驗證或者是人臉識別,防止其他用戶使用Token僞造請求。

忘記密碼漏洞

黑客使用抓包工具分析Http請求,在忘記密碼找回時,需要發送一套短信驗證碼,如果驗證碼數字比較短的話,很容易使用暴力破解方式攻擊破。

防禦手段:

忘記密碼驗證碼最好在6-8位。

一旦頻繁調用接口驗證時,應該使用圖形驗證碼攔截,防止機器模擬。

使用黑名單和白名單機制,防禦攻擊。

上傳文件漏洞

漏洞描述

上傳漏洞這個顧名思義,就是攻擊者通過上傳木馬文件,直接得到WEBSHELL,危害等級超級高,現在的入侵中上傳漏洞也是常見的漏洞。

 導致該漏洞的原因在於代碼作者沒有對訪客提交的數據進行檢驗或者過濾不嚴,可以直接提交修改過的數據繞過擴展名的檢驗。

漏洞危害

1)可以得到WEBSHELL

2)上傳木馬文件,可以導致系統癱瘓

修復方案

1)對文件格式限制,只允許某些格式上傳

2)對文件格式進行校驗,前端跟服務器都要進行校驗(前端校驗擴展名,服務器校驗擴展名、Content_Type等)

3)將上傳目錄防止到項目工程目錄之外,當做靜態資源文件路徑,並且對文件的權限進行設定,禁止文件下的執行權限。

判斷文件流是否爲圖片格式

/**
	 * 文件上傳
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) {
		String root = request.getServletContext().getRealPath("/upload");
		DiskFileItemFactory factory = new DiskFileItemFactory();
		ServletFileUpload upload = new ServletFileUpload(factory);
		try {
			List<FileItem> list = upload.parseRequest(request);
			for (FileItem it : list) {
				// 如果是file文件類型
				if (!it.isFormField()) {
					FileType fileType = getFileType(it.getInputStream());
					if (fileType == null) {
						// 非圖片格式
						response.getWriter().write("fail");
						return;
					}
					String imgValue = fileType.getValue();
					System.out.println("imgValue:" + imgValue);
					// 是圖片格式
					it.write(new File(root + "/" + it.getName()));
					response.getWriter().write("success");

				}
			}
		} catch (Exception e) {
			try {
				response.getWriter().write("exception");
			} catch (IOException e1) {
				e1.printStackTrace();
			}
			e.printStackTrace();
		}
	}

	// 判斷文件是圖片格式
	public static FileType getFileType(InputStream is) throws IOException {
		byte[] src = new byte[28];
		is.read(src, 0, 28);
		StringBuilder stringBuilder = new StringBuilder("");
		if (src == null || src.length <= 0) {
			return null;
		}
		for (int i = 0; i < src.length; i++) {
			int v = src[i] & 0xFF;
			String hv = Integer.toHexString(v).toUpperCase();
			if (hv.length() < 2) {
				stringBuilder.append(0);
			}
			stringBuilder.append(hv);
		}
		FileType[] fileTypes = FileType.values();
		for (FileType fileType : fileTypes) {
			if (stringBuilder.toString().startsWith(fileType.getValue())) {
				return fileType;
			}
		}
		return null;
	}

APIGateway網關

什麼是網關

隨着互聯網的快速發展,當前以步入移動互聯、物聯網時代。用戶訪問系統入口也變得多種方式,由原來單一的PC客戶端,變化到PC客戶端、各種瀏覽器、手機移動端及智能終端等。同時系統之間大部分都不是單獨運行,經常會涉及與其他系統對接、共享數據的需求。所以系統需要升級框架滿足日新月異需求變化,支持業務發展,並將框架升級爲微服務架構。“API網關”核心組件是架構用於滿足此些需求。

很多互聯網平臺已基於網關的設計思路,構建自身平臺的API網關,國內主要有京東、攜程、唯品會等,國外主要有Netflix、Amazon等。

網關框架框架

業界爲了滿足這些需求,已有相關的網關框架。

1、基於nginx平臺實現的網關有:KONG、API Umbrella

2、自研發的網關有:apigee、Zuul

API網關設計

API網關是微服務架構(Microservices Architecture)標準化服務的模式。API網關定位爲應用系統服務接口的網關,區別於網絡技術的網關,但是原理則是一樣。API網關統一服務入口,可方便實現對平臺衆多服務接口進行管控,對訪問服務的身份認證、防報文重放與防數據篡改、功能調用的業務鑑權、響應數據的脫敏、流量與併發控制,甚至基於API調用的計量或者計費等等。組件設計如下:

網關的應用場景

  1. 黑白名單:實現通過IP地址控制禁止訪問網關功能,此功能是應用層面控制實現,再往前也可以通過網絡傳輸方面進行控制訪問。
  2. 日誌:實現訪問日誌的記錄,可用於分析訪問、處理性能指標,同時將分析結果支持其他模塊功能應用。
  3. 協議適配:實現通信協議校驗、適配轉換的功能。
  4.  身份認證:負責網關訪問身份認證驗證,此模塊與“訪問認證中心”通信,實際認證業務邏輯交移“訪問認證中心”處理。
  5. 計流限流:實現微服務訪問流量計算,基於流量計算分析進行限流,可以定義多種限流規則。
  6. 路由:路由是API網關很核心的模塊功能,此模塊實現根據請求,鎖定目標微服務並將請求進行轉發。此模塊需要與“服務發佈管理中心”通信。“服務發佈管理中心”實現微服務發佈註冊管理功能,與其通信獲得目標微服務信息。

API網關部署

API網關是一個公共基礎組件,無狀態,可支持多套分佈式部署。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章