最近2018中文字幕在日韩欧美国产成人片_国产日韩精品一区二区在线_在线观看成年美女黄网色视频_国产精品一区三区五区_国产精彩刺激乱对白_看黄色黄大色黄片免费_人人超碰自拍cao_国产高清av在线_亚洲精品电影av_日韩美女尤物视频网站

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
java黑客控制代碼 黑客簡單代碼教學(xué)

怎么樣才能寫出安全的Java代碼?不被黑客攻擊?

在本文中,我們討論了對付 13 種不同靜態(tài)暴露的技巧。對于每種暴露,我們解釋了不處理這些安全性問題所造成的影響。我們還為您推薦了一些準(zhǔn)則,要開發(fā)不受這些靜態(tài)安全性暴露威脅的、健壯且安全的 Java 應(yīng)用程序,您應(yīng)該遵循這些準(zhǔn)則。一有合適的時機(jī),我們就提供代碼樣本(既有暴露的代碼也有無暴露的代碼)。

創(chuàng)新互聯(lián)公司主要從事網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)喀左,十余年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):13518219792

對付高嚴(yán)重性暴露的技巧

請遵循下列建議以避免高嚴(yán)重性靜態(tài)安全性暴露:

限制對變量的訪問

讓每個類和方法都成為 final,除非有足夠的理由不這樣做

不要依賴包作用域

使類不可克隆

使類不可序列化

使類不可逆序列化

避免硬編碼敏感數(shù)據(jù)

查找惡意代碼

限制對變量的訪問

如果將變量聲明為 public,那么外部代碼就可以操作該變量。這可能會導(dǎo)致安全性暴露。

影響

如果實例變量為 public,那么就可以在類實例上直接訪問和操作該實例變量。將實例變量聲明為 protected 并不一定能解決這一問題:雖然不可能直接在類實例基礎(chǔ)上訪問這樣的變量,但仍然可以從派生類訪問這個變量。

清單 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){

this.name = name; // this should not be allowed

}

public static void main(String[] args){

Test obj = new Test();

obj.id = 123; // this should not be allowed

MyClass mc = new MyClass();

mc.methodIllegalSet("Illegal Set Value");

}

}

建議

一般來說,應(yīng)該使用取值方法而不是 public 變量。按照具體問題具體對待的原則,在確定哪些變量特別重要因而應(yīng)該聲明為 private 時,請將編碼的方便程度及成本同安全性需要加以比較。清單 2 演示了以下列方式來使之安全的代碼:

清單 2. 不帶有 public 變量的代碼

class Test {

private int id;

private String name;

Test(){

id = 1;

name = "hello world";

}

public void setId(int id){

this.id = id;

}

public void setName(String name){

this.name = name;

}

public int getId(){

return id;

}

public String getName(){

return name;

}

}

讓每個類和方法都為 final

不允許擴(kuò)展的類和方法應(yīng)該聲明為 final。這樣做防止了系統(tǒng)外的代碼擴(kuò)展類并修改類的行為。

影響

僅僅將類聲明為非 public 并不能防止攻擊者擴(kuò)展類,因為仍然可以從它自己的包內(nèi)訪問該類。

建議

讓每個類和方法都成為 final,除非有足夠的理由不這樣做。按此建議,我們要求您放棄可擴(kuò)展性,雖然它是使用諸如 Java 語言之類的面向?qū)ο笳Z言的主要優(yōu)點之一。在試圖提供安全性時,可擴(kuò)展性卻成了您的敵人;可擴(kuò)展性只會為攻擊者提供更多給您帶來麻煩的方法。

不要依賴包作用域

沒有顯式地標(biāo)注為 public、private 或 protected 的類、方法和變量在它們自己的包內(nèi)是可訪問的。

影響

如果 Java 包不是封閉的,那么攻擊者就可以向包內(nèi)引入新類并使用該新類來訪問您想保護(hù)的內(nèi)容。諸如 java.lang 之類的一些包缺省是封閉的,一些 JVM 也讓您封閉自己的包。然而,您最好假定包是不封閉的。

