web – 虫虫之家 http://ijz.me 略懂技术 Sat, 01 Mar 2025 15:31:23 +0000 zh-Hans hourly 1 https://wordpress.org/?v=6.7.2 JavaScript代码整洁之道——好代码和坏代码 http://ijz.me/?p=1134 http://ijz.me/?p=1134#respond Thu, 23 May 2019 02:18:00 +0000 http://ijz.me/?p=1134

概述

我们之道作为一个码农,不论其实现如何,功能怎样,写的一手清晰靠谱的代码是其代码功力的体现。好的、清洁的代码可以方便自己以后维护,让你的继任者马上能接手维护它,而不是给你檫屁股,被人戳脊梁骨、被骂垃圾代码。所以,写清洁代码非常重要。

那么什么才是清洁代码的呢?不言而喻,清洁的代码就是可以让人易于人理解、易于更改、方便扩展的代码。写清洁的代码要常扪心自问:

为什么要这样写?

为什么要在这儿写?

为什么不换个写法?

Robert C. Martin在《代码整洁之道》一书中说过:

就算是的坏代码也能运行,但如果代码不干净,也能会让你的开发团队陷入困境。

在本文中,虫虫就给大家讲讲JavaScript代码的整洁知道,全面对比下好的代码和坏的代码的写法。

强类型检查,使用“===”,不用“==”

类型的检查非常重要,使用强类型检查可以帮我理清程序逻辑,如果类型检查松懈了(使用==),有可能使你的逻辑“南辕北撤了”,试看下面的例子:

所以从现在开始就强类型检查,“亡羊补牢,犹未晚也”!

const value = “520”;

if (value === 520) {

  console.log(value);

}

条件不会满足。

if (value === “520”) {

  console.log(value);

}

条件满足。

变量命名

变量的命名要有意义,而不是随意乱起。最好是“望文生义”,一看到变量名就知道是干嘛用的。

望文生义

坏代码:

let daysSLV= 10;

let y = new Date().getFullYear();

 


let ok;

if (user.age > 30) {

  ok = true;

}

好代码:

const MAX_AGE = 30;
let daysSinceLastVisit = 10;
let currentYear = new Date().getFullYear();
...
const isUserOlderThanAllowed = user.age > MAX_AGE;

不要给变量添加额外不需要的单词

坏代码:

let nameValue;
let theProduct;

好代码:

let name;

let product;

不要让我们需要从上下文中了解变量的意思

坏代码:

const ans = ["Chongchong", "maomaochong", "bollworm"];

