当前位置: 首页 > news >正文

生活服务信息类网站建设全新的手机网站设计

生活服务信息类网站建设,全新的手机网站设计,现在做个网站多少钱,郑州专业网页模板制作公司0xFE_编程规范使用UTF-8编码使用空格缩进命名清晰表达意图, 少用缩写(行业通用除外, 如: requestreq, responseresp, messagemsg), 不应使用特殊前缀或后缀用复数形式代表集合\w{2,64}, 除循环变量i, j, k, 异常e外类型命名风格包全小写, 点号分割, 允许数字, 无下划线类, 接口…0xFE_编程规范使用UTF-8编码使用空格缩进命名清晰表达意图, 少用缩写(行业通用除外, 如: requestreq, responseresp, messagemsg), 不应使用特殊前缀或后缀用复数形式代表集合\w{2,64}, 除循环变量i, j, k, 异常e外类型命名风格包全小写, 点号分割, 允许数字, 无下划线类, 接口, 枚举, 注解名词/形容词, 大驼峰, 缩写也用大驼峰, 测试类加Test后缀字段, 局部变量, 方法, 方法参数介词/动词, 小驼峰, 测试方法可有下划线_静态常量, 枚举全大写, 下划线分割, 常见的Logger, Lock可除外泛型单个大写字母, 可接一个数字异常加后缀Exception数据库全小写下划线表名全大写下划线列名全大写下划线注释Javadoc用于public/protected排版文件非空非注释不超过2000行, 每行120窄字符, 方法不超过50行换行开始:.::|修饰符publicabstract, staticfinal transient volatile synchronizedvoid数字后缀大写long value 1000000000L数组声明String[] args {a, b}条件和循环必须使用大括号, 左括号在行尾变量一个局部变量只表达一种含义, 避免前后不一致浮点数不能使用判等, 不能精确计算, 不能作为循环变量BigDecimal income new BigDecimal(1.03);BigDecimal expense new BigDecimal(0.42);// 0.61LOG.info(BigDecimal: income.subtract(expense));// 0.61LOG.info(1.03f - 0.42f: (1.03f - 0.42f));方法包含方法本身, 嵌套深度不超过4参数不超过5个, 异常不超过5个类,接口接口中属性缺省public static final, 方法缺省public abstract异常在finally中不要使用return, break, continue日志使用SLF4JLogBackprivate static final Logger LOG LoggerFactory.getLogger(Xxx.class)日志级别条件或占位符不要使用foreach remove, 可以使用iterator.remove()安全编程数据校验在信任边界以内(如Web服务端)进行数据校验输入校验输出校验接收白名单: Pattern.matches(^[0-9a-zA-Z_]$, abc_123)拒绝黑名单, 白名单净化(对所有非字母数字删除/编码/替换), 黑名单净化(对某些特殊字符删除/编码/替换)禁止使用assert校验防止命令注入Runtime.exec()java.lang.ProcessBuilder防止SQL注入参数化查询PreparedStatement, {参数下标从1开始}: stmt.setString(1, userName);存储过程conn.prepareCall()也不能拼接SQL再执行Hibernate 原生SQLsession.createSQLQuery()应使用参数化查询, HQLsession.createQuery()应使用基于位置/名称的参数化查询iBatis禁止使用$拼接SQL白名单校验(表名/字段名)转码文件路径校验前必须先进行标准化等价路径: 软链接目录遍历: 路径跨越../必须使用getCanonicalPath(), 其他方法getPath(), getParent(), getAbsolutePath()均不会归一化解压目录遍历DoS错误示例public class IODemo {private static final Logger log Logger.getLogger(IODemo.class.getName());public static void zipIO(String path) {FileInputStream fin null;BufferedInputStream bin null;ZipInputStream zin null;FileOutputStream fout null;BufferedOutputStream bout null;try {File zipFile new File(path);// 解压到当前目录String parent zipFile.getParent() File.separator;fin new FileInputStream(zipFile);bin new BufferedInputStream(fin);zin new ZipInputStream(bin);ZipEntry entry null;int count;final int BUFFER_SIZE 512;byte data[] new byte[BUFFER_SIZE];// 对压缩包中的每个文件while ((entry zin.getNextEntry()) ! null) {// toString()调用了getName()log.info(Extracting: entry);File unzipFile new File(parent entry.getName());if (unzipFile.isDirectory()) {// 目录unzipFile.mkdir();} else {final int FILE_MAXSIZE 0x6400000; // 100MB// 判断文件大小, 可以被伪造if (entry.getSize() -1 || entry.getSize() FILE_MAXSIZE) {throw new IllegalArgumentException(File is too big.);}fout new FileOutputStream(unzipFile);bout new BufferedOutputStream(fout, BUFFER_SIZE);while ((count zin.read(data, 0, BUFFER_SIZE)) ! -1) {bout.write(data, 0, count);bout.flush();}}zin.closeEntry();}} catch (IOException e) {log.severe(e.getMessage());} finally {try {bout.close();fout.close();zin.close();bin.close();fin.close();} catch (IOException e) {log.severe(e.getMessage());}}}public static void main(String[] args) {zipIO(D:\\tmp\\io.zip);}}推荐示例public class IODemo {private static final Logger log Logger.getLogger(IODemo.class.getName());public static void zipIO(String zipFilepath) {FileInputStream fin null;BufferedInputStream bin null;ZipInputStream zin null;FileOutputStream fout null;BufferedOutputStream bout null;try {File zipFile new File(zipFilepath);// 解压到当前目录String parent zipFile.getParent() File.separator;fin new FileInputStream(zipFile);bin new BufferedInputStream(fin);zin new ZipInputStream(bin);ZipEntry entry null;int count;final int BUFFER_SIZE 512;byte data[] new byte[BUFFER_SIZE];// 总解压文件数量final int TOTAL_FILE_NUM 1000;// 总解压文件大小, 100MBfinal int TOTAL_FILE_MAXSIZE 0x6400000;int totalFileNum 0;int totalFileSize 0;while ((entry zin.getNextEntry()) ! null) {// 安全编程1: 校验解压文件数量if (totalFileNum TOTAL_FILE_NUM) {throw new IllegalArgumentException(Too many files.);}// toString()调用了getName()log.info(Extracting: entry);File unzipFile new File(parent entry.getName());// 安全编程2: 校验解压文件路径String unzipFilepath unzipFile.getCanonicalPath();if (!unzipFilepath.startsWith(parent)) {throw new IllegalArgumentException(File is outside extraction target directory);}if (unzipFile.isDirectory()) {// 目录unzipFile.mkdirs();} else {File dir new File(unzipFile.getParent());if (!dir.exists()) {dir.mkdirs();}fout new FileOutputStream(unzipFile);bout new BufferedOutputStream(fout, BUFFER_SIZE);while ((count zin.read(data, 0, BUFFER_SIZE)) ! -1) {// 安全编程3: 校验解压文件总大小if (totalFileSize TOTAL_FILE_MAXSIZE) {throw new IllegalArgumentException(File is too big.);}bout.write(data, 0, count);bout.flush();totalFileSize count;}}zin.closeEntry();totalFileNum;}} catch (IOException e) {log.severe(e.getMessage());} finally {try {if (bout ! null) {bout.close();}if (fout ! null) {fout.close();}if (zin ! null) {zin.close();}if (bin ! null) {bin.close();}if (fin ! null) {fin.close();}} catch (IOException e) {log.severe(e.getMessage());}}}public static void main(String[] args) {zipIO(D:\\tmp\\io.zip);}}防止CRLF和敏感信息记录日志接收白名单黑名单净化: message message.replace(\n, _).replace(\r, _);防止拼接格式化字符串造成敏感信息泄露// 敏感信息: 信用卡失效时间Calendar expirationDate Calendar.getInstance();expirationDate.set(2020, Calendar.FEBRUARY, 20);// 客户端输入// String input 12;// pocString input Date: %1$tY-%1$tm-%1$te;if (!String.valueOf(expirationDate.get(Calendar.DAY_OF_MONTH)).equals(input)) {// 存在格式化字符串注入System.out.printf(input did not match! HINT: It was issued in month %1$tm.\n, expirationDate);// 正确使用System.out.printf(%s did not match! HINT: It was issued in month %2$tm.\n, input, expirationDate);}防止异常泄露敏感信息敏感的异常消息敏感的异常类型FileNotFoundException捕获并抛出IOException自定义SecurityIOException继承IOException不抛出异常, 只打印简单日志白名单异常名称信息泄露或威胁描述java.io.FileNotFoundException泄露文件系统结构和文件名列举java.util.jar.JarException泄露文件系统结构java.util.MissingResourceException资源列举java.security.acl.NotOwnerException所有人列举java.util.ConcurrentModificationException可能提供线程不安全的代码信息javax.naming.InsufficientResourcesException服务器资源不足(可能有利于DoS攻击)java.net.BindException当不信任客户端能够选择服务器端口时造成开放端口列举java.lang.OutOfMemoryErrorDoSjava.lang.StackOverflowErrorDoSjava.sql.SQLException数据库结构用户名列举JSONException-防止空指针调用null的方法, 如objnull; obj.equals(xxx);, String snull; s.split( );访问null的属性获取null数组的长度访问数组中的null元素防止除0除法: /模: %多线程防止锁暴露同步方法同步this的代码块同步public static锁的代码块正确示例:public class LockDemo {private final Object LOCK new Object();public void changeValue() {synchronized (LOCK) {// ...}}}锁类型错误示例:Boolean只有两个值基础数据类型的包装类自动装箱private int count 0;private final Integer LOCK count;字符串常量: private final String LOCK LOCK;Interned String对象: private final String LOCK new String(LOCK).intern();, 在常量池中getClass(): 子类和基类, 类和内部类获取到的对象不同内置锁private final Lock LOCK new ReentrantLock();public void changeValue() {synchronized (LOCK) {// ...}}正确示例:基础数据类型的包装类private int count 0;private final Integer LOCK new Integer(count);字符串实例: private final String LOCK new String(LOCK);ObjectBase.class/Class.forName(Base): 明确类名保护静态数据错误示例:// 静态数据private static volatile int counter;// 非静态锁对象private final Object LOCK new Object();private static volatile int counter;public synchronized void run() {// ...}正确示例:private static volatile int counter;private static final Object LOCK new Object();保证顺序获得和释放多个锁在finally中释放锁禁止调用Thread.run()在当前线程中执行run()禁止调用Thread.stop()导致线程非正常释放锁通过修改volatile变量终止线程中的循环调用Thread.interrupt()终止线程中的循环禁止非线程安全的方法覆写线程安全的方法IO使用File.createTempFile创建临时文件, finally删除使用asReadOnlyBuffer()返回Buffer的只读视图防止阻塞在外部进程Runtime rt Runtime.getRuntime();Process proc rt.exec(notepad.exe);// java.lang.IllegalThreadStateException: process has not exitedint exitVal proc.exitValue();Runtime rt Runtime.getRuntime();Process proc rt.exec(notepad.exe);// 一直阻塞到外部进程终止int exitVal proc.waitFor();使用int保存read()的返回值序列化使用transient保护敏感信息序列化敏感数据时先签名后加密, 防止签名被篡改后正常数据校验不通过禁止序列化非静态的内部类如果某敏感操作使用安全管理器检查, 防止反序列化绕过防止反序列化注入二进制xmlXMLDecoder, 无消减措施XStream, setupDefaultSecurity()或addPermission白名单json: fastjson, jacksontype白名单类加载存在安全管理器检查的方法要声明为private或final, 防止子类复写自定义类加载器覆写getPermissions()方法时需要调用super.getPermissions()使用本地KeyStore中的证书校验jar中的签名加解密算法javax.cryptoSHA256 8Bytes salt iterator 10000 256bit(32Bytes)AES/GCM/NoPaddingRSADSAECDSA禁止DESAES ECB强随机数SecureRandomjavax.net.ssl.SSLSocket
http://www.pierceye.com/news/329661/