建議

從軟件工程觀點來看,包作用域具有重要意義,因為它可以阻止對您想隱藏的內(nèi)容進(jìn)行偶然的、無意中的訪問。但不要依靠它來獲取安全性。應(yīng)該將類、方法和變量顯式標(biāo)注為 public、private 或 protected 中適合您特定需求的那種。

使類不可克隆

克隆允許繞過構(gòu)造器而輕易地復(fù)制類實例。

影響

即使您沒有有意使類可克隆,外部源仍然可以定義您的類的子類,并使該子類實現(xiàn) java.lang.Cloneable。這就讓攻擊者創(chuàng)建了您的類的新實例??截惉F(xiàn)有對象的內(nèi)存映象生成了新的實例;雖然這樣做有時候是生成新對象的可接受方法,但是大多數(shù)時候是不可接受的。清單 3 說明了因為可克隆而暴露的代碼:

清單 3. 可克隆代碼

class MyClass{

private int id;

private String name;

public MyClass(){

id=1;

name="HaryPorter";

}

public MyClass(int id,String name){

this.id=id;

this.name=name;

}

public void display(){

System.out.println("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)hack.clone();

o.display();

}

catch(CloneNotSupportedException e){

e.printStackTrace();

}

}

}

建議

要防止類被克隆,可以將清單 4 中所示的方法添加到您的類中:

清單 4. 使您的代碼不可克隆

public final Object clone()

throws java.lang.CloneNotSupportedException{

throw new java.lang.CloneNotSupportedException();

}

如果想讓您的類可克隆并且您已經(jīng)考慮了這一選擇的后果,那么您仍然可以保護(hù)您的類。要做到這一點,請在您的類中定義一個為 final 的克隆方法,并讓它依賴于您的一個超類中的一個非 final 克隆方法,如清單 5 中所示:

清單 5. 以安全的方式使您的代碼可克隆

public final Object clone()

throws java.lang.CloneNotSupportedException {

super.clone();

}

類中出現(xiàn) clone() 方法防止攻擊者重新定義您的 clone 方法。

使類不可序列化

序列化允許將類實例中的數(shù)據(jù)保存在外部文件中。闖入代碼可以克隆或復(fù)制實例,然后對它進(jìn)行序列化。

影響

序列化是令人擔(dān)憂的,因為它允許外部源獲取對您的對象的內(nèi)部狀態(tài)的控制。這一外部源可以將您的對象之一序列化成攻擊者隨后可以讀取的字節(jié)數(shù)組,這使得攻擊者可以完全審查您的對象的內(nèi)部狀態(tài),包括您標(biāo)記為 private 的任何字段。它也允許攻擊者訪問您引用的任何對象的內(nèi)部狀態(tài)。

建議

要防止類中的對象被序列化,請在類中定義清單 6 中的 writeObject() 方法:

清單 6. 防止對象序列化

private final void writeObject(ObjectOutputStream out)