ans.forEach(an => {

  doSomething();

  doSomethingElse();

  // ...

  // 等等,这个u是干嘛用的?

  register(an);

好代码:

const animals = ["Chongchong", "maomaochong", "bollworm"];

animals.forEach(animal => {

  doSomething();

  doSomethingElse();

  // ...

  // ...

  register(animal);

});

不添加多余的上下文

坏代码:

const user = {
  userName: "Chongchong",
  userNameAbb: "CC",
  userAge: "28"
};
...
user.userName;

 

好代码:

const user = {

Name: "Chongchong",
NameAbb: "CC",
  userAge: "28"
};

...
user.userName;

函数

使用长而具有描述性的函数名。

由于函数一般来说表示某种行为,函数名称应该是动词或短​​语,这样可以显示功能以及参数的意义。

坏代码:

function notif(user) {
  // 代码逻辑
}

好代码:

function notifyUser(emailAddress){

  //代码逻辑

}

避免使用大量参数。

理想情况下,函数应该指定两个或更少的参数。参数越少,函数单元测试就越容易。

坏代码:

function getUsers(fields, fromDate, toDate) {
  //代码逻辑

}

好代码:

function getUsers({ fields, fromDate, toDate }) {
  // 码逻辑
}

getUsers({
  fields: ['name', 'surname', 'email'],
  fromDate: '2019-05-22',
  toDate: '2019-05-31'
});

getUsers({

  字段:['name','surname','email'],

  fromDate:'2019-01-01',

  toDate:'2019-01-18'

});

 

使用默认参数,不用条件。

坏代码:

function createShape(type) {
  const shapeType = type || "circle";
  // ...
}

好代码:

function createShape(type = "circle") {
  // ...

}

一个函数做一件事。避免在单个函数中执行多个操作,多种逻辑

坏代码:

function notifyUsers(users) {
  users.forEach(user => {
    const userRecord = database.lookup(user);
    if (userRecord.isVerified()) {
      notify(user);
    }
  });
}

好代码:

function notifyVerifiedUsers(users) {
  users.filter(isUserVerified).forEach(notify);
}

function isUserVerified(user) {
  const userRecord = database.lookup(user);
  return userRecord.isVerified();
}

使用Object.assign配置默认对象

坏代码:

const shapeConfig = {
  type: "cube",
  width: 200,
  height: null

};

function createShape(config) {

  config.type = config.type || "cube";

  config.width = config.width || 250;

  config.height = config.width || 250;

}

createShape(shapeConfig);

function createShape(config){

  config.type = config.type || “立方体”;

  config.width = config.width || 250;

  config.height = config.width || 250;

}

createShape(shapeConfig);

好代码:

const shapeConfig = {

  type: "cube",

  width: 200

};

 

 

function createShape(config) {

  config = Object.assign(

    {

      type: "cube",

      width: 250,

      height: 250

    },

    config

  );

 

  ...

}

 

createShape(shapeConfig);

不要使用标志作为参数。

坏代码:

function createFile(name, isPublic) {

  if (isPublic) {

    fs.create(`./public/${name}`);

  } else {

    fs.create(name);

  }

}

好代码:

function createFile(name) {

  fs.create(name);

}

 

function createPublicFile(name) {

  createFile(`./public/${name}`);

}

不要让全局函数污染

如果需要扩展现有对象,请使用ES类和继承,不要在对象原型链上创建函数。

坏代码:

Array.prototype.myFunc = function myFunc() {

  // 代码逻辑

};

好代码:

class SuperArray extends Array {

  myFunc() {

    //代码逻辑

  }

}

条件

不要用负面条件

坏代码:

function isUserNotBlocked(user) {

  //代码逻辑

}

 

if (!isUserNotBlocked(user)) {

  //代码逻辑

}

好代码:

function isUserBlocked(user) {

  //代码逻辑

}

 

if (isUserBlocked(user)) {

  //代码逻辑

}

使用布尔变量直接判断,而不是条件语句

坏代码:

if (isValid === true) {

  //代码逻辑

}

 

if (isValid === false) {

  //代码逻辑

}

好代码:

if (isValid) {

  //代码逻辑

}

 

if (!isValid) {

  //代码逻辑

}

避免使用条件,用多态和继承。

坏代码:

class Car {

  // ...

  getMaximumSpeed() {

    switch (this.type) {

      case "Ford":

        return this.someFactor() + this.anotherFactor();

      case "Benz":

        return this.someFactor();

      case "BYD":

        return this.someFactor() - this.anotherFactor();

    }

  }

}

好代码:

class Car {

  // ...

}

 

class Ford extends Car {

  // ...

  getMaximumSpeed() {

    return this.someFactor() + this.anotherFactor();

  }

}

 

class Benz extends Car {

  // ...

  getMaximumSpeed() {

    return this.someFactor();

  }

}

 

class BYD extends Car {

  // ...

  getMaximumSpeed() {

    return this.someFactor() - this.anotherFactor();

  }

}

ES类

类是JavaScript中的新的语法糖。除了语法不同外,其他都和prototype一样工作。使用ES类可以让你的代码更加简洁清晰。

坏代码:

const Person = function(name) {

  if (!(this instanceof Person)) {

    throw new Error("Instantiate Person with `new` keyword");

  }

 

  this.name = name;

};

 

Person.prototype.sayHello = function sayHello() { /**/ };

 

const Student = function(name, school) {

  if (!(this instanceof Student)) {

    throw new Error("Instantiate Student with `new` keyword");

  }

 

  Person.call(this, name);

  this.school = school;

};

 

Student.prototype = Object.create(Person.prototype);

Student.prototype.constructor = Student;

Student.prototype.printSchoolName = function printSchoolName() { /**/ };

好代码:

class Person {

  constructor(name) {

    this.name = name;

  }

  sayHello() {

    /* ... */

  }

}

 

class Student extends Person {

  constructor(name, school) {

    super(name);

    this.school = school;

  }

  printSchoolName() {

    /* ... */

  }

}

使用方法链接

许多库如jQuery和Lodash都使用该模式。因此,该方法可以让的代码简洁。在主类中,只需在每个函数的末尾返回“this”,就可以将更多的类方法链接到该方法。

坏代码:

class Person {

  constructor(name) {

    this.name = name;

  }

 


  setSurname(surname) {

    this.surname = surname;

  }

 

  setAge(age) {

    this.age = age;

  }

 

  save() {

    console.log(this.name, this.surname, this.age);

  }

}

 

const person = new Person("Chongchong);

person.setSurname("CC");

person.setAge(29);

person.save();

好代码:

class Person {

  constructor(name) {

    this.name = name;

  }

  setSurname(surname) {

    this.surname = surname;

    return this;

  }

  setAge(age) {

    this.age = age;

    return this;

  }

  save() {

    console.log(this.name, this.surname, this.age);

    return this;

  }

}

const person = new Person("Chongchong")

    .setSurname("CC")

    .setAge(29)

.save();

其他

通常情况下,尽量不要写不要重复代码,不要写不使用的函数和死代码。

出于历史原因,可能会遇到重复的代码。例如,有两段你略有不同的低吗,但是又很多共同之处逻辑,为省事或者赶工期,导致你复制了大段代码,略做小改然后使用了。针对这种代码,后期一定要及早抽象出相同逻辑部分删除重复代码越早越好,不要欠死账,不然后越积越多就不好处理了。

关于死代码,码如其名。就是啥事不干,删了可能引入错误,这和上面的一样处理,及早处理,不用了就早处理,早删除。

结论

上面只是代码整洁的部分原理,而且个别条款也可能需要商榷。这些大部分理论来源于《代码整洁之道》这本书。有什么建议意见请回复,一起学习讨论。

]]> http://ijz.me/?feed=rss2&p=1134 0 是时候迁移到Java 11了,Java 7到11迁移实战  http://ijz.me/?p=1012 http://ijz.me/?p=1012#respond Tue, 07 Aug 2018 07:19:00 +0000 http://ijz.me/?p=1012

JDK 8将停止支持

Oracle JDK 8将于2019年1月(从现在起153天)停止发布公共更新,时间不多了,所以虫虫认为现在是最好的时机迁移到最新版JDK版本,享受新版本的各种黑魔法和新功能了。

另外,在虫虫以前的文章中也提到过,从JDK 11开始,其发布周期变为每6个月一个新版本,每3年发布一个新的LTS版本(下一个是JDK 11)。

值得一提的是,发布的公开使用的Oracle JDK将支持OpenJDK源代码进行编译而无需更改。

Java会收费吗?

ORACLE确保,不会对Java公共开放不会收费。所有Java/JDK开发基于OpenJDK版本库中完成,所有修复和增强功能都将推送到该开放库。

另外,三方公司也都有自己JRE实现,比如谷歌,Azul和RedHat等,以及IBM开源的Java/JDK实现OpenJ9:

向Java 11迁移

在Java 9,10和即将发布的Java 11 LTE,我们来着重介绍下如何迁移Java应用程序和模块及其可能存在的未解决的问题。虽然类似的文章问多,但是深入的太少,大多数文章都集中在简单的Hello World应用程序上。

本文我们将介绍个基于Spring Boot框架的应用程序为实例分步介绍迁移具体过程。选择这样做的示例应用程序是Spring PetClinic,一个使用WebMVC,Actuator,Cache,Data JPA,Thymeleaf和Test starters的Spring Boot 2示例应用程序。完全迁移到Java 11基本上有三个主要过程:

1.使用JDK 11运行现有Java应用程序。

2.使用Java 11编译应用程序。

3.模块化应用程序以使用模块系统。

如果你还没有准备好同时做这三件事,那请追随虫虫脚本开始。

JDK 11开发环境构建

首先,你需要为你的操作系统下载并安装JDK 11。

首先更新你喜欢的IDE以支持Java模块系统:

根据各自的IDE官网下载相应模块(地址略):

Eclipse IDE,IntelliJ IDEA,Apache NetBeans

1.使用JDK 11运行现有Java应用程序

为什么要从JDK 8升级到JDK 11?因为我们将能享受到以下这些的黑魔法:

JDK 11 黑魔法

继Java 8后最新LTS长期支持版本(如果你拥有商业许可证)。

完全支持Linux容器(包括Docker)。

支持G1上的并行完全垃圾收集。

免费应用程序类,数据共享功能。

免费的低耗能飞行记录仪和堆分析仪。

备用存储设备上的堆分配。

新的默认根权限证书集。

新的ZGC和Epsilon垃圾收集器。

Ahead-of-time编译和GraalVM。

最新的HTTPS安全协议TLS 1.3。

JShell。

支持“shebang”Java脚本文件!#!/bin/java

运行你的应用程序

这是一个非常简单的步骤,使用早期Java版本创建的应用程序都可以在JDK 11上运行而不会出现重大问题,除非你得依赖模块中包括JEP-320中从JDK中删除的Java EE或CORBA模块。

如果缺少类,你可能需要显式添加java.activation,java.transaction和java.xml.bind依赖项。在类文件错误的情况下,你将需要更新Java字节码增强库,如ASM,bytebuddy,javassist或cglib等。

2.使用Java 11编译应用程序

为什么要将源代码升级到Java 11?

局部变量类型推断(var关键字)。

新的本机不可修改集合API。

新的反应流API。

改进的流/谓词/可选API。

改进的系统过程API。

改进的文件API。

支持HTTP/2。

标准Java异步HTTP客户端。

多版本JAR。

详细步骤:

1.克隆Spring PetClinic存储库

git clone github:spring-projects/spring-petclinic.git

2.更新版本信息

打开pom.xml并更新java.version属性

<java.version>11</java.version>

<maven.compiler.source>${java.version}</maven.compiler.source>

<maven.compiler.target>${java.version}</maven.compiler.target>

3.删除cobertura-maven-plugin引用

因为它不支持JDK 11,而且也有年头不维护了。你可以使用支持较新JDK版本的JaCoCo。

4.更新javassist和mockito-core依赖项

<dependency>

    <groupId>org.javassist</groupId>

    <artifactId>javassist</artifactId>

    <version>3.23.1-GA</version>

</dependency>

<dependency>

    <groupId>org.mockito</groupId>

    <artifactId>mockito-core</artifactId>

    <version>2.20.0</version>

    <scope>test</scope>

</dependency>

5.包括mockito-core depende

<plugin>

<dependency>

    <groupId>org.mockito</groupId>

    <artifactId>mockito-core</artifactId>

    <version>2.20.0</version>

</dependency>

</plugin>

6.使用最新的asm依赖项将maven-compiler-plugin更新到3.7.0+版本

<plugin>

    <groupId>org.apache.maven.plugins</groupId>

    <artifactId>maven-compiler-plugin</artifactId>

    <version>3.7.0</version>

    <configuration>

        <release>${java.version}</release>

    </configuration>

    <dependencies>

        <dependency>

            <groupId>org.ow2.asm</groupId>

            <artifactId>asm</artifactId>

            <version>6.2</version>

        </dependency>

    </dependencies>

</plugin>

7.使用最新的asm依赖项将maven-surefire-plugin更新到2.21.0+版本

<plugin>

    <artifactId>maven-surefire-plugin</artifactId>

    <version>2.21.0</version>

    <dependencies>

        <dependency>

            <groupId>org.ow2.asm</groupId>

            <artifactId>asm</artifactId>

            <version>6.2</version>

        </dependency>

    </dependencies>

</plugin>

8.包含java.xml.bind模块依赖项,因为JEP-320在JDK 11中删除了这些模块

<dependency>

    <groupId>org.glassfish.jaxb</groupId>

    <artifactId>jaxb-runtime</artifactId>

    <version>2.4.0-b180608.0325</version>

</dependency>

9.在pom.xml中包含GlassFish JAXB存储库

<repositories>

    <repository>

        <id>jvnet-nexus-staging</id>

<url>http://maven.java.net/content/repositories/staging/</url>

        <layout>default</layout>

    </repository>

</repositories>

10.使用spring-boot-maven-plugin运行应用程序

./mvnw spring-boot:run

然后可以通过浏览器访问应用程序界面:localhost:8080

11.打包应用程序并运行测试

./mvnw clean package

12.使用打包的可执行jar运行应用程序

java -jar target/spring-petclinic-2.0.0.BUILD-SNAPSHOT.jar

现在,你可以使用Java 11编译和运行应用程序,但还没用到模块系统。

3.模块化应用程序以使用模块系统

为什么要迁移到模块系统?

配置更可靠:用程序组件声明显式依赖的方法来替换脆弱的,容易出错的类路径机制。

强封装:允许组件声明其中哪些公共类型可供其他组件访问,哪些不可访问。

为你的应用程序创建最小的JRE映像

•减少应用程序内存占用量。

•优化应用程序启动时间。

具体步骤如下:

1.创建模块文件module-info.java

在src/main/java目录中创建一个名为module-info.java的文件,其中包含以下内容:

module spring.petclinic {

}

现在,当你尝试编译应用程序时,你会看到如下所示很多错误告警:

Error:(19, 27) java: package org.springframework.boot is not visible

(package org.springframework.boot is declared in module spring.boot, but module spring.petclinic does not read it)

这表明应用程序已经表现为模块化布局,并且必须连接模块以进行编译和运行时。

你可以使用Maven依赖项插件解析目标列出当前在类路径中的所有模块名称,并将它们添加到module-info中:

./mvnw compile org.apache.maven.plugins:maven-dependency-plugin:3.1.1:resolve

注意:上面的命令不排除传递依赖项或包括JDK模块。

遗憾的是,由于许多原因,jdeps无法帮助你生成模块描述列表,但主要是因为第三方库尚未添加模块系统描述,它们被视为特殊的自动模块。

最终的模块描述符应如下所示:

open module spring.petclinic {

    requires cache.api;

    requires java.activation;

    requires java.instrument;

    requires java.persistence;

    requires java.sql;

    requires java.transaction;

    requires java.validation;

    requires java.xml.bind;

    requires org.hibernate.validator;

    requires spring.beans;

    requires spring.boot;

    requires spring.boot.autoconfigure;

    requires spring.context;

    requires spring.core;

    requires spring.data.commons;

    requires spring.data.jpa;

    requires spring.tx;

    requires spring.web;

    requires spring.webmvc;

    requires jdk.unsupported;

}

注意:由于Spring Framework和Hibernate JPA的反射要求,open关键字是必需的,jdk.unsupported是sun.misc.Unsafe的survivors。

2.构建并引入modules目录

引入maven-jar-plugin以创建应用程序jar(仅限类)并将其复制到modules目录。

<plugin>

    <artifactId>maven-jar-plugin</artifactId>

    <version>3.1.0</version>

    <configuration>

        <outputDirectory>

            ${project.build.directory}/modules

        </outputDirectory>

    </configuration>

</plugin>

3.引入maven-dependency-plugin以将运行时依赖项复制到模块目录。

<plugin>

    <groupId>org.apache.maven.plugins</groupId>

    <artifactId>maven-dependency-plugin</artifactId>

    <version>3.1.1</version>

    <executions>

        <execution>

            <phase>package</phase>

            <goals>

                <goal>copy-dependencies</goal>

            </goals>

            <configuration>

                <outputDirectory>

                    ${project.build.directory}/modules

                </outputDirectory>

                <includeScope>runtime</includeScope>

                <excludeArtifactIds>

                    spring-boot-devtools

                </excludeArtifactIds>

            </configuration>

        </execution>

    </executions>

</plugin>

注意:应该从模块中排除spring-boot-devtools依赖项。

4.包括java.persistence和java.transaction模块依赖项

它们修复了更新版本的自动模块问题:

<dependency>

    <groupId>org.hibernate.javax.persistence</groupId>

    <artifactId>hibernate-jpa-2.1-api</artifactId>

    <version>1.0.2.Final</version>

</dependency>

<dependency>

    <groupId>org.jboss.spec.javax.transaction</groupId>

    <artifactId>jboss-transaction-api_1.2_spec</artifactId>

    <version>1.1.1.Final</version>

</dependency>

同样增加javax.transaction依赖给 spring-boot-starter-data-jpa.

<exclusions>

    <exclusion>

        <artifactId>javax.transaction-api</artifactId>

        <groupId>javax.transaction</groupId>

    </exclusion>

</exclusions>

注意:当存在module-info.java并且启用了fork进程时,surefire会创建一个包含模块和未命名模块的混合类路径,从而导致模块可见性问题,这会阻止应用程序启动。

6.打包并测试应用程序

./mvnw clean package

7.使用Java模块系统运行应用程序

java –add-opens java.base/java.lang=spring.core,javassist \

–module-path target/modules \

–module spring.petclinic/org.springframework.samples.petclinic.PetClinicApplication

注意:由于Spring和Hibernate依赖项会有请求JDK反射访问,因此需要–add-opens。

8.设置main-class属性

使用以下命令设置模块main-class属性,删除使用module参数指定的主类:

jar –update \

    –file=target/modules/spring-petclinic-2.0.0.BUILD-SNAPSHOT.jar \

    –main-class=org.springframework.samples.petclinic.PetClinicApplication

9.为了自动执行上一步,你可以添加exec-maven-plugin:

<plugin>

    <groupId>org.codehaus.mojo</groupId>

    <artifactId>exec-maven-plugin</artifactId>

    <version>1.6.0</version>

    <executions>

        <execution>

            <id>module-main-class</id>

            <phase>package</phase>

            <goals>

                <goal>exec</goal>

            </goals>

            <configuration>

                <executable>jar</executable>

                <arguments>

                    <argument>

                        –update

                    </argument>

                    <argument>

                        –file=${project.build.directory}/modules/${project.build.finalName}.jar

                    </argument>

                    <argument>

                        –main-class=org.springframework.samples.petclinic.PetClinicApplication

                    </argument>

                    <argument>

                        –module-version=${project.version}

                    </argument>

                </arguments>

            </configuration>

        </execution>

    </executions>

</plugin>

10.现在你可以在没有显式主类声明的情况下运行应用程序:

./mvnw clean package

java –add-opens java.base/java.lang=spring.core,javassist \

–module-path=target/modules \

–module spring.petclinic

注意:由于MJAR-238,Maven还不支持开箱即用。

ok,整个迁移过程就完成。如果你对该文档和问题,请给虫虫留言,欢迎关注虫虫。

]]>
http://ijz.me/?feed=rss2&p=1012 0
关于Android WebView跨域访问(“应用克隆”)漏洞 http://ijz.me/?p=992 http://ijz.me/?p=992#respond Thu, 11 Jan 2018 09:46:00 +0000 http://ijz.me/?p=992

