文分享自华为云社区《应用安全防护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小时内与您取得联系。