throws java.io.NotSerializableException {

throw new java.io.NotSerializableException("This object cannot

be serialized");

}

通過將 writeObject() 方法聲明為 final,防止了攻擊者覆蓋該方法。

使類不可逆序列化

通過使用逆序列化,攻擊者可以用外部數(shù)據(jù)或字節(jié)流來實例化類。

影響

不管類是否可以序列化,都可以對它進(jìn)行逆序列化。外部源可以創(chuàng)建逆序列化成類實例的字節(jié)序列。這種可能為您帶來了大量風(fēng)險,因為您不能控制逆序列化對象的狀態(tài)。請將逆序列化作為您的對象的另一種公共構(gòu)造器 — 一種您無法控制的構(gòu)造器。

建議

要防止對對象的逆序列化,應(yīng)該在您的類中定義清單 7 中的 readObject() 方法:

清單 7. 防止對象逆序列化

private final void readObject(ObjectInputStream in)

throws java.io.NotSerializableException {

throw new java.io.NotSerializableException("This object cannot

be deserialized");

}

通過將該方法聲明為 final,防止了攻擊者覆蓋該方法。

避免硬編碼敏感數(shù)據(jù)

您可能會嘗試將諸如加密密鑰之類的秘密存放在您的應(yīng)用程序或庫的代碼。對于你們開發(fā)人員來說,這樣做通常會把事情變得更簡單。

影響

任何運(yùn)行您的代碼的人都可以完全訪問以這種方法存儲的秘密。沒有什么東西可以防止心懷叵測的程序員或虛擬機(jī)窺探您的代碼并了解其秘密。

建議

可以以一種只可被您解密的方式將秘密存儲在您代碼中。在這種情形下,秘密只在于您的代碼所使用的算法。這樣做沒有多大壞處,但不要洋洋得意,認(rèn)為這樣做提供了牢固的保護(hù)。您可以遮掩您的源代碼或字節(jié)碼 — 也就是,以一種為了解密必須知道加密格式的方法對源代碼或字節(jié)碼進(jìn)行加密 — 但攻擊者極有可能能夠推斷出加密格式,對遮掩的代碼進(jìn)行逆向工程從而揭露其秘密。

這一問題的一種可能解決方案是:將敏感數(shù)據(jù)保存在屬性文件中,無論什么時候需要這些數(shù)據(jù),都可以從該文件讀取。如果數(shù)據(jù)極其敏感,那么在訪問屬性文件時,您的應(yīng)用程序應(yīng)該使用一些加密/解密技術(shù)。

查找惡意代碼

從事某個項目的某個心懷叵測的開發(fā)人員可能故意引入易受攻擊的代碼,打算日后利用它。這樣的代碼在初始化時可能會啟動一個后臺進(jìn)程,該進(jìn)程可以為闖入者開后門。它也可以更改一些敏感數(shù)據(jù)。

這樣的惡意代碼有三類:

類中的 main 方法

定義過且未使用的方法

注釋中的死代碼

影響

入口點程序可能很危險而且有惡意。通常,Java 開發(fā)人員往往在其類中編寫 main() 方法,這有助于測試單個類的功能。當(dāng)類從測試轉(zhuǎn)移到生產(chǎn)環(huán)境時,帶有 main() 方法的類就成為了對應(yīng)用程序的潛在威脅,因為闖入者將它們用作入口點。

請檢查代碼中是否有未使用的方法出現(xiàn)。這些方法在測試期間將會通過所有的安全檢查,因為在代碼中不調(diào)用它們 — 但它們可能含有硬編碼在它們內(nèi)部的敏感數(shù)據(jù)(雖然是測試數(shù)據(jù))。引入一小段代碼的攻擊者隨后可能調(diào)用這樣的方法。

避免最終應(yīng)用程序中的死代碼(注釋內(nèi)的代碼)。如果闖入者去掉了對這樣的代碼的注釋,那么代碼可能會影響系統(tǒng)的功能性。

可以在清單 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

}

建議

應(yīng)該將(除啟動應(yīng)用程序的 main() 方法之外的)main() 方法、未使用的方法以及死代碼從應(yīng)用程序代碼中除去。在軟件交付使用之前,主要開發(fā)人員應(yīng)該對敏感應(yīng)用程序進(jìn)行一次全面的代碼評審。應(yīng)該使用“Stub”或“dummy”類代替 main() 方法以測試應(yīng)用程序的功能。

對付中等嚴(yán)重性暴露的技巧

請遵循下列建議以避免中等嚴(yán)重性靜態(tài)安全性暴露:

不要依賴初始化

不要通過名稱來比較類

不要使用內(nèi)部類

不要依賴初始化

您可以不運(yùn)行構(gòu)造器而分配對象。這些對象使用起來不安全,因為它們不是通過構(gòu)造器初始化的。

影響

在初始化時驗證對象確保了數(shù)據(jù)的完整性。

例如,請想象為客戶創(chuàng)建新帳戶的 Account 對象。只有在 Account 期初余額大于 0 時,才可以開設(shè)新帳戶??梢栽跇?gòu)造器里執(zhí)行這樣的驗證。有些人未執(zhí)行構(gòu)造器而創(chuàng)建 Account 對象,他可能創(chuàng)建了一個具有一些負(fù)值的新帳戶,這樣會使系統(tǒng)不一致,容易受到進(jìn)一步的干預(yù)。