据腾讯玄武实验室研究,市面上 200 多款安卓应用中,27款 App 有此漏洞。漏洞列表及影响如下,其中18个可被远程攻击,9个只能从本地攻击。根据国家信息安全漏洞共享平台(cnvd)披露 ,截止到2018年1月9日,有11个 App 进行了修复,但其中3个修复存在缺陷。

攻击者利用该漏洞,可远程获取用户隐私数据(包括手机应用数据、照片、文档等敏感信息),还可窃取用户登录凭证,在受害者毫无察觉的情况下实现对App用户账户的完全控制。由于该组件广泛应用于安卓平台,导致大量App受影响,构成较为严重的攻击威胁。该“应用克隆”的移动攻击威胁模型是基于移动应用的一些基本设计特点导致的,所以几乎所有移动应用都适用该攻击模型。在这个攻击模型的视角下,很多以前认为威胁不大、厂商不重视的安全问题,都可以轻松“克隆”用户账户,窃取隐私信息,盗取账号及资金等。

漏洞描述

WebView是Android用于显示网页的控件,是一个基于Webkit引擎、展现Web页面、解析并执行JavaScript代码的控件,Android应用可以使用WebView空间,灵活的扩展自身的业务功能。

市面上大多数使用HTML5技术开发的应用均使用WebView进行HTML5页面的展示。除了从远程服务器加载Web页面,WebView还可以通过修改特定配置,从文件中进行HTML5页面的加载。在未正确配置WebView的情况下,会致使WebView同源策略失效,导致HTTP协议、file协议跨源攻击的发生。该漏洞使得WebView能够访问当前应用内部数据,如果WebView加载了来源不明的HTML文件,可能导致当前应用内部数据被攻击者窃取,如身份认证信息、加密密钥、用户隐私信息等。

