当今就业寒冬、市场紧缩的情况下,互联网IT人才任然保持着高需求。
导致不少同学想转行IT,借助互联网这波热潮早日走上人生巅峰! 之前有不少同学问过我:老师,我对写代码实在没有兴趣,整天面对电脑很无聊,除了做开发,还有其他的相关岗位可以从事吗? 不管你是想转行IT,还是对写代码没有兴趣,IT行业除了敲代码,还有其他高薪岗位吗?答案是有的!1软件测试 岗位要求:软件测试这一职业特性在于耐心、细致、逆向、设问、怀疑、举证、韧性、安静。
不要求独立编写代码,但要能看懂项目代码,具备简单的项目调试、检测能力。
找出开发过程中出现的BUG,并能编写一些项目测试文档,相当于半技半文职的岗位。
岗位分析:软件测试很适合女生做,工作强度没有程序员大,大部分测试人员在项目上线之前会比较忙。
很多程序员过了35岁,到了“退休”的年龄,也会考虑软件测试。
对技术要求不会很高,但是多少得懂点。
2运维 岗位要求:运维和开发是两个截然不同的方向。
在软件产品的整个生命周期中运维工程师都需要适时地参与并发挥不同的作用,因此运维工程师的工作内容和方向非常多。
主要工作在于负责服务器的配置、维护、监控、调优、排除故障等,确保相关的IT设备能够正常的工作,保证各项相关的业务有序的运行。
岗位分析:运维对技术要求也不高。
需要懂 *** 作系统(比如Linux),掌握常用命令并且通过这些命令配置服务器、安装环境。
3销售岗位要求:销售存在于各行各业,需要具备较强的责任感、信息搜寻能力、人际洞察能力、学习能力、人际交往能力。
对各种编程软件和工具要有了解,对IT行业有独到的见解。
岗位分析:在这几种岗位中,销售的门槛最低,对学历和技术要求也是最低。
但是销售面临的挑战和压力也比其他几种岗位大的多。
销售的收入往往和业绩相关,如果你不具备销售天赋、销售能力一般,那还是建议选择其他岗位,起码收入比较稳定。
4技术支持 岗位要求:技术支持分售前技术支持和售后技术支持,售前技术支持是指在销售遇到无法解答的产品问题时,售前技术支持给予帮助;售后技术支持是指产品公司为其产品用户提供的售后服务的一种形式,帮助用户诊断并解决其在使用产品过程中出现的有明显症状的、可能由产品导致的技术问题。
技术支持需要对技术有所了解,起码在产品出问题的时候能解决掉。
有时候技术支持还需要具备文档编写能力,协助编制文件的技术部分。
岗位分析:技术支持比较适合刚毕业的同学,而且最好是男生,因为这个岗位避免不了出差。
对于刚毕业的同学来说,出差是一件很兴奋的事情,可以免费“旅游”。
但是长期这样的生活可能你会接受不了。
技术支持是很多计算机相关专业同学的选择,需要懂点技术、又不需要很精通,而且又有出差补贴,多好的差事。
尤其是国际技术支持,补贴更是非常的诱人(越是条件苛刻的地方补贴越高)。
5运营岗位要求:运营和销售不一样,销售的重点是把东西卖出去,但是运营是让用户知道东西的存在。
运营专员需要有创新意识,了解互联网的各类产品,有一定的文案撰写能力,能独立完成对特定客户群的个性化运营文案的撰写。
岗位分析:运营是一个新兴的岗位,也是互联网的产物。
很多同学没有明白运营是什么。
说白了,就是让用户知道你们产品的存在,可以简单点理解成宣传。
那么这就避免不了写文章、策划活动。
所以如果你愿意挑战新鲜事物、有个性、有创意,那么完全可以尝试。
当然除了软件测试、运维和IT营销这些岗位,不用敲代码的还有实施,UI等。
IT行业做到一定经验,更可以根据自身的特点转做管理和产品经理等。
6进阶:项目经理 岗位要求:项目管理可以说是更为便捷的发展之路。
目前,软件项目经理是人才市场上炙手可热的人才,有丰富经验、外语好的软件项目经理是抢手的香饽饽,供不应求,薪水自然也是水涨船高。
对有经验、有技术、有人脉、有能力、参与过多个软件开发、有一定经验的人,项目管理无疑是发展的一个很好的方向。
岗位分析:项目经理往往对个人项目经验有一定的要求,所以各位刚毕业的同学暂时不用考虑。
如果你的情商不错、管理能力不错,积累几年项目经验,完全可以把它当作后面的发展方向。
7进阶:产品经理 岗位要求:很多人都是不怎么了解产品经理,不知道产品经理究竟是干什么的。
产品经理就是产品的设计者和管理者,负责定义、设计产品、组织、协调团队进行产品相关工作,是产品的直接负责人,也是产品团队的leader。
产品经理本来就是一个需要在各个知识领域都“雨露均沾”的角色,其中当然也包括技术,有一定技术背景的优势在于和开发团队更好的沟通。
产品经理在互联网行业中是一个新兴起的行业,并且每年它的工资都呈现向上发展的趋势。
可想而知,产品经理的工资收入相当可观。
产品经理是团队的领头羊,所以产品经理直接影响到公司的发展前景。
其中比较知名的产品经理有苹果教主乔布斯、腾讯公司高级副总裁张小龙等。
岗位分析:产品经理也是很多计算机相关专业同学未来的发展方向。
这个岗位对个人的综合能力要求比较高,需要长时间的积累。
对互联网有深入了解、对用户和市场有深入理解、懂技术、沟通能力强以上这些都是耳熟能详的职位名称。
如果你正在参加秋招,肯定还会遇到“解决方案方案工程师”、“交付工程师”、“体验设计师”、“营销管培生”等等,这些职位又该怎么理解? 8解决方案工程师 这不是一个市面上都接受的职称,也很少公司有这种的工程师职称。
目前能见到的,也都是华为、中兴、海康这类的公司。
解决方案工程师就是能够根据客户的笼统需求定义,找出一个以最低成本、最快速度把产品做出的软硬件系统解决方案。
作为解决方案工程师至少要有比较强的沟通能力,能很好的理解客户的需求点和意思,正确表达自己的想法,才能高效解决他们的问题。
第二点就是积累经验,既然是解决方案工程师至少要对不同行业的需求和风向、技术有非常敏锐的嗅觉。
9交付工程师交付工程师有些公司也叫实施工程师,实施工程师就非常常见了。
产品销售出去后,大部分客户都不知道如何使用,如何部署、如何配置、如何初始化。
这些事情都需要乙方公司派人去解决,于是就诞生了实施工程师这个岗位。
实施就是去“结合每个客户的实际情况,使产品更加贴合客户需求,更加符合客户要求的去运作”的岗位。
这个岗位要求,对于管理要懂一些,对于技术要懂一些,对于销售要懂一些,对于实际工作场景要懂一些。
这是一个要求比较全面的岗位,因此薪资水平差距非常大,有年入不到10万的,有年入几十万的,当然也有年入百万的。
10体验设计师 提供“体验设计师”岗位的公司少之又少,比如腾讯。
移动互联网的发展,人类生活的核心领域:教育、健康、商业活动和娱乐等等都离不开各种APP,而体验设计师在这其中充当的角色就是先于用户,把APP的UI界面,各项功能以及 *** 作逻辑设计优化的更加“人性”,符合人体工学和日常使用习惯,把Usability易用性、Beautiful美观、Pleasurable愉悦渗入到每个细节,让你不再有“这是什么反人类设计”的灵魂拷问。
想要进入IT行业,不一定非得精通写代码!每个人都有自己的长处,找工作之前首先要学会分析自己,并不是只有写代码才最有前途!如果你擅长销售、精通运营,没必要逼自己去写代码。
在本文中,我们讨论了对付 13 种不同静态暴露的技巧。对于每种暴露,我们解释了不处理这些安全性问题所造成的影响。我们还为您推荐了一些准则,要开发不受这些静态安全性暴露威胁的、健壮且安全的 Java 应用程序,您应该遵循这些准则。一有合适的时机,我们就提供代码样本(既有暴露的代码也有无暴露的代码)。
对付高严重性暴露的技巧
请遵循下列建议以避免高严重性静态安全性暴露:
限制对变量的访问
让每个类和方法都成为 final,除非有足够的理由不这样做
不要依赖包作用域
使类不可克隆
使类不可序列化
使类不可逆序列化
避免硬编码敏感数据
查找恶意代码
限制对变量的访问
如果将变量声明为 public,那么外部代码就可以 *** 作该变量。这可能会导致安全性暴露。
影响
如果实例变量为 public,那么就可以在类实例上直接访问和 *** 作该实例变量。将实例变量声明为 protected 并不一定能解决这一问题:虽然不可能直接在类实例基础上访问这样的变量,但仍然可以从派生类访问这个变量。
清单 1 演示了带有 public 变量的代码,因为变量为 public 的,所以它暴露了。
清单 1 带有 public 变量的代码
class Test {
public int id;
protected String name;
Test(){
id = 1;
name = "hello world";
}
//code
}
public class MyClass extends Test{
public void methodIllegalSet(String name){
thisname = name; // this should not be allowed
}
public static void main(String[] args){
Test obj = new Test();
objid = 123; // this should not be allowed
MyClass mc = new MyClass();
mcmethodIllegalSet("Illegal Set Value");
}
}
建议
一般来说,应该使用取值方法而不是 public 变量。按照具体问题具体对待的原则,在确定哪些变量特别重要因而应该声明为 private 时,请将编码的方便程度及成本同安全性需要加以比较。清单 2 演示了以下列方式来使之安全的代码:
清单 2 不带有 public 变量的代码
class Test {
private int id;
private String name;
Test(){
id = 1;
name = "hello world";
}
public void setId(int id){
thisid = id;
}
public void setName(String name){
thisname = name;
}
public int getId(){
return id;
}
public String getName(){
return name;
}
}
让每个类和方法都为 final
不允许扩展的类和方法应该声明为 final。这样做防止了系统外的代码扩展类并修改类的行为。
影响
仅仅将类声明为非 public 并不能防止攻击者扩展类,因为仍然可以从它自己的包内访问该类。
建议
让每个类和方法都成为 final,除非有足够的理由不这样做。按此建议,我们要求您放弃可扩展性,虽然它是使用诸如 Java 语言之类的面向对象语言的主要优点之一。在试图提供安全性时,可扩展性却成了您的敌人;可扩展性只会为攻击者提供更多给您带来麻烦的方法。
不要依赖包作用域
没有显式地标注为 public、private 或 protected 的类、方法和变量在它们自己的包内是可访问的。
影响
如果 Java 包不是封闭的,那么攻击者就可以向包内引入新类并使用该新类来访问您想保护的内容。诸如 javalang 之类的一些包缺省是封闭的,一些 JVM 也让您封闭自己的包。然而,您最好假定包是不封闭的。
建议
从软件工程观点来看,包作用域具有重要意义,因为它可以阻止对您想隐藏的内容进行偶然的、无意中的访问。但不要依靠它来获取安全性。应该将类、方法和变量显式标注为 public、private 或 protected 中适合您特定需求的那种。
使类不可克隆
克隆允许绕过构造器而轻易地复制类实例。
影响
即使您没有有意使类可克隆,外部源仍然可以定义您的类的子类,并使该子类实现 javalangCloneable。这就让攻击者创建了您的类的新实例。拷贝现有对象的内存映象生成了新的实例;虽然这样做有时候是生成新对象的可接受方法,但是大多数时候是不可接受的。清单 3 说明了因为可克隆而暴露的代码:
清单 3 可克隆代码
class MyClass{
private int id;
private String name;
public MyClass(){
id=1;
name="HaryPorter";
}
public MyClass(int id,String name){
thisid=id;
thisname=name;
}
public void display(){
Systemoutprintln("Id ="+id+"
"+"Name="+name);
}
}
// hackers code to clone the user class
public class Hacker extends MyClass implements Cloneable {
public static void main(String[] args){
Hacker hack=new Hacker();
try{
MyClass o=(MyClass)hackclone();
odisplay();
}
catch(CloneNotSupportedException e){
eprintStackTrace();
}
}
}
建议
要防止类被克隆,可以将清单 4 中所示的方法添加到您的类中:
清单 4 使您的代码不可克隆
public final Object clone()
throws javalangCloneNotSupportedException{
throw new javalangCloneNotSupportedException();
}
如果想让您的类可克隆并且您已经考虑了这一选择的后果,那么您仍然可以保护您的类。要做到这一点,请在您的类中定义一个为 final 的克隆方法,并让它依赖于您的一个超类中的一个非 final 克隆方法,如清单 5 中所示:
清单 5 以安全的方式使您的代码可克隆
public final Object clone()
throws javalangCloneNotSupportedException {
superclone();
}
类中出现 clone() 方法防止攻击者重新定义您的 clone 方法。
使类不可序列化
序列化允许将类实例中的数据保存在外部文件中。闯入代码可以克隆或复制实例,然后对它进行序列化。
影响
序列化是令人担忧的,因为它允许外部源获取对您的对象的内部状态的控制。这一外部源可以将您的对象之一序列化成攻击者随后可以读取的字节数组,这使得攻击者可以完全审查您的对象的内部状态,包括您标记为 private 的任何字段。它也允许攻击者访问您引用的任何对象的内部状态。
建议
要防止类中的对象被序列化,请在类中定义清单 6 中的 writeObject() 方法:
清单 6 防止对象序列化
private final void writeObject(ObjectOutputStream out)
throws javaioNotSerializableException {
throw new javaioNotSerializableException("This object cannot
be serialized");
}
通过将 writeObject() 方法声明为 final,防止了攻击者覆盖该方法。
使类不可逆序列化
通过使用逆序列化,攻击者可以用外部数据或字节流来实例化类。
影响
不管类是否可以序列化,都可以对它进行逆序列化。外部源可以创建逆序列化成类实例的字节序列。这种可能为您带来了大量风险,因为您不能控制逆序列化对象的状态。请将逆序列化作为您的对象的另一种公共构造器 — 一种您无法控制的构造器。
建议
要防止对对象的逆序列化,应该在您的类中定义清单 7 中的 readObject() 方法:
清单 7 防止对象逆序列化
private final void readObject(ObjectInputStream in)
throws javaioNotSerializableException {
throw new javaioNotSerializableException("This object cannot
be deserialized");
}
通过将该方法声明为 final,防止了攻击者覆盖该方法。
避免硬编码敏感数据
您可能会尝试将诸如加密密钥之类的秘密存放在您的应用程序或库的代码。对于你们开发人员来说,这样做通常会把事情变得更简单。
影响
任何运行您的代码的人都可以完全访问以这种方法存储的秘密。没有什么东西可以防止心怀叵测的程序员或虚拟机窥探您的代码并了解其秘密。
建议
可以以一种只可被您解密的方式将秘密存储在您代码中。在这种情形下,秘密只在于您的代码所使用的算法。这样做没有多大坏处,但不要洋洋得意,认为这样做提供了牢固的保护。您可以遮掩您的源代码或字节码 — 也就是,以一种为了解密必须知道加密格式的方法对源代码或字节码进行加密 — 但攻击者极有可能能够推断出加密格式,对遮掩的代码进行逆向工程从而揭露其秘密。
这一问题的一种可能解决方案是:将敏感数据保存在属性文件中,无论什么时候需要这些数据,都可以从该文件读取。如果数据极其敏感,那么在访问属性文件时,您的应用程序应该使用一些加密/解密技术。
查找恶意代码
从事某个项目的某个心怀叵测的开发人员可能故意引入易受攻击的代码,打算日后利用它。这样的代码在初始化时可能会启动一个后台进程,该进程可以为闯入者开后门。它也可以更改一些敏感数据。
这样的恶意代码有三类:
类中的 main 方法
定义过且未使用的方法
注释中的死代码
影响
入口点程序可能很危险而且有恶意。通常,Java 开发人员往往在其类中编写 main() 方法,这有助于测试单个类的功能。当类从测试转移到生产环境时,带有 main() 方法的类就成为了对应用程序的潜在威胁,因为闯入者将它们用作入口点。
请检查代码中是否有未使用的方法出现。这些方法在测试期间将会通过所有的安全检查,因为在代码中不调用它们 — 但它们可能含有硬编码在它们内部的敏感数据(虽然是测试数据)。引入一小段代码的攻击者随后可能调用这样的方法。
避免最终应用程序中的死代码(注释内的代码)。如果闯入者去掉了对这样的代码的注释,那么代码可能会影响系统的功能性。
可以在清单 8 中看到所有三种类型的恶意代码的示例:
清单 8 潜在恶意的 Java 代码
public void unusedMethod(){
// code written to harm the system
}
public void usedMethod(){
//unusedMethod(); //code in comment put with bad intentions,
//might affect the system if uncommented
// int x = 100;
// x=x+10; //Code in comment, might affect the
//functionality of the system if uncommented
}
建议
应该将(除启动应用程序的 main() 方法之外的)main() 方法、未使用的方法以及死代码从应用程序代码中除去。在软件交付使用之前,主要开发人员应该对敏感应用程序进行一次全面的代码评审。应该使用“Stub”或“dummy”类代替 main() 方法以测试应用程序的功能。
对付中等严重性暴露的技巧
请遵循下列建议以避免中等严重性静态安全性暴露:
不要依赖初始化
不要通过名称来比较类
不要使用内部类
不要依赖初始化
您可以不运行构造器而分配对象。这些对象使用起来不安全,因为它们不是通过构造器初始化的。
影响
在初始化时验证对象确保了数据的完整性。
例如,请想象为客户创建新帐户的 Account 对象。只有在 Account 期初余额大于 0 时,才可以开设新帐户。可以在构造器里执行这样的验证。有些人未执行构造器而创建 Account 对象,他可能创建了一个具有一些负值的新帐户,这样会使系统不一致,容易受到进一步的干预。
建议
在使用对象之前,请检查对象的初始化过程。要做到这一点,每个类都应该有一个在构造器中设置的私有布尔标志,如清单 9 中的类所示。在每个非 static 方法中,代码在任何进一步执行之前都应该检查该标志的值。如果该标志的值为 true,那么控制应该进一步继续;否则,控制应该抛出一个例外并停止执行。那些从构造器调用的方法将不会检查初始化的变量,因为在调用方法时没有设置标志。因为这些方法并不检查标志,所以应该将它们声明为 private 以防止用户直接访问它们。
清单 9 使用布尔标志以检查初始化过程
public class MyClass{
private boolean initialized = false;
//Other variables
public MyClass (){
//variable initialization
method1();
initialized = true;
}
private void method1(){ //no need to check for initialization variable
//code
}
public void method2(){
try{
if(initialized==true){
//proceed with the business logic
}
else{
throw new Exception("Illegal State Of the object");
}
}catch(Exception e){
eprintStackTrace();
}
}
}
如果对象由逆序列化进行初始化,那么上面讨论的验证机制将难以奏效,因为在该过程中并不调用构造器。在这种情况下,类应该实现 ObjectInputValidation 接口:
清单 10 实现 ObjectInputValidation
interface javaioObjectInputValidation {
public void validateObject() throws InvalidObjectException;
}
所有验证都应该在 validateObject() 方法中执行。对象还必须调用 ObjectInputStreamRegisterValidation() 方法以为逆序列化对象之后的验证进行注册。 RegisterValidation() 的第一个参数是实现 validateObject() 的对象,通常是对对象自身的引用。注:任何实现 validateObject() 的对象都可能充当对象验证器,但对象通常验证它自己对其它对象的引用。RegisterValidation() 的第二个参数是一个确定回调顺序的整数优先级,优先级数字大的比优先级数字小的先回调。同一优先级内的回调顺序则不确定。
当对象已逆序列化时,ObjectInputStream 按照从高到低的优先级顺序调用每个已注册对象上的 validateObject()。
不要通过名称来比较类
有时候,您可能需要比较两个对象的类,以确定它们是否相同;或者,您可能想看看某个对象是否是某个特定类的实例。因为 JVM 可能包括多个具有相同名称的类(具有相同名称但却在不同包内的类),所以您不应该根据名称来比较类。
影响
如果根据名称来比较类,您可能无意中将您不希望授予别人的权利授予了闯入者的类,因为闯入者可以定义与您的类同名的类。
例如,请假设您想确定某个对象是否是类 combarFoo 的实例。清单 11 演示了完成这一任务的错误方法:
清单 11 比较类的错误方法
if(objgetClass()getName()equals("Foo")) // Wrong!
// objects class is named Foo
}else{
// object's class has some other name
}
建议
在那些非得根据名称来比较类的情况下,您必须格外小心,必须确保使用了当前类的 ClassLoader 的当前名称空间,如清单 12 中所示:
清单 12 比较类的更好方法
if(objgetClass() == thisgetClassLoader()loadClass("combarFoo")){
// object's class is equal to
//the class that this class calls "combarFoo"
}else{
// object's class is not equal to the class that
// this class calls "combarFoo"
}
然而,比较类的更好方法是直接比较类对象看它们是否相等。例如,如果您想确定两个对象 a 和 b 是否属同一个类,那么您就应该使用清单 13 中的代码:
清单 13 直接比较对象来看它们是否相等
if(agetClass() == bgetClass()){
// objects have the same class
}else{
// objects have different classes
}
尽可能少用直接名称比较。
不要使用内部类
Java 字节码没有内部类的概念,因为编译器将内部类转换成了普通类,而如果没有将内部类声明为 private,则同一个包内的任何代码恰好能访问该普通类。
影响
因为有这一特性,所以包内的恶意代码可以访问这些内部类。如果内部类能够访问括起外部类的字段,那么情况会变得更糟。可能已经将这些字段声明为 private,这样内部类就被转换成了独立类,但当内部类访问外部类的字段时,编译器就将这些字段从专用(private)的变为在包(package)的作用域内有效的。内部类暴露了已经够糟糕的了,但更糟糕的是编译器使您将某些字段成为 private 的举动成为徒劳。
建议 如果能够不使用内部类就不要使用内部类。
对付低严重性暴露的技巧
请遵循下列建议以避免低严重性静态安全性暴露:
避免返回可变对象
检查本机方法
避免返回可变对象
Java 方法返回对象引用的副本。如果实际对象是可改变的,那么使用这样一个引用调用程序可能会改变它的内容,通常这是我们所不希望见到的。
影响
请考虑这个示例:某个方法返回一个对敏感对象的内部数组的引用,假定该方法的调用程序不改变这些对象。即使数组对象本身是不可改变的,也可以在数组对象以外 *** 作数组的内容,这种 *** 作将反映在返回该数组的对象中。如果该方法返回可改变的对象,那么事情会变得更糟;外部实体可以改变在那个类中声明的 public 变量,这种改变将反映在实际对象中。
清单 14 演示了脆弱性。getExposedObj() 方法返回了 Exposed 对象的引用副本,该对象是可变的:
清单 14 返回可变对象的引用副本
class Exposed{
private int id;
private String name;
public Exposed(){
}
public Exposed(int id, String name){
thisid = id;
thisname = name;
}
public int getId(){
return id;
}
public String getName(){
return name;
}
public void setId(int id){
thisid=id;
}
public void setName(String name){
thisname = name;
}
public void display(){
Systemoutprintln("Id = "+ id + " Name = "+ name);
}
}
public class Exp12{
private Exposed exposedObj = new Exposed(1,"Harry Porter");
public Exposed getExposedObj(){
return exposedObj; //returns a reference to the object
}
public static void main(String[] args){
Exp12 exp12 = new Exp12();
exp12getExposedObj()display();
Exposed exposed = exp12getExposedObj();
exposedsetId(10);
exposedsetName("Hacker");
exp12getExposedObj()display();
}
}
建议
如果方法返回可改变的对象,但又不希望调用程序改变该对象,请修改该方法使之不返回实际对象而是返回它的副本或克隆。要改正清单 14 中的代码,请让它返回 Exposed 对象的副本,如清单 15 中所示:
清单 15 返回可变对象的副本
public Exposed getExposedObj(){
return new Exposed(exposedObjgetId(),exposedObjgetName());
}
或者,您的代码也可以返回 Exposed 对象的克隆。
检查本机方法
本机方法是一种 Java 方法,其实现是用另一种编程语言编写的,如 C 或 C++。有些开发人员实现本机方法,这是因为 Java 语言即使使用即时(just-in-time)编译器也比许多编译过的语言要慢。其它人需要使用本机代码是为了在 JVM 以外实现特定于平台的功能。
影响
使用本机代码时,请小心,因为对这些代码进行验证是不可能的,而且本机代码可能潜在地允许 applet 绕过通常的安全性管理器(Security Manager)和 Java 对设备访问的控制。
建议
如果非得使用本机方法,那么请检查这些方法以确定:
它们返回什么
它们获取什么作为参数
它们是否绕过安全性检查
它们是否是 public、private 等等
它们是否含有绕过包边界从而绕过包保护的方法调用
结束语
编写安全 Java 代码是十分困难的,但本文描述了一些可行的实践来帮您编写安全 Java 代码。这些建议并不能解决您的所有安全性问题,但它们将减少暴露数目。最佳软件安全性实践可以帮助确保软件正常运行。安全至关重要和高可靠系统设计者总是花费大量精力来分析和跟踪软件行为。只有通过将安全性作为至关紧要的系统特性来对待 — 并且从一开始就将它构建到应用程序中,我们才可以避免亡羊补牢似的、修修补补的安全性方法。
参考资料
请通过单击文章顶部或底部的讨论来参加本文的论坛。
了解关于 Java 安全性 API 的更多知识。
developerWorks 安全专题上通常含有有关计算机安全性的优秀资源。
Larry Koved、 Anthony J Nadalin、Don Neal 和 Tim Lawson 合作编写的 “The evolution of Java security”(developerWorks,1998 年)对 Java 语言的安全性模型早期开发进行了深入探讨。
Sing Li 在他的 Java 安全性系列文章(由两部分组成的)(developerWorks, 2001 年 2 月)中向开发人员显示:尽管社区可能不得不重新考虑 Java 2 中的安全性设计,还是出现了只对开发人员有帮助,可以满足他们的需求的一致的进展:
第一部分
第二部分
John Viega、Tom Mutdosch、 Gary McGraw 和 Ed Felten 合著的 “Statically scanning Java code for security vulnerabilities” (IEEE Software,2000 年 9 月)介绍了一种 Java 工具,可以使用该工具来检查您的 Java 代码中的安全性漏洞。
G McGraw 和 E Felten 合作编写的 Securing Java: Getting Down to Business with Mobile Code(John Wiley 和 Sons,1998 年)深入涵盖了 Java 安全性。(文档是 PDF 格式的。)
定期检查 IBM 研究 Java 安全页面以便 IBM 在安全性领域的创新有重要发展时能够跟踪这一创新。
如果您的 Java 代码运行在 S/390 系统上,那么您将需要查阅 S/390 Java 安全页面以获取额外的信息。
关于作者
Bijaya Nanda Sahu 是就职于印度 IBM Global Services 的软件工程师。他从事过各种因特网技术和框架(J2EE、WSBCC、JADE)、 WebSphere 相关技术、UML 和 OOAD 方面的工作。目前,他从事因特网银行安全性问题方面的工作,重点在 WebSphere Application Server 和 Portal Server 上。可以通过 bijayasahu@inibmcom 和他联系
软件开发的环境:开发环境是在开发工具中及有原代码的环境下,软件开发环境(简称SDE)是指在基本硬件和宿至软件的基础上,为支持系统软件和应用软件的工程化开发和维护而使用的一组软件,简称SDE。它由软件工具和环境集成机制构成,前者用以支持软件开发的相关过程、活动和任务,后者为工具集成和软件的开发、维护及管理提供统一的支持。包括:1
2
4
(1)软件开发的一致性及完整性维护;(2)配置管理及版本控制;(3)数据的多种表示形式及其在不同形式之间自动转换;(4)信息的自动检索及更新;(5)项目控制和管理
1、自学Java知识学习步骤:
①java基础(基础语法)
②java面向对象
③数组、集合、常用类
④IO流
⑤多线路SOCKET编程
⑥数据库、网络传输、数据解析。
2、根据上面六项串起来做实例,
3、优化代码:编写代码规范,通用逻辑或处理共同话,性能优化等等
4、改善代码和功能完善等等。
上面的基础学会了,开始试着开发项目,或都看别人已经开发好的项目自己拿来练习,巩固知识点。
进公司能上手,对技术也扎实,工资绝对比你期望的要高!
自学的话时间比较长,但是一定不要太过多依赖于视频,视频的目的是理解里面的技术。
Java程序员基本上都是高薪待遇的,
而通过Java培训课程的学习,是相对而言比较便捷的成为Java程序员的方法,
通过Java培训班四个半月的课程学习,掌握Java编程技术,
将所学与项目结合,迈出程序员职业道路的第一步,随着工作经验的积累,薪资只会增长。
对JAVA程序员而言,换一份工作或进入一个新的公司,往往意味着要熟悉一个新的开发环境,要快速了解新的项目。如何快速地熟悉项目代码,是每个程序员都会遇到的问题,特别是对刚进入职场的应届毕业生,这个问题更显得棘手。下面是我自己在经历几个工作之后结束的一些方法,昌平IT培训与大家分享一下,仅贡参考!
1通读需求文档,了解项目用途;
一个企业级的项目,一定会保留一些相关文档吧!比如需求文档,设计文档,项目计划等,先通读这些文档,了解项目的用途、主要功能等。
2熟悉开发工具、常用功能;
每个公司用的开发环境都会有些不同,要熟悉新的开发环境,了解常用的功能、快捷键等,特别是前后使用习惯相差比较大的开发环境,如从MyEclipse到IntelliJIDEA。Java的开发环境用的比较多的有MyEclipse(Eclipse)、IntellijIDEAC++就比较多了,从VC6到VS2008、VS2010、VS2012、VS2013都有人用,还有一些用开源的开发工具如Qt。
3部署环境,把项目跑起来;
了解开发环境后,就把相关的配置部署好,把项目跑起来。好处是:1可以进一步实践新的开发环境;2把项目跑起来后可以快速地了解项目的用途和功能。
4整体浏览代码,了解代码结构;
整体浏览一下代码,对项目的代码有个整体结构的把握。最好能把类图画出来,可以用一些UML工具(如EA、PowerDesign)的逆向工程把源码导出类图。
5抽取其中的一部分进行细读;
对一个企业级的项目,特别是一些大型项目或积淀比较深厚的项目,不可一下就把所有代码都熟悉。那就选择其中的一部分,如其中一个小功能,从界面开始,通过debug模式一步一步地跟下去,以点带面地去熟悉整个项目。
6尝试修改一些程序bug;
修改bug是熟悉项目最好的方法。根据出现的bug,通过debug模式一步步地定位出现问题的位置,再分析出现问题的原因。当你能够修改bug,并且已经改了好几个bug的时候,就说明你对项目有了一定了解了,基本熟悉这个项目的结构和逻辑了。
去Oracle官网下载安装:>
一、专业技能
熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的JavaAPI,包括集合框架、多线程(并发编程)、I/O(NIO)、Socket、JDBC、XML、反射等。
熟悉基于JSP和Servlet的JavaWeb开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器、过滤器等Web组件以及MVC架构模式进行JavaWeb项目开发经验。
对Spring的IoC容器和AOP原理有深入了解,熟练的运用Spring框架管理各种Web组件及其依赖关系,熟练的使用Spring进行事务、日志、安全性等的管理,有使用SpringMVC作为表示层技术以及使用Spring提供的持久化支持进行Web项目开发的经验,熟悉Spring对其他框架的整合。
熟练的使用Hibernate、MyBatis等ORM框架,熟悉Hibernate和MyBatis的核心API,对Hibernate的关联映射、继承映射、组件映射、缓存机制、事务管理以及性能调优等有深入的理解。
熟练的使用HTML、CSS和JavaScript进行Web前端开发,熟悉jQuery和Bootstrap,对Ajax技术在Web项目中的应用有深入理解,有使用前端MVC框架(AngularJS)和JavaScript模板引擎(HandleBars)进行项目开发的经验。
熟悉常用的关系型数据库产品(MySQL、Oracle),熟练的使用SQL和PL/SQL进行数据库编程。
熟悉面向对象的设计原则,对GoF设计模式和企业应用架构模式有深入的了解和实际开发的相关经验,熟练的使用UML进行面向对象的分析和设计,有TDD(测试驱动开发)和DDD(领域驱动设计)的经验。
熟悉Apache、NginX、Tomcat、WildFly、Weblogic等Web服务器和应用服务器的使用,熟悉多种服务器整合、集群和负载均衡的配置。
熟练的使用产品原型工具Axure,熟练的使用设计建模工具PowerDesigner和Enterprise Architect,熟练的使用Java开发环境Eclipse和IntelliJ,熟练的使用前端开发环境WebStorm,熟练的使用软件版本控制工具SVN和Git,熟练的使用项目构建和管理工具Maven和Gradle。
说明: 上面罗列的这些东西并不是每一项你都要烂熟于心,根据企业招聘的具体要求可以做相应的有针对性的准备。但是前6项应该是最低要求,是作为一个Java软件工程师必须要具备的专业技能。
二、项目经验
项目介绍
本系统是X委托Y开发的用于Z的系统,系统包括A、B、C、D等模块。系统使用了Java企业级开发的开源框架E以及前端技术F。表示层运用了G架构,使用H作为视图I作为控制器并实现了REST风格的请求;业务逻辑层运用了J模式,并通过K实现事务、日志和安全性等功能,通过L实现缓存服务;持久层使用了M封装CRUD *** 作,底层使用N实现数据存取。整个项目采用了P开发模型。 说明: E通常指spring(Java企业级开发的一站式选择); F最有可能是jQuery库及其插件或者是Bootstrap框架,当然如果要构建单页应用(SPA)最佳的方案是前端MVC框架(如AngularJS)和JavaScript模板引擎(如HandleBars);G显然是MVC(模型-视图-控制),最有可能的实现框架是spring MVC,除此之外还有Struts 2、JSF以及Apache为JSF提供的MyFaces实现; H是JSP,JSP作为MVC中的V,也可使用模板引擎(如Freemarker和Velocity)来生成视图还可以是各种文档或报表(如Excel和PDF等); I是Servlet或者自定义的控制器,他们是MVC中的C,当然Spring MVC中提供了作为前端控制器的DispatcherServlet; J通常是事务脚本; K应该是AOP(面向切面编程)技术; L目前广泛使用的有memcached和Redis; M的选择方案很多,最有可能的是hibernate和MyBatis,也可以两种技术同时运用,但通常是将增删改交给hibernate来处理,而复杂的查询则由MyBatis完成,此外TopLink、jOOQ也是优秀的持久层解决方案; N底层的数据存取传统上是使用关系型数据库,可以是MySQL、Oracle、SQLServer、DB2等,随着大数据时代的来临,也可以采用NoSQL(如MongoDB、MemBase、BigTable等)和其他大数据存取方案(如GFS、HDFS等); P是项目的开发模型,可以是瀑布模型、快速原型模型、增量模型、螺旋模型、喷泉模型、RAD模型等。
项目开发流程
1、可行性分析:可行性分析报告、项目开发计划书;
2、需求分析:需求规格说明书OOAD(用例图、时序图、活动图);
界面原型:帮助理解需求、业务层设计时推导事务脚本;
3、设计:概要设计说明书、详细设计说明书;
抽取业务实体(领域对象):类图、E-R图(概念设计阶段);
分层架构:确定各层的技术实现方案(具体到使用的框架、数据库服务器、应用服务器等);
业务层设计:事务脚本模式(事务:用户发送一次请求就是一个事务;
脚本:一个方法或一个函数;
事务脚本:把一次请求封装为一个方法或一个函数;事务脚本模式:一个事务开始于脚本的打开,终止于脚本的关闭);
业务层涉及的对象有三种类型:事务脚本类(封装了业务的流程)、数据访问对象(DAO,封装了持久化 *** 作)、数据传输对象(DTO,封装了失血/贫血领域对象),三者之间的关系是事务脚本类组合(聚合)数据访问对象,这二者都依赖了数据传输对象正向工程(UML类图生成Java代码)和逆向工程(Java代码生成UML类图)数据库物理设计(ER图转换成表间关系图、建库和建表、使用工具插入测试数据);
3、编码;
4、测试:测试报告、缺陷报告;
单元测试:对软件中的最小可测试单元进行检查和验证,在Java中是对类中的方法进行测试,可以使用JUnit工具来实施;
集成测试:集成测试也叫组装测试或联合测试。在单元测试的基础上,将所有模块按照设计要求组装成为子系统进行测试;
系统测试:将已经确认的软件、硬件、外设、网络等元素结合在一起,进行信息系统的各种组装测试和确认测试,系统测试是针对整个产品系统进行的测试,目的是验证系统是否满足了需求规格的定义,找出与需求规格不符或与之矛盾的地方,从而提出更加完善的方案;
验收测试:在软件产品完成了单元测试、集成测试和系统测试之后,产品发布之前所进行的软件测试活动。它是技术测试的最后一个阶段,也称为交付测试。验收测试的目的是确保软件准备就绪,并且可以让最终用户将其用于执行软件的既定功能和任务;
5、交付和维护:用户手册、 *** 作手册;
三、项目管理
版本控制:CVS/SVN/Git
自动构建:Ant/Maven/Ivy/Gradle
持续集成:Hudson/Jenkins
四、系统架构
负载均衡服务器:F5、A10;
应用服务器: >
EJB容器:WildFly(JBoss Application Server)、GlassFish、Weblogic、Websphere;
数据库服务器:MySQL、Eclipse、Oracle;
五、第三方工具(插件)应用
图表工具:基于jQuery的图表插件(如jQchart、Flot、Charted等)、Chartjs、Highcharts等。
报表工具:Pentaho Reporting、iReport、DynamicReports等。
文档处理:POI、iText等。
工作流引擎:jBPM、OpenWFE、Snaker、SWAMP等。
作业调度:Quartz、JobServer、Oddjob等。
缓存服务:EhCache、memcached、SwarmCache等。
消息队列:Open-MQ、ZeroMQ、ActiveMQ等。
安全框架:Shiro、PicketBox等。
搜索引擎:IndexTank、Lucene、ElasticSearch等。
Ajax框架:jQuery、ExtJS、DWR等。
UI插件:EasyUI、MiniUI等。
富文本框:UEditor、CKEditor等。
六、面试提问
项目是为哪个公司开发的?项目的投入是多少?
有多少人参与了项目开发?整个团队中,测试人员、开发人员、项目经理比例是多少?
项目开发了多长时间?项目总的代码量有多少?你的代码量有多少?
项目采用了怎样的开发模型或开发流程?项目的架构是怎样的?项目的技术选型是怎样的?
你在项目中担了怎样的职责?是否经常开会或加班?项目完成后有哪些收获或是经验教训?
项目中最困难的部分是什么?如何解决团队开发时遇到的各种冲突?
七、面试时可以反问面试官的问题
我注意到你们使用了X技术,请问你们是如何解决Y问题的?
为什么你们的产品使用了X技术而不是Y技术?据我所知,X技术虽然有A、B、C等好处,但也存在D和E问题,而Y技术可以解决D和E问题。
我对您说的X技术不是太熟悉,但我感觉它是一个不错的解决方案,您能多讲讲它的工作原理吗?
你们团队是如何进行项目规划的?一周会有几次例会?每周的代码量大概是多少?
就X问题我能想到的解决方案目前就只有Y了,请问您会怎么解决这个问题?
八、SAR法则
SAR法则是指先描述问题的场景,然后解释你采取的行动,最后陈述结果。九、面谈原则
声音适中、口齿清楚、面带微笑、个人形象精神,讲礼貌。
主动跟面试官聊他感兴趣的话题,让面试官满意。
主动的大胆的跟面试官聊自己熟悉有经验的内容:项目、技术点等,做到扬长避短。
一定要表达自己非常想得到这个岗位,自己很愿意学习不懂的技术。
根据自己的实际水平提出合理的待遇要求。
十、自我评价
学习能力(搞IT行业的人需要不断的了解新的技术、工具和方法)
团队意识(相比个人英雄主义,IT行业更倡导团队合作)
抗压能力(很多IT企业的工作强度相对来说还是比较大的)
java学习的学习内容涵盖较多方面,大致可以分为以下几个阶段,从基础的语法,到高阶的框架,必须按部就班,才能够走得更远,提升的空间才会更大。
一、预科学习:
HTML5:HTML5标签入门、HTML5表格、表单
CSS3:CSS3选择器和简单属性、CSS3定位和布局、CSS3复杂选择器和高级属性
数据库:mysql数据库安装和数据 *** 作、约束和简单查询、复杂查询、数据库设计、oracle的安装与数据 *** 作、oracle与mysql的对比学习
二、JavaSE
Java语言基础、程序逻辑:环境配置和第一个语言程序-HelloWorld变量运算符条件和循环方法和数组
Java面向对象:面向对象入门面向对象应用_管理系统类Java常用类、String相关、算法相关面向对象深入(重载、this、static)继承(重写、super、初始化顺序)多态(抽象类和接口、final、克隆和比较接口设计模式、对象和类的生命周期)
API:异常、日志集合集合工具类和泛型IOJDBC基础线程网络编程反射NIOJunit
Java面向对象思想:设计模式面向对象原则
Java底层理论:集合底层性能监控工具反编JUC
三、Javaweb
web基础:TOMCAT/WEB程序结构/>
第三方工具包:连接池、事务、分页、文件上传下载、Dom4j/Log4j/Logback
JavaScript和jQuery框架技术:JS入门和DOM基础、DOM模型深入、jQ基础、jQ *** 作DOM
MVC动态Web开发技术:自定义MVC框架、DAO框架、前端框架(layUI)
Web开发高级运用:tomcatserver服务器配置、nginx使用、jetty配置
网络编程:网络原理、>
四、SSM框架
Spring框架、SpringMVC框架、MyBatis框架:mybatis入门、配置文件详解和动态sql的使用、mybatis管理关系映射和延迟加载、查询缓存和逆向工程、Spring入门和集成、myBatisSpringMVC入门、SSM集成、Spring配置详解、SpringAOP、Spring事务配置、SpringMVC高级功能、SpringMVC原理
五、前沿技术
高可用、高并发、高扩展:SpringBoot、缓存、分布式、全文索引、服务中间件、myCat、云服务、人脸识别、语言识别、JVM底层优化
希望能够帮到你!
以上就是关于北大青鸟java培训:学了计算机,又不想写代码,我还能干啥全部的内容,包括:北大青鸟java培训:学了计算机,又不想写代码,我还能干啥、怎么样才能写出安全的Java代码不被黑客攻击、Java软件开发的软件环境和开发工具分别是什么(软件开发环境有哪几种)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)