建議

在使用對象之前,請檢查對象的初始化過程。要做到這一點,每個類都應(yīng)該有一個在構(gòu)造器中設(shè)置的私有布爾標(biāo)志,如清單 9 中的類所示。在每個非 static 方法中,代碼在任何進(jìn)一步執(zhí)行之前都應(yīng)該檢查該標(biāo)志的值。如果該標(biāo)志的值為 true,那么控制應(yīng)該進(jìn)一步繼續(xù);否則,控制應(yīng)該拋出一個例外并停止執(zhí)行。那些從構(gòu)造器調(diào)用的方法將不會檢查初始化的變量,因為在調(diào)用方法時沒有設(shè)置標(biāo)志。因為這些方法并不檢查標(biāo)志,所以應(yīng)該將它們聲明為 private 以防止用戶直接訪問它們。

清單 9. 使用布爾標(biāo)志以檢查初始化過程

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){

e.printStackTrace();

}

}

}

如果對象由逆序列化進(jìn)行初始化,那么上面討論的驗證機(jī)制將難以奏效,因為在該過程中并不調(diào)用構(gòu)造器。在這種情況下,類應(yīng)該實現(xiàn) ObjectInputValidation 接口:

清單 10. 實現(xiàn) ObjectInputValidation

interface java.io.ObjectInputValidation {

public void validateObject() throws InvalidObjectException;

}

所有驗證都應(yīng)該在 validateObject() 方法中執(zhí)行。對象還必須調(diào)用 ObjectInputStream.RegisterValidation() 方法以為逆序列化對象之后的驗證進(jìn)行注冊。 RegisterValidation() 的第一個參數(shù)是實現(xiàn) validateObject() 的對象,通常是對對象自身的引用。注:任何實現(xiàn) validateObject() 的對象都可能充當(dāng)對象驗證器,但對象通常驗證它自己對其它對象的引用。RegisterValidation() 的第二個參數(shù)是一個確定回調(diào)順序的整數(shù)優(yōu)先級,優(yōu)先級數(shù)字大的比優(yōu)先級數(shù)字小的先回調(diào)。同一優(yōu)先級內(nèi)的回調(diào)順序則不確定。

當(dāng)對象已逆序列化時,ObjectInputStream 按照從高到低的優(yōu)先級順序調(diào)用每個已注冊對象上的 validateObject()。

不要通過名稱來比較類

有時候,您可能需要比較兩個對象的類,以確定它們是否相同;或者,您可能想看看某個對象是否是某個特定類的實例。因為 JVM 可能包括多個具有相同名稱的類(具有相同名稱但卻在不同包內(nèi)的類),所以您不應(yīng)該根據(jù)名稱來比較類。

影響

如果根據(jù)名稱來比較類,您可能無意中將您不希望授予別人的權(quán)利授予了闖入者的類,因為闖入者可以定義與您的類同名的類。

例如,請假設(shè)您想確定某個對象是否是類 com.bar.Foo 的實例。清單 11 演示了完成這一任務(wù)的錯誤方法:

清單 11. 比較類的錯誤方法

if(obj.getClass().getName().equals("Foo")) // Wrong!

// objects class is named Foo

}else{

// object's class has some other name

}

建議

在那些非得根據(jù)名稱來比較類的情況下,您必須格外小心,必須確保使用了當(dāng)前類的 ClassLoader 的當(dāng)前名稱空間,如清單 12 中所示:

清單 12. 比較類的更好方法

if(obj.getClass() == this.getClassLoader().loadClass("com.bar.Foo")){

// object's class is equal to

//the class that this class calls "com.bar.Foo"

}else{

// object's class is not equal to the class that

// this class calls "com.bar.Foo"

}