漏洞分析

Android应用内部分可导出的Activity组件中,WebView允许通过file URL对http域进行访问,并且未对访问路径进行严格校验,由此导致了本次漏洞的出现。

该漏洞的产生条件:

(1)应用中存在设置为可被导出的Activity组件,并且组件中包含Webview调用。

(2)Webview调用中setAllowFileAccessFromFileURLs 或

setAllowUniversalAccessFromFileURLs 设置为true(minSdk<=4.1 默认为true,minSdk>4.1 默认为false)。

风险等级

高危

影响评估

漏洞影响使用WebView控件,开启file域访问且未按安全策略开发的安卓应用(App)。

解决方案

具备开发能力的企业,请按照如下检查步骤进行修复:

(1) 严格限制包含WebView调用的Activity组件的导出权限,关闭导出权限或者限制导出组件的发起者。

(2) 对于功能要求必须导出的Activity组件,手动设置

setAllowFileAccessFromFileURLs(false)或
setAllowUniversalAccessFromFileURLs(false)

(3) 对于必须使用file URL对http域进行访问时,可对传入的URL路径范围严格控制,例如建立URL白名单,设置允许访问的URL列表(不要遗漏路径中可能出现的特殊情况如“../../”等,避免限制被绕过)

]]>
http://ijz.me/?feed=rss2&p=992 0
/zz/修改浏览器的User-Agent来伪装你的浏览器和操作系统 http://ijz.me/?p=809 http://ijz.me/?p=809#respond Tue, 03 Nov 2015 00:18:28 +0000 http://ijz.me/?p=780

近期很多文章都提到了User-Agent (UA) 字符串,但大部分网友都不知道这个东西有什么用处。其实简单的说User-Agent就是客户端浏览器等应用程序使用的一种特殊的网络协议,在每次浏览器 (邮件客户端/搜索引擎蜘蛛)进行 HTTP 请求时发送到服务器,服务器就知道了用户是使用什么浏览器(邮件客户端/搜索引擎蜘蛛)来访问的。既然是人为规定的协议,那么就是说不管什么浏览器,默认

的UA都是可以更改的。

有时候为了达到一些不可告人的目的,我就经常需要更改一下UA的设置,比如伪装一下浏览器类型,比如把浏览器伪装成手机上网。

得到HTTP_USER_AGENT 的方法很简单,比如php代码:

<?php print_r($_SERVER);
?>
<?php print_r($_SERVER['HTTP_USER_AGENT']);
?>

