文分享自華為云社區《應用安全防護ESAPI-云社區-華為云》,作者: Uncle_Tom。
OWASP Enterprise Security API (ESAPI)是一個免費、開源的web應用程序安全控制庫,使程序員更容易編寫風險較低的應用程序。ESAPI庫旨在使程序員更容易對現有應用程序進行安全性改造。ESAPI庫也是新開發的堅實基礎。
考慮到特定語言的差異,所有OWASP ESAPI版本都有相同的基本設計:
OWASP ESAPI 已經實現下面安全控件
ESAPI 框架
ESAPI 覆蓋的OWASP Top 10
目前最新的版本是: 2.5.3.1, 可以直接在Maven 庫中找到。
<!-- https://mvnrepository.com/artifact/org.owasp.esapi/esapi -->
<dependency>
<groupId>org.owasp.esapi</groupId>
<artifactId>esapi</artifactId>
<version>2.5.3.1</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
網絡安全問題很大一部分是由于注入類問題造成的。這類問題主要是由于對外部輸入使用的過程中轉碼不當造成的,例如:SQL 注入、命令注入、跨站腳本等等。
Encode(編碼器接口)包含了許多解碼輸入和編碼輸出的方法,這樣處理過的字符對于各種解釋器都是安全的。
HTML編碼器(encodeForHTML)
@Test
void testEncodeForHTML() {
String input="<a href='sdfs'></a> < script > alert('xss'); </ script >";
String encodedString=ESAPI.encoder().encodeForHTML(input);
LOG.info("EncodeForHTML: {}", encodedString);
}
輸出:
EncodeForHTML: <a href='xss'></a> < script > alert('xss'); </ script >
URL編碼器(encodeForURL)
@Test
void testEncodeForURL() {
String input="/?callback=<script>alert('xss')</script>";
String encodedString;
try {
encodedString=ESAPI.encoder().encodeForURL(input);
LOG.info("EncodeForURL: {}", encodedString);
} catch (EncodingException e) {
fail("Should not get exception:" + e.getMessage());
}
}
輸出:
EncodeForURL: %2F%3Fcallback%3D%3Cscript%3Ealert%28%27xss%27%29%3C%2Fscript%3E
@Test
void testEncodeForSQL() {
String userId="tom' or '1=1'";
String sql="select * from user where user='"
+ ESAPI.encoder().encodeForSQL(new MySQLCodec(MySQLCodec.Mode.STANDARD), userId) + "'";
LOG.info("sql={}", sql);
}
輸出:
sql=select * from user where user='tom\' or \'1\=1\''
@Test
void testEncodeForOS() {
String input="dir & dir /s";
String cmd=ESAPI.encoder().encodeForOS(new WindowsCodec(), input);
LOG.info("cmd={}", cmd);
}
輸出:
cmd=dir^ ^&^ dir^ ^/s
網絡安全最大的威脅是外部輸入,所以對外部輸入的校驗對應用安全起著最大的防護作用。
ESAPI有一個輸入校驗配置: validation.properties 給出了常用的校驗。
validation.properties
Validator.SafeString=^[.\\p{Alnum}\\p{Space}]{0,1024}$
Validator.Email=^[A-Za-z0-9._%'-]+@[A-Za-z0-9.-]+\\.[a-zA-Z]{2,4}$
Validator.IPAddress=^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
Validator.URL=^(ht|f)tp(s?)\\:\\/\\/[0-9a-zA-Z]([-.\\w]*[0-9a-zA-Z])*(:(0-9)*)*(\\/?)([a-zA-Z0-9\\-\\.\\?\\,\\:\\'\\/\\\\\\+=&;%\\$#_]*)?$
Validator.CreditCard=^(\\d{4}[- ]?){3}\\d{4}$
Validator.SSN=^(?!000)([0-6]\\d{2}|7([0-6]\\d|7[012]))([ -]?)(?!00)\\d\\d\\3(?!0000)\\d{4}$
校驗接口
/**
* 輸入校驗
*
* @param context 校驗內容
* @param input 校驗輸入
* @param type 校驗類型,對應到 validation.properties 中的類型
* @param maxLength 輸入字符最大長度校驗
* @param allowNull 輸入字符Null值校驗,false - 不允許;true - 允許
* @return 校驗失敗返回 false,校驗成功返回 true
*/
boolean ESAPI.validator().getValidInput(String context, String input, String type, int maxLength, boolean allowNull);
@Test
void testValidatorEmail() {
String input="xxxx.com";
if (!ESAPI.validator().isValidInput("", input, "Email", 11, false)) {
LOG.error("Email validate fail!");
} else {
LOG.info("Email is validate.");
}
}
輸出:
Email validate fail!
org.owasp.esapi.errors.ConfigurationException: java.lang.reflect.InvocationTargetException Encoder class (org.owasp.esapi.reference.DefaultEncoder) CTOR threw exception.
at org.owasp.esapi.util.ObjFactory.make(ObjFactory.java:129)
at org.owasp.esapi.ESAPI.encoder(ESAPI.java:101)
at com.test.esapi.EsapiTest.testUpdateJulietInfo_good(EsapiTest.java:19)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
Caused by: java.lang.reflect.InvocationTargetException
at org.owasp.esapi.util.ObjFactory.make(ObjFactory.java:86)
... 71 more
Caused by: java.lang.ExceptionInInitializerError
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:375)
at org.owasp.esapi.util.ObjFactory.loadClassByStringName(ObjFactory.java:158)
at org.owasp.esapi.util.ObjFactory.make(ObjFactory.java:81)
at org.owasp.esapi.ESAPI.logFactory(ESAPI.java:139)
at org.owasp.esapi.ESAPI.getLogger(ESAPI.java:155)
at org.owasp.esapi.reference.DefaultEncoder.(DefaultEncoder.java:85)
at org.owasp.esapi.reference.DefaultEncoder.(DefaultEncoder.java:109)
at org.owasp.esapi.reference.DefaultEncoder.getInstance(DefaultEncoder.java:68)
... 76 more
Caused by: org.owasp.esapi.errors.ConfigurationException: Unable to locate resource: esapi-java-logging.properties
at org.owasp.esapi.logging.java.JavaLogFactory.readLoggerConfiguration(JavaLogFactory.java:128)
at org.owasp.esapi.logging.java.JavaLogFactory.(JavaLogFactory.java:96)
... 85 more
這個是 ESAPI 升級到 2.5.0.0 之后的版本時,最常碰到的問題。
2.5.0.0 是 ESAPI 一個重要的變動版本,我們從版本變更信息中可以看到:
從這里可以看到 ExceptionInInitializerError 應該是變更日志組件造成的,熟悉的朋友會立刻想到 ESAPI 的配置文件 ESAPI.properties 里面給出所有組件的配置。
從圖中 69 到 72 行可以看到,69 行的:
ESAPI.Logger=org.owasp.esapi.logging.java.JavaLogFactory
還是指向 org.owasp.esapi.logging.java.JavaLogFactory, 后面的注釋也提醒我們需要修改成 71 行的:
ESAPI.Logger=org.owasp.esapi.logging.slf4j.Slf4JLogFactory
修改后問題解決。
java.lang.NoClassDefFoundError: javax/servlet/http/HttpServletRequest
at java.base/java.lang.Class.getDeclaredMethods0(Native Method)
at java.base/java.lang.Class.privateGetDeclaredMethods(Class.java:3402)
at java.base/java.lang.Class.getMethodsRecursive(Class.java:3543)
at java.base/java.lang.Class.getMethod0(Class.java:3529)
at java.base/java.lang.Class.getMethod(Class.java:2225)
at org.owasp.esapi.util.ObjFactory.loadMethodByStringName(ObjFactory.java:196)
at org.owasp.esapi.util.ObjFactory.findSingletonCreateMethod(ObjFactory.java:173)
at org.owasp.esapi.util.ObjFactory.make(ObjFactory.java:84)
at org.owasp.esapi.ESAPI.validator(ESAPI.java:192)
at com.huawei.hwe.esapi.EsapiTest.testEsapi_encodeForURL(EsapiTest.java:23)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
Caused by: java.lang.ClassNotFoundException: javax.servlet.http.HttpServletRequest
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
... 79 more
這個問題明顯是缺少了依賴庫。我們可以查看 Maven 庫關于 ESAPI 的定義和依賴信息。
https://mvnrepository.com/artifact/org.owasp.esapi/esapi/2.5.3.1
編譯依賴
運行依賴
從運行依賴可以看到需要:javax.servlet ? javax.servlet-api
點開后面的版本號:3.1.0,就可以得到 javax.servlet-api 3.1.0 的 mvn 依賴配置,將這個配置加到工程的 pom.xml 文件中就可以了。
在 pom.xml 中加入 javax.servlet-api 配置后,問題解決。
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
關注 #華為云開發者聯盟#點擊下方,第一時間了解華為云新鮮技術~
華為云博客_大數據博客_AI博客_云計算博客_開發者中心-華為云
服電機編碼器是一種安裝在伺服電機上面的產品,相當于一種傳感器,但是很多人并不清楚它的具體作用是怎樣的,下面就由匯川伺服電機編碼器廠家信博明的技術人員為大家講解一下:
伺服電機編碼器是安裝在伺服電機上用來測量磁極位置和伺服電機轉角及轉速的一種傳感器,從物理介質的不同來分,伺服電機編碼器可以分為光電編碼器和磁電編碼器,另外旋轉變壓器也算一種特殊的伺服編碼器,市場上使用的基本上是光電編碼器,不過磁電編碼器作為后起之秀,有可靠,價格便宜,抗污染等特點。
伺服電機編碼器的作用是用來反饋伺服電機旋轉的角度(位置)給伺服驅動器,伺服驅動器收到反饋信號后再來控制伺服電機旋轉,形成閉環控制,以達到精確控制伺服電機旋轉的位置以及速度。
伺服電機編碼器除了可以反饋伺服電機的行程與PLC發出的脈沖做比較,從而達到一個閉環系統之外;還可以反饋伺服電機的轉速、轉子實際位置,以及讓驅動器識別電機的具體型號。給CPU做閉環精確控制,啟動的時候,CPU需要知道轉子的當前位置,也是靠伺服電機編碼器來給定的。
伺服電機編碼器的作用是什么?就分享到這里。伺服電機編碼器為傳感器類的一種,主要用來偵測機械運動的速度、位置、角度、距離或計數,除了應用在產業機械外,許多的馬達控控制伺服馬達、BLDC伺服馬達均需配備編碼器以供馬達控制器作為換相、速度及位置的檢出所以應用范圍相當廣泛。
深圳信博明自動化設備公司是匯川伺服電機代理商、匯川伺服電機廠家!提供匯川伺服驅動器、匯川伺變頻器、匯川伺服電機批發。網址:http://www.xbmcn.com/list-62-1.html
托管JavaScript庫并提供用于獲取和打包它們的工具。
構架
斷言
覆蓋
Runner
模板引擎允許您執行字符串插值。
用于Web的數據可視化工具。
用于處理文件的庫。
函數式編程庫,用于擴展JavaScript的功能。
反應式編程庫,以擴展JavaScript的功能。
數據結構庫構建更復雜的應用程序。
日期庫。
字符串庫。
本地化(l10n)和國際化(i18n)JavaScript庫。
用于指示負載狀態的庫。
鍵盤包裝
旅游和指南
輸入
日歷
選擇
文件上傳器
其他
模態和彈出窗口
滾動
菜單
表/網格
你不懂JS - 可能是用現代JavaScript編寫的最好的書,完全可以免費在線閱讀,或者可以買來支持作者。
原文:https://github.com/sorrycc/awesome-javascript
本文:https://pub.intelligentx.net/collection-awesome-browser-side-javascript-libraries-resources-and-shiny-things
討論:請加入知識星球或者小紅圈【首席架構師圈】
*請認真填寫需求信息,我們會在24小時內與您取得聯系。