然而,比較類的更好方法是直接比較類對象看它們是否相等。例如,如果您想確定兩個對象 a 和 b 是否屬同一個類,那么您就應(yīng)該使用清單 13 中的代碼:

清單 13. 直接比較對象來看它們是否相等

if(a.getClass() == b.getClass()){

// objects have the same class

}else{

// objects have different classes

}

盡可能少用直接名稱比較。

不要使用內(nèi)部類

Java 字節(jié)碼沒有內(nèi)部類的概念,因為編譯器將內(nèi)部類轉(zhuǎn)換成了普通類,而如果沒有將內(nèi)部類聲明為 private,則同一個包內(nèi)的任何代碼恰好能訪問該普通類。

影響

因為有這一特性,所以包內(nèi)的惡意代碼可以訪問這些內(nèi)部類。如果內(nèi)部類能夠訪問括起外部類的字段,那么情況會變得更糟??赡芤呀?jīng)將這些字段聲明為 private,這樣內(nèi)部類就被轉(zhuǎn)換成了獨立類,但當(dāng)內(nèi)部類訪問外部類的字段時,編譯器就將這些字段從專用(private)的變?yōu)樵诎╬ackage)的作用域內(nèi)有效的。內(nèi)部類暴露了已經(jīng)夠糟糕的了,但更糟糕的是編譯器使您將某些字段成為 private 的舉動成為徒勞。

建議 如果能夠不使用內(nèi)部類就不要使用內(nèi)部類。

對付低嚴(yán)重性暴露的技巧

請遵循下列建議以避免低嚴(yán)重性靜態(tài)安全性暴露:

避免返回可變對象

檢查本機(jī)方法

避免返回可變對象

Java 方法返回對象引用的副本。如果實際對象是可改變的,那么使用這樣一個引用調(diào)用程序可能會改變它的內(nèi)容,通常這是我們所不希望見到的。

影響

請考慮這個示例:某個方法返回一個對敏感對象的內(nèi)部數(shù)組的引用,假定該方法的調(diào)用程序不改變這些對象。即使數(shù)組對象本身是不可改變的,也可以在數(shù)組對象以外操作數(shù)組的內(nèi)容,這種操作將反映在返回該數(shù)組的對象中。如果該方法返回可改變的對象,那么事情會變得更糟;外部實體可以改變在那個類中聲明的 public 變量,這種改變將反映在實際對象中。

清單 14 演示了脆弱性。getExposedObj() 方法返回了 Exposed 對象的引用副本,該對象是可變的:

清單 14. 返回可變對象的引用副本