这两种都可以得到User-Agents和IP等信息,最好配合正则表达式,对信息进行筛选剔除。

————– User-Agents列表————-

Internet Explorer 6
Internet Explorer 7
Internet Explorer 8
Firefox
Chrome
Safari
Netscape
Opera
Maxthon
360SE
OmniWeb

更多的User-Agents信息尽在useragents.xml

有了这个文件中的信息,什么样的浏览器和操作系系统都能伪装出来。

使用User-Agents的方法:

FireFox:[推荐使用User-Agent switcher 这个火狐扩展]
地址栏键入:about:config 回车
设置:general.useragent.override–>自定义的 UA 信息 。

Chrome
启动EXE图标属性中加上启动参数:–user-agent=”UA信息” 即可。

Safari
菜单栏->Edit->Preferences->Advanced->Show Develop menu in menu bar;
菜单栏->Develop->User-Agent->UA信息。

Maxthon
工具栏->工具->遨游设置中心->高级选项->自定义UA信息。

Opera
地址栏键入:opera:config 回车
设置:User-Agent->自定义ID 0—5
注: [0 Default 1 Opera 2 Mozilla, Opera detectable 3 Internet Explorer, Opera detectable 4 Mozilla, Opera hidden 5 Internet Explorer, Opera hidden ]

iPhone
替换 /System/Library/Frameworks/WebKit.framework/WebKit 这个文件的 Mozilla/5.0字符串 为自定义UA信息

IE浏览器的设置需要修改注册表

User-Agent在注册表的位置
[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionInternet SettingsUser-AgentPost Platform] 下,新建字符串值,内容留空,名字为你想在 User-Agent 中加入的字符,这里以 “motorolarokre2″为例。修改注册表对应的 REG 文件如下:
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionInternet SettingsUser-AgentPost Platform]
“motorolarokre2″=””

修改后重启IE浏览器即可。

IE的user-agent取值,下面是下列地址的组合+一些默认值
HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionInternet SettingsUser-AgentPost Platform
HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionInternet SettingsUser-AgentPost Platform
HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionInternet Settings5.0User-AgentPost Platform

IE8的User-Agents:

IE8 on Windows Vista (兼容浏览)
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/4.0)

IE8 on Windows Vista
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)

IE8 on Windows 7
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)

64-bit IE on 64-bit Windows 7:
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0)

32-bit IE on 64-bit Windows 7:
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0)

通过修改User-Agent,你还可以完美的伪装:操作系统、浏览器、蜘蛛、邮件客户端、链接检查、分析器、RSS 阅读器等客户端的信息。

]]>
http://ijz.me/?feed=rss2&p=809 0
tomcat 只监听一个端口 http://ijz.me/?p=759 http://ijz.me/?p=759#respond Tue, 18 Aug 2015 10:22:14 +0000 http://ijz.me/?p=759 tomcat默认会监听3个端口:

一个主端口,默认为8080
一个shutdown端口,默认8005
还有一个AJP1.3端口,默认8003

实际上后两个端口是非必须,尤其shutdown虽然默认是监听在127.0.0.1但是连接到这个端口,发送SHUTDOWN就可以无任何验证把tomcat关闭掉,有安全隐患的。
AJP端口用来在应用服务器交互时候用,比如apache链接tomcat等,一般也用不着,可以禁止掉。

这两个端口的禁止方法:

AJP端口,直接注释掉server.xml 文件的配置行就行。

<!--<Connector port="8005" maxThreads="*" 
enableLookups="false" redirectPort="*" protocol="AJP/1.3" />-->

shown端口是写在Server参数里的,直接去掉是不管用,也是会默认启动的,一般在安全设置时候建议把端口修改为其他端口,shutdown修改为其他复杂字串。实际上这个端口是可以直接屏蔽不监听的。设置时候将其port值修改为-1即可:

<Server port="-1" shutdown="SHUTDOWN">

]]>
http://ijz.me/?feed=rss2&p=759 0
解决网站由于使用谷歌字体导致访问慢 http://ijz.me/?p=662 http://ijz.me/?p=662#respond Sat, 20 Sep 2014 13:24:53 +0000 http://ijz.me/?p=662 由于防火墙禁止了谷歌,所以谷歌所有服务在天朝无法访问。由于wp默认的会使用谷歌字体服务,导致站点访问非常的缓慢,而好多站长都没有意识到这个问题(有很多解决方法和插件)。所以导致其站非常缓慢,解决方法只需要修改本机(网站用户)的hosts文件把谷歌字体网址解析到本地:

 

127.0.0.1 fonts.googleapis.com

]]>
http://ijz.me/?feed=rss2&p=662 0
/zz/网站生成静态页面攻略 — 防采集而不防搜索引擎策略 http://ijz.me/?p=14 http://ijz.me/?p=14#respond Fri, 29 Nov 2013 16:00:00 +0000 http://ijz.me/?p=14 从前面的我讲的采集原理大家可以看出,绝大多数采集程序都是靠分析规则来进行采集的,如分析分页文件名规则、分析页面代码规则。

一、分页文件名规则防采集对策

大部分采集器都是靠分析分页文件名规则,进行批量、多页采集的。如果别人找不出你的分页文件的文件名规则,那么别人就无法对你的网站进行批量多页采集。

实现方法:

我认为用MD5加密分页文件名是一个比较好的方法,说到这里,有人会说,你用MD5加密分页文件名,别人根据此规则也可以模拟你的加密规则得到你的分页文件名。

我要指出的是我们加密分页文件名时,不要只加密文件名变化的部分

如果I代表分页的页码,那么我们不要这样加密:page_name=Md5(I,16)&”.htm”

最好给要加密的页码上再跟进一个或多个字符,如:page_name=Md5(I&”任意一个或几个字母”,16)&”.htm”

因为MD5是无法反解密的,别人看到的会页字母是MD5加密后的结果,所以加人也无法知道你在 I 后面跟进的字母是什么,除非他用暴力****MD5,不过不太现实。

二、页面代码规则防采集对策

如果说我们的内容页面无代码规则,那么别人就无法从你的代码中提取他们所需要的一条条内容。所以我们要的这一步做到防采集,就要使代码无规则。

实现方法:

使对方需要提取的标记随机化

1、定制多个网页模板,每个网页模板里的重要HTML标记不同,呈现页面内容时,随机选取网页模板,有的页面用CSS+DIV布局,有的页面用table布局,此方法是麻烦了点,一个内容页面,要多做几个模板页面,不过防采集本身就是一件很烦琐的事情,多做一个模板,能起到防采集的作用,对很多人来说,都是值得的。
2、如果嫌上面的方法太麻烦,把网页里的重要HTML标记随机化,也可以。

做的网页模板越多,html代码越是随机化,对方分析起内容代码时,就越麻烦,对方针对你的网站专门写采集策略时,难度就更大,在这个时候,绝大部分人,都会知难而退,因为这此人就是因为懒,才会采集别人网站数据嘛~~~再说一下,目前大部分人都是拿别人开发的采集程序去采集数据,自己开发采集程序去采集数据的人毕竟是少数。