相关文章:

  • 漯河网站建设lhwzzz网络服务器机柜
  • 有口碑的武进网站建设国内做房车游网站
  • 山东省城乡住房和城乡建设厅网站济南网站建设wuliankj
  • 网站首页跳出弹窗wordpress远程后台设置
  • 免费信息网站建设平台影响网站排名的因素 权重
  • 做房产网站接不到电话湖北网站建设平台
  • 厦门国外网站建设公司排名上海自贸区注册公司优惠政策
  • 网站建设的公司实习做什么成都住建局官网住建智慧建管
  • 建一个免费看电影的网站犯法不国家企业信用信息没有网站怎么做
  • 长春网站vantage wordpress
  • 帝国cms如何做网站地图自己做的网站还要买域名么
  • 网站建设与维护税率网络营销案例及视频
  • 网站建设 繁体精品课网站制作
  • 常州 招网站开发seo的名词解释
  • 二级域名网站seo竞价网站建设
  • 麻栗坡网站建设正规网站建设
  • 邯郸网站建设哪家好重庆app开发
  • 自学网站开发多久大型网站建站
  • 网站设计定制多少钱新增备案网站负责人
  • 匿名聊天网站开发网站关键字挖掘
  • 外国域名注册很多网站做网站的人找不到了
  • 好的学习网站打广告免费浏览器网站
  • 美团先做网站还是app学生网站建设的总结与评价
  • 网站建设代理网站wordpress微博
  • dw建设网站视频宁波seo优化项目
  • 网站里添加百度地图浙江网站建设公司
  • php网站开发最新需求排名优化百度
  • 网站制作的电话智慧校园信息门户网站建设
  • 网站备案申请福田企业网站优化方案
  • 企业网站seo怎么做有空间站的国家