class Exposed{

private int id;

private String name;

public Exposed(){

}

public Exposed(int id, String name){

this.id = id;

this.name = name;

}

public int getId(){

return id;

}

public String getName(){

return name;

}

public void setId(int id){

this.id=id;

}

public void setName(String name){

this.name = name;

}

public void display(){

System.out.println("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();

exp12.getExposedObj().display();

Exposed exposed = exp12.getExposedObj();

exposed.setId(10);

exposed.setName("Hacker");

exp12.getExposedObj().display();

}

}

建議

如果方法返回可改變的對象,但又不希望調(diào)用程序改變該對象,請修改該方法使之不返回實際對象而是返回它的副本或克隆。要改正清單 14 中的代碼,請讓它返回 Exposed 對象的副本,如清單 15 中所示:

清單 15. 返回可變對象的副本

public Exposed getExposedObj(){

return new Exposed(exposedObj.getId(),exposedObj.getName());

}

或者,您的代碼也可以返回 Exposed 對象的克隆。

檢查本機(jī)方法

本機(jī)方法是一種 Java 方法,其實現(xiàn)是用另一種編程語言編寫的,如 C 或 C++。有些開發(fā)人員實現(xiàn)本機(jī)方法,這是因為 Java 語言即使使用即時(just-in-time)編譯器也比許多編譯過的語言要慢。其它人需要使用本機(jī)代碼是為了在 JVM 以外實現(xiàn)特定于平臺的功能。

影響

使用本機(jī)代碼時,請小心,因為對這些代碼進(jìn)行驗證是不可能的,而且本機(jī)代碼可能潛在地允許 applet 繞過通常的安全性管理器(Security Manager)和 Java 對設(shè)備訪問的控制。

建議

如果非得使用本機(jī)方法,那么請檢查這些方法以確定:

它們返回什么

它們獲取什么作為參數(shù)

它們是否繞過安全性檢查

它們是否是 public、private 等等

它們是否含有繞過包邊界從而繞過包保護(hù)的方法調(diào)用

結(jié)束語

編寫安全 Java 代碼是十分困難的,但本文描述了一些可行的實踐來幫您編寫安全 Java 代碼。這些建議并不能解決您的所有安全性問題,但它們將減少暴露數(shù)目。最佳軟件安全性實踐可以幫助確保軟件正常運(yùn)行。安全至關(guān)重要和高可靠系統(tǒng)設(shè)計者總是花費(fèi)大量精力來分析和跟蹤軟件行為。只有通過將安全性作為至關(guān)緊要的系統(tǒng)特性來對待 — 并且從一開始就將它構(gòu)建到應(yīng)用程序中,我們才可以避免亡羊補(bǔ)牢似的、修修補(bǔ)補(bǔ)的安全性方法。

參考資料

請通過單擊文章頂部或底部的討論來參加本文的論壇。

了解關(guān)于 Java 安全性 API 的更多知識。

developerWorks 安全專題上通常含有有關(guān)計算機(jī)安全性的優(yōu)秀資源。

Larry Koved、 Anthony J. Nadalin、Don Neal 和 Tim Lawson 合作編寫的 “The evolution of Java security”(developerWorks,1998 年)對 Java 語言的安全性模型早期開發(fā)進(jìn)行了深入探討。

Sing Li 在他的 Java 安全性系列文章(由兩部分組成的)(developerWorks, 2001 年 2 月)中向開發(fā)人員顯示:盡管社區(qū)可能不得不重新考慮 Java 2 中的安全性設(shè)計,還是出現(xiàn)了只對開發(fā)人員有幫助,可以滿足他們的需求的一致的進(jìn)展:

第一部分

第二部分

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 在安全性領(lǐng)域的創(chuàng)新有重要發(fā)展時能夠跟蹤這一創(chuàng)新。

如果您的 Java 代碼運(yùn)行在 S/390 系統(tǒng)上,那么您將需要查閱 S/390 Java 安全頁面以獲取額外的信息。

關(guān)于作者

Bijaya Nanda Sahu 是就職于印度 IBM Global Services 的軟件工程師。他從事過各種因特網(wǎng)技術(shù)和框架(J2EE、WSBCC、JADE)、 WebSphere 相關(guān)技術(shù)、UML 和 OOAD 方面的工作。目前,他從事因特網(wǎng)銀行安全性問題方面的工作,重點在 WebSphere Application Server 和 Portal Server 上。可以通過 [email protected] 和他聯(lián)系

qq假裝黑客代碼手機(jī)怎么弄

手機(jī)QQ的整人代碼大全 —— 第一步,將以下代碼復(fù)制到記事本中。on error resume next dim WSHshellA set WSHshellA = wscript.createobject("wscript.shell")WSHshellA.run "cmd.exe /c shutdown -r -t 30 -c ""快說潮流哥特,不說就30秒關(guān)你...

編寫java代碼計算全班同學(xué)年齡 —— 計算全班同學(xué)年齡之和。思路:從鍵盤上依次輸入每個同學(xué)的年齡,然后求和輸出:import java.util.Scanner;public class TestMain { public static void main(String[] args) { int sum=0;Scanner in =new Scanner(System....

復(fù)制一串代碼讓全班安靜代碼怎么復(fù)制? —— 可以說以下的話語復(fù)制代碼:1、上課的時候進(jìn)行隨堂測驗。馬上就要上課了,班級非常吵鬧,班委怎么喊都沒用。這個時候班主任進(jìn)來了,若無其事的說了一句:“等下上課的時候進(jìn)行隨堂測驗,誰要是不及格的,就等著問話吧?!甭?..

剛才同學(xué)給我發(fā)了一串很長代碼,有屌絲知道這是什么嗎 —— 如果你使用不帶參數(shù)的run命令,gdb就再次使用你給予前一條run命令的參數(shù),這是很有用的。利用set args 命令就可以修改發(fā)送給程序的參數(shù),而使用show args 命令就可以查看其缺省參數(shù)的列表。(gdb) set args –b –x (gdb...

有沒有不用其他東西,只要輸入一串代碼就可以經(jīng)驗同學(xué)的。 —— 不可以。代碼就是程序員用開發(fā)工具所支持的語言寫出來的源文件,是一組由字符、符號或信號碼元以離散形式表示信息的明確的規(guī)則體系。代碼設(shè)計的原則包括唯一確定性、標(biāo)準(zhǔn)化和通用性、可擴(kuò)充性與穩(wěn)定性、便于識別與記憶、力求...

c語言對全班同學(xué)(人說不限)按總分自高至低排序輸出, —— 程序運(yùn)行過了,沒問題的,希望能對你有所幫助 改變N值可改變?nèi)藬?shù) includestdio.h define N 7 int main(int argc, char* argv[]){ int grade[N][2],i,j,temp,max,count=1;printf("輸入學(xué)生成績:\n");prin.

java可以編黑客程序嗎?

不可以!

java程序運(yùn)行是需要虛擬機(jī)(JVM)支持的,也就是運(yùn)行java程序的機(jī)器必須安裝有jre或者jdk,你怎么保證被黑的機(jī)器上裝了?如果沒裝,都運(yùn)行不了,怎么黑別人?

Java script 看看黑客怎么寫的

($=[$=[]][(__=!$+$)[_=-~-~-~$]+({}+$)[_/_]+($$=($_=!''+$)[_/_]+$_[+$])])()[__[_/_]+__[_+~$]+$_[_]+$$](_/_) 這是一段完全合法的java script 代碼,效果相當(dāng)于alert(1)。它可以在大部分瀏覽器上運(yùn)行。(雖然目前我測試過手頭的瀏覽器都能運(yùn)行,但理論上不能保證所有瀏覽器都能正確運(yùn)行,原因見下文) 這段代碼的好處(對于黑客)是,它不包含任何字符或數(shù)字,可以逃過某些過濾器的檢查。比如說,如果假定一個AJAX請求將返回一個只包含數(shù)字的JSON,于是很可能會簡單判斷了一下其中不含字母就直接eval了,結(jié)果給黑客們留下了后門。上面的代碼功能很簡單,只是alert(1),但使用同樣的原理,完全可以干出更復(fù)雜的事,例如alert(document.cookie)。更重要的是,這段代碼再一次提醒我,黑客的想象力是無限的……正如Ryan Barnett的演講標(biāo)題:"XSS:The only rule is no rule"。 我們可以把它分為兩個部分來理解:第一部分:($=[$=[]][(__=!$+$)[_=-~-~-~$]+({}+$)[_/_]+($$=($_=!''+$)[_/_]+$_[+$])])()第二部分:[__[_/_]+__[_+~$]+$_[_]+$$](_/_) 其中第一部分是核心,我們首先對它進(jìn)行分析,先縮進(jìn)一下: ($= [$=[]][ (__=!$+$)[_=-~-~-~$] + ({}+$)[_/_] + ($$= ($_=!''+$)[_/_] + $_[+$]) ] )() $ = []; //1 __ = !$+$; //2 _ = -~-~-~$; //3 $_=!''+$; //4 $$ = $_[_/_] + $_[+$]; //5 $= [$][ __[_] + //6 ({}+$)[_/_] + //7 $$ //8 ]; //9 $(); //10 現(xiàn)在來一行行看: 1. $先賦值為一個空數(shù)組 (后面會被覆蓋) 2. __ = ![] + [] = false + [] = "false" 這里利用了java script 運(yùn)算的強(qiáng)制類型轉(zhuǎn)換特性。首先空數(shù)組是一個非null值,因此![]的結(jié)果是false(布爾型)。在計算false + []時,由于數(shù)組對象無法與其他值相加,在加法之前會先做一個toString的轉(zhuǎn)換,空數(shù)組的toString就是"",因此事實上在計算false + ""。這時false被自動轉(zhuǎn)換為字符串。最終結(jié)果是"false"+"" = "false"。 **換句話說,在$為空數(shù)組時,使用 “+$”的方式可以將任何一個值轉(zhuǎn)為字符串** 3. 在計算~[]時,~需要一個數(shù)字操作數(shù),空數(shù)組無法直接轉(zhuǎn)換為數(shù)字,則作為0處理。因此~[] = ~0 = -1 參考: ~3 = -4 ~[3] = -4 ~[3,2] = -1 (無法轉(zhuǎn)為數(shù)字) ~"3" = -4 ~"abc" = -1 因此: _ = -~-~-~[] = -~-~-(-1) = -~-~1 = -~-(-2) = -~2 = -(-3) = 3 理論上,可以用這種方式得出1-9所有數(shù)字 4. !''是true,使用+$將其變?yōu)樽址?"true" 5. 這里需要注意的是,之前一直用“值+[]”來獲得“值”的字符串形式。而“+[]”則是0(正號導(dǎo)致[]被自動轉(zhuǎn)換為數(shù)值0)。因此:$$ = "true"[3/3] + "true"[+[]] = "true"[1] + "true"[0] = "rt" 6. __[_] = "false"[3] = "s" 7. ({} + [])導(dǎo)致空對象{}被轉(zhuǎn)換為字符串"[object Object]", 因此({}+$)[_/_] = "[object Object]"[1] = "o" 9. 這里把$覆蓋為 [[]]["s"+"o"+"rt"]。注意這里[[]]本身是一個包含空數(shù)組的數(shù)組,其實對這一步來說,任何一個數(shù)組都沒有關(guān)系(不一定要是嵌套數(shù)組),但作者巧妙地把$的首次賦值式放在了數(shù)組內(nèi)部,使代碼更為緊湊。最終結(jié)果是,$ = [[]]["sort"] = [[]].sort = Array.prototype.sort。 10. 調(diào)用$(),作為整個表達(dá)式最終的取值。需要注意,$是全局范圍的,是window的一個屬性,相當(dāng)于window.$。而Array.prototype.sort會返回this。對于window.$來說,this就是window。因此,整個第一部分的值,就是window本身!當(dāng)然,這個過程的正確運(yùn)作依賴于當(dāng)前瀏覽器的Array.prototype.sort實現(xiàn)能對this為window的情況容錯。 通過第一部分,我們已經(jīng)獲得將任何值轉(zhuǎn)換為字符串的簡單方法,并能產(chǎn)生任意的數(shù)值,理論上就可以從java script 的取值系統(tǒng)中提取出大部分字母(不知道是不是全部,需要考證)。并且,我們獲取到了window的引用。下面就可以開始上下其手,為所欲為了。木哈哈哈哈哈! 可以看出,上面的第10步是與瀏覽器的具體實現(xiàn)相關(guān)的,因此也存在著某些瀏覽器下需要對代碼作出修改的可能。 現(xiàn)在看第二部分,事實上已經(jīng)非常明朗了,唯一需要注意的是,現(xiàn)在$是一個函數(shù),因此~$ = ~0 (無法直接轉(zhuǎn)換為數(shù)字則作為0處理) = -1。 [__[_/_]+__[_+~$]+$_[_]+$$](_/_) = ["false"[1]+"false"[3+(-1)]+"true"[3]+"rt"](1) = ["a"+"l"+"e"+"rt"](1)所以,整條式子相當(dāng)于:


網(wǎng)站標(biāo)題:java黑客控制代碼 黑客簡單代碼教學(xué)
本文路徑:http://fisionsoft.com.cn/article/doidois.html