还有些简单的思路提供给大家:

1、把对数据采集者重要,而对搜索引擎不重要的内容用客户端脚本显示
2、把一页数据,分为N个页面显示,也是加大采集难度的方法
3、用更深层的连接,因为目前大部分采集程序只能采集到网站内容的前3层,如果内容所在的连接层更深,也可以避免被采集。不过这样可能会给客户造成浏览上的不便。如:

大多网站都是 首页—-内容索引分页—-内容页
如果改成:
首页—-内容索引分页—-内容页入口—-内容页
注:内容页入口最好能加上自动转入内容页的代码
<meta http-equiv=”refresh” post_content=”6;url=内容页(http://www.netlian.com)”>
其实,只要做好防采集的第一步(加密分页文件名规则),防采集的效果就已经不错了,还是建议两条反采集方法同时使用,给采集者增加采集难度,使得他们知难页退。

]]>
http://ijz.me/?feed=rss2&p=14 0
div+css 布局浏览器兼容 http://ijz.me/?p=28 http://ijz.me/?p=28#respond Fri, 29 Nov 2013 16:00:00 +0000 http://ijz.me/?p=28 最近做一个项目系统使用div+css来控制前台显示界面发现在各个浏览器下显示的效果由很大的出入,现在找一些关于div+css关于浏览器的一些资料做一个汇总,也算是对div+css知识的一个学习。

区别火狐和IE时最常用的是!important方法,对于其他不同浏览器和浏览器的不同版本的的兼容性问题还有下面一些方法,比如:@import,注释,属性选择符,子对象选择符voice-family等方法,这些方法在《css网站布局实录》中有讲述.

下面是IE和火狐的css兼容性问题

1.DOCTYPE 影响 CSS 处理

2.FF: div 设置 margin-left, margin-right 为 auto 时已经居中, IE 不行

3.FF: body 设置 text-align 时, div 需要设置 margin: auto(主要是 margin-left,margin-right) 方可居中

4.FF: 设置 padding 后, div 会增加 height 和 width, 但 IE 不会, 故需要用 !important 多设一个 height 和 width

5.FF: 支持 !important, IE 则忽略, 可用 !important 为 FF 特别设置样式,值得注意的是,一定要将xxxx !important 这句放置在另一句之上

6.div 的垂直居中问题: vertical-align:middle; 将行距增加到和整个DIV一样高 line-height:200px; 然后插入文字,就垂直居中了。缺点是要控制内容不要换行

7.cursor: pointer 可以同时在 IE FF 中显示游标手指状, hand 仅 I103fE 可以

8.FF: 链接加边框和背景色,需设置 display: block, 同时设置 float: left 保证不换行。参照 menubar, 给 a 和 menubar 设置高度是为了避免底边显示错位, 若不设 height, 可以在 menubar 中插入一个空格。

9.在mozilla firefox和IE中的BOX模型解释不一致导致相差2px解决方法:div{margin:30px!important;margin:28px;}
注意这两个margin的顺序一定不能写反,据阿捷的说法!important这个属性IE不能识别,但别的浏览器可以识别。所以在IE下其实解释成这样:div{maring:30px;margin:28px}
重复定义的话按照最后一个来执行,所以不可以只写margin:XXpx!important;

10.IE5 和IE6的BOX解释不一致
IE5下div{width:300px;margin:0 10px 0 10px;}
div的宽度会被解释为300px-10px(右填充)-10px(左填充)最终div的宽度为280px,而在IE6和其他浏览器上宽度则是以 300px+10px(右填充)+10px(左填充)=320px来计算的。这时我们可以做如下修改div{width:300px! important;width /**/:340px;margin:0 10px 0 10px}

关于这个/**/是什么我也不太明白,只知道IE5和firefox都支持但IE6不支持,如果有人理解的话,请告诉我一声,谢了!:)

11.ul标签在Mozilla中默认是有padding值的,而在IE中只有margin有值所以先定义ul{margin:0;padding:0;}
就能解决大部分问题
注意事项:

1、float的div一定要闭合。

例如:(其中floatA、floatB的属性已经设置为float:left;)<#div id=”floatA” >
<#div id=”floatB” >
<#div id=”NOTfloatC” >
这里的NOTfloatC并不希望继续平移,而是希望往下排。
这段代码在IE中毫无问题,问题出在FF。原因是NOTfloatC并非float标签,必须将float标签闭合。
在<#div class=”floatB”>
<#div class=”NOTfloatC”>
之间加上<#div class=”clear”>
这个div一定要注意声明位置,一定要放在最恰当的地方,而且必须与两个具有float属性的div同级,之间不能存在嵌套关系,否则会产生异常。
并且将clear这种样式定义为为如下即可:.clear{
clear:both;}

此外,为了让高度能自动适应,要在wrapper里面加上overflow:hidden;
当包含float的box的时候,高度自动适应在IE下无效,这时候应该触发IE的layout私有属性(万恶的IE啊!)用zoom:1;可以做到,这样就达到了兼容。
例如某一个wrapper如下定义:.colwrapper{
overflow:hidden;
zoom:1;
margin:5px auto;}

2、margin加倍的问题。

设置为float的div在ie下设置的margin会加倍。这是一个ie6都存在的bug。
解决方案是在这个div里面加上display:inline;
例如:
<#div id=”imfloat”>

相应的css为
#IamFloat{
float:left;
margin:5px;/*IE下理解为10px*/
display:inline;/*IE下再理解为5px*/}

3、关于容器的包涵关系

很多时候,尤其是容器内有平行布局,例如两、三个float的div时,宽度很容易出现问题。在IE中,外层的宽度会被内层更宽的div挤破。一定要用Photoshop或者Firework量取像素级的精度。

4、关于高度的问题

如果是动态地添加内容,高度最好不要定义。浏览器可以自动伸缩,然而如果是静态的内容,高度最好定好。(似乎有时候不会自动往下撑开,不知道具体怎么回事)

5、最狠的手段 – !important;

如果实在没有办法解决一些细节问题,可以用这个方法.FF对于”!important”会自动优先解析,然而IE则会忽略.如下.tabd1{
background:url(/res/images/up/tab1.gif) no-repeat 0px 0px !important; /*Style for FF*/
background:url(/res/images/up/tab1.gif) no-repeat 1px 0px; /* Style for IE */}
值得注意的是,一定要将xxxx !important 这句放置在另一103f句之上,上面已经提过

IE7.0出来了,对CSS的支持又有新问题。浏览器多了,网页兼容性更差了,疲于奔命的还是我们 ,为解决IE7.0的兼容问题,找来了下面这篇文章:

现在我大部分都是用!important来hack,对于ie6和firefox测试可以正常显示,但是ie7对!important可以正确解释,会导致页面没按要求显示!搜索了一下,找到一个针对IE7不错的hack方式就是使用“*+html”,现在用IE7浏览一下,应该没有问题了。

现在写一个CSS可以这样:
#example { color: #333; } /* Moz */
* html #example { color: #666; } /* IE6 */
*+html #example { color: #999; } /* IE7 */

那么在firefox下字体颜色显示为#333,IE6下字体颜色显示为#666,IE7下字体颜色显示为#999,他们都互不干扰。

  CSS对浏览器器的兼容性具有很高的价值,通常情况下IE和Firefox存在很大的解析差异,这里介绍一下兼容要点。

常见兼容问题:

1.DOCTYPE 影响 CSS 处理

2.FF: div 设置 margin-left, margin-right 为 auto 时已经居中, IE 不行

3.FF: body 设置 text-align 时, div 需要设置 margin: auto(主要是 margin-left,margin-right) 方可居中

4.FF: 设置 padding 后, div 会增加 height 和 width, 但 IE 不会, 故需要用 !important 多设一个 height 和 width

5.FF: 支持 !important, IE 则忽略, 可用 !important 为 FF 特别设置样式

6.div 的垂直居中问题: vertical-align:middle; 将行距增加到和整个DIV一样高 line-height:200px; 然后插入文字,就垂直居中了。缺点是要控制内容不要换行

7.cursor: pointer 可以同时在 IE FF 中显示游标手指状, hand 仅 IE 可以

8.FF: 链接加边框和背景色,需设置 display: block, 同时设置 float: left 保证不换行。参照 menubar, 给 a 和 menubar 设置高度是为了避免底边显示错位, 若不设 height, 可以在 menubar 中插入一个空格。

9.在mozilla firefox和IE中的BOX模型解释不一致导致相差2px解决方法:
div{margin:30px!important;margin:28px;}
注意这两个margin的顺序一定不能写反,据阿捷的说法!important这个属性IE不能识别,但别的浏览器可以识别。所以在IE下其实解释成这样:
div{maring:30px;margin:28px}
重复定义的话按照最后一个来执行,所以不可以只写margin:XXpx!important;

10.IE5 和IE6的BOX解释不一致
IE5下
div{width:300px;margin:0 10px 0 10px;}
div的宽度会被解释为300px-10px(右填充)-10px(左填充)最终div的宽度为280px,而在IE6和其他浏览器上宽度则是以300px+10px(右填充)+10px(左填充)=320px来计算的。这时我们可以做如下修改
div{width:300px!important;width /**/:340px;margin:0 10px 0 10px}
关于这个/**/是什么我也不太明白,只知道IE5和firefox都支持但IE6不支持,如果有人理解的话,请告诉我一声,谢了!:)

11.ul标签在Mozilla中默认是有padding值的,而在IE中只有margin有值所以先定义
ul{margin:0;padding:0;}
就能解决大部分问题

注意事项:

1、float的div一定要闭合。

例如:(其中floatA、floatB的属性已经设置为float:left;)
<#div id=”floatA” ></#div>
<#div id=”floatB” ></#div>
<#div id=”NOTfloatC” ></#div>
这里的NOTfloatC并不希望继续平移,而是希望往下排。
这段代码在IE中毫无问题,问题出103f在FF。原因是NOTfloatC并非float标签,必须将float标签闭合。

<#div class=”floatB”></#div>
<#div class=”NOTfloatC”></#div>
之间加上
<#div class=”clear”></#div>
这个div一定要注意声明位置,一定要放在最恰当的地方,而且必须与两个具有float属性的div同级,之间不能存在嵌套关系,否则会产生异常。
并且将clear这种样式定义为为如下即可:
.clear{
clear:both;}
此外,为了让高度能自动适应,要在wrapper里面加上overflow:hidden;
当包含float的box的时候,高度自动适应在IE下无效,这时候应该触发IE的layout私有属性(万恶的IE啊!)用zoom:1;可以做到,这样就达到了兼容。
例如某一个wrapper如下定义:
.colwrapper{
overflow:hidden;
zoom:1;
margin:5px auto;}

2、margin加倍的问题。

设置为float的div在ie下设置的margin会加倍。这是一个ie6都存在的bug。
解决方案是在这个div里面加上display:inline;
例如:
<#div id=”imfloat”></#div>

相应的css为
#IamFloat{
float:left;
margin:5px;/*IE下理解为10px*/
display:inline;/*IE下再理解为5px*/}

3、关于容器的包涵关系

很多时候,尤其是容器内有平行布局,例如两、三个float的div时,宽度很容易出现问题。在IE中,外层的宽度会被内层更宽的div挤破。一定要用Photoshop或者Firework量取像素级的精度。

4、关于高度的问题

如果是动态地添加内容,高度最好不要定义。浏览器可以自动伸缩,然而如果是静态的内容,高度最好定好。(似乎有时候不会自动往下撑开,不知道具体怎么回事)

5、最狠的手段 – !important;

如果实在没有办法解决一些细节问题,可以用这个方法.FF对于”!important”会自动优先解析,然而IE则会忽略.如下
.tabd1{
background:url(/res/images/up/tab1.gif) no-repeat 0px 0px !important; /*Style for FF*/
background:url(/res/images/up/tab1.gif) no-repeat 1px 0px; /* Style for IE */}

值得注意的是,一定要将xxxx !important 这句放置在另一句之上,上面已经提过
———————————————————————————————————————————
先温习一下对于IE的box-model的破解
IE box-model这个臭名昭著的bug存在于IE6/Win以前的每一只版本,这个虫子直到tantak发布了流传最为广泛的那个hack才开始被驯服

http://www.tantek.com/CSS/Examples/boxmodelhack.html

IE5.X/win对box-model的解析是一样的,他们认为width包括了边框(border)和补白(padding),幸运的是这个情况在IE6中有了好转
但是IE6在向后兼容的同时也包容了以前的错误,IE6其实有两个核心,在旧的页面前他仍旧表现出对错误的宽容,只有在文档中严格地加上文档类型(DOCTYPE)声明,IE6才能够接受正确的box-model
所以,tantak的hack必须和正确的DOCTYPE同时包含在文档中才能够正常工作
Quote
div.post_content {
width:400px; //这个是错误的width,所有浏览器都读到了
voice-family: “”}””; //IE5.X/win忽略了””}””后的内容
voice-family:inherit;
width:300px; //包括IE6/win在内的部分浏览器读到这句,新的数值(300px)覆盖掉了旧的
}
html>body .post_content { //html>body是CSS2的写法
width:300px; //支持CSS2该写法的浏览器有幸读到了这一句
}
现在回到主题,我们经常看到!important和(空格)/**/:组合在一起使用,这个写法

]]>
http://ijz.me/?feed=rss2&p=28 0
Web 流量分析工具/zz/ http://ijz.me/?p=78 http://ijz.me/?p=78#respond Fri, 29 Nov 2013 16:00:00 +0000 http://ijz.me/?p=78 Web 流量分析工具多不胜数,从 WebTrends 这样专业而昂贵的,到 Google Analytics 这样强大而免费的,从需要在服务器端单独部署的,到可以从前端集成的,不一而足。本 文收集并介绍了10个功能强大的开源 Web 流量分析工具,因为是开源的,因此可以免费部署到你的网站。

TraceWatch

TraceWatch 是一个开源 Web 流量分析程序,支持实时分析,可以提供深度分析报告。

SlimStat

基于 PHP-MySQL,同时,可以像 Google Analytics 那样,通过 JavaScript 或 PHP 脚本集成到网站。

Piwik


可以生成站点的详细的实时访问报告,基于 PHP 和 MySQL,也可以像 Google Analytics 那样在前端集成。

Open Web Analytics

基于 PHP,内置对 WordPress,Gallery 以及 MediaWiki 的支持。

W3Perl

W3Perl 是一个 Web Log 分析工具。

CrawlTrack

CrawTrack 是一个很好的 Google Analytics 的开源替用品,提供非常独特的报告,比如,CrawTrack 可以帮你预防诸如 SQL 注射一类的攻击。

BBClone

BBClone 是一个 Web 计数器,可以提供很详细的访问报告。基于 PHP。

PhpMyVisites


基于 GNU/GPL 开源协议,可以提供很详细的,有关访问者信息的报告,它的 GUI 界面很有趣而且实用,安装也很简单。

AWStats

可以提供非常强大的,关于网站,FTP 站点,乃至 Email 服务器的访问分析报告,基于 CGI。

Grape

Grape 的界面比较简单,功能虽然不多,但很实用。

]]>
http://ijz.me/?feed=rss2&p=78 0
web网页编辑器大全:比较编辑器 http://ijz.me/?p=80 http://ijz.me/?p=80#respond Fri, 29 Nov 2013 16:00:00 +0000 http://ijz.me/?p=80 ①Text Editor — 用flash作的,比較特別
②TinyMCE    — 免費的編輯器,支援多種瀏覽器
③FCKeditor   — 免費的編輯器,支援多種瀏覽器

配置文件 http://soft.yesky.com/lesson/148/2623648.shtmlhttp://homepage.yesky.com/152/2615652.shtml
④htmlArea      — 与FCKeditor 比较
FCKeditor的功能很多,只是…載入時比較慢,有時候要reload才會出現,
htmlArea的功能比較精簡,所以載入上比FCKeditor快多了,
不過FCKeditor有清除word標籤的功能

⑤CuteEditor — 博客园用的就是这个
URL:[破解版:http://files.cnblogs.com/minsky/CuteEditor_for_NET4.5_Crack%20by%20Minsky.part1.rar]
[URL http://files.cnblogs.com/minsky/CuteEditor_for_NET4.5_Crack%20by%20Minsky.part2.rar]
[企业许可证:http://doublew.cnblogs.com/Files/doublew/cel.zip]
⑥FreeTextBox
URL: [ http://www.percyboy.com/w/ftb/down/FTB_1.6.3_zh.zip]
[源码:http://www.percyboy.com/w/ftb/down/FTB_1.6.3_zh_Source.zip]
⑦eWebEditor –完全开放源代码的,允许无商业目的个人用户免费使用
=============================================================================
1.FCKeditor 编辑器

FCKeditor is compatible with most internet browsers which include: IE 5.5+ (Windows), Firefox 1.0+, Mozilla 1.3+ and Netscape 7+.

最新版本:FCKeditor 2.0

语言环境:多国语言

特性功能:所见所得,支持平台众多,支持XHTML 1.0,文本格式设置,常见的编辑,复制,粘贴,撤销,文件上传等功能

授权方式:Open Source & Free

官方地址:http://www.fckeditor.net/

下载地址:http://www.fckeditor.net/download/default.html

演示:http://www.fckeditor.net/demo/default.html

小节:FCKeditor的2.0版比1.6版有了许多的改进。首先是FCKeditor的文件结构更加清晰,

可以更方便地将其部署在自己的系统中。另外2.0版开始支持了Firefox浏览器

2.WebEditor

WebEditor系列文档控件,采用了ESS专业电子签名和电子盖章的技术,除继续支持手写签名,电子印章,痕迹保留外,该版本采用了我们强大的B/S通讯技术,能够自由的将服务器数据库。

最新版本:WebEditor[V4.3.0.0 OCX版]

语言环境:简体中文

技术特性:

采用IE5.0以上版本内置的传输协议,通讯性能稳定,高效。

采用标准HTTP通讯端口80,使用方便,无需特别配置、安全性好、更无需特别设置防火墙。

采用插件技术,可以完全融入IE浏览器中,方便系统维护、方便用户操作。

采用自定义协议包进行数据的组装和分析,系统开放性好,便于二次开发。

采用了Com组件和JavaBean组件技术,很好的实现了跨平台系统,便于开发。

官方地址:http://www.dragongod.com/

演示:http://www.dragongod.com/WebEditor/Demo.asp

下载:http://www.dragongod.com/download/index.asp#item1

小节:这个编辑器很具有中国特色的,但必须支持安装WebEditor插件,才能正常运行

对于很多用户来说,这个是无法接收的.

3.InnovaStudio WYSIWYG Editor

在线编辑器WYSIWYG 英文:What You See Is What You Get(所见所得)

一款基于web的WYSIWYG(所见即所得)的HTML编辑器,支持ASP, PHP, ASP.NET

最新版本:InnovaStudio WYSIWYG Editor version 2.9

功能特性:快速加载,融合所有的HTML标签,全屏编辑模式,所见所得预览,拼写检查.

特有的嵌入式WEB编辑.

官方:http://www.innovastudio.com/

演示:http://www.innovastudio.com/editor_tutorial.asp

下载:官方好像都是收费的,,自己去网上搜索找找,好像有人已经做过有2.0的汉化版

小节:采用DHTML, JavaScript 构件的WYSIWYG也有很多不足之处,由于代码放在远程服务器,

一些控件事先没有下载到客户端,使得一些操作速度变慢,那些加入了ActiveX 控件的更慢,

另外它无法在网页里直接调用CSS,所以在操作框里的界面效果和尺寸和实际上的界面有差距。

有很多WYSIWYG对各种浏览器还不兼容,而且有的也要在IE的高版本下才能正常运行(此段出自老鬼的blog).

4.eWebEditor在线编辑器

eWebEditor是基于网页的、所见即所得的在线HTML编辑器。她能够在网页上实现许多桌面编辑软件

(如:Word)所具有的强大可视编辑功能;她是一个真正的绿色软件,不需要在计算机上安装

任何的客户端软件;她的易用使得WEB开发人员只要一行代码即可完成调用。

最新版本:Version 3.6 (ASP版、PHP版、JSP版、ASP.NET版)

 

]]>
http://ijz.me/?feed=rss2&p=80 0