Skip to content

Zeroplex 生活隨筆

軟體開發、伺服器和生活瑣事

小 縮小字型大小。 中 重設字型大小。 大 放大字型大小。

標籤: 程式設計

PHP 梨子

Posted on 2007 年 5 月 7 日2021 年 3 月 12 日 By 日落 在〈PHP 梨子〉中有 1 則留言

Pear PHP 是一個專門用來快速開發 PHP 程式的函式庫,包含驗證、資料庫、HTML Form等等。有了這些函式庫,大部分常用的功能都不必在自己動手寫,甚至連 HTML 的 JavaScript 都幫你做好了。

你如果有在寫 PHP,應該對 AppServ 也分常熟悉。其實 AppServ 已經偷偷放了 Pear PHP 的安裝批次檔,會自動幫你從網路上把 Pear 函式庫的檔案放置到預設位置,只要在 php.ini 中稍微改一下,就可以開始使用 Pear 函式庫,過程不到五分鐘!

首先到 AppServphp5 目錄下,會找到 go-pear.bat 批次檔,點二下執行。安裝過程中全部使用預設值就可以了。

待結束,開啟 windowsphp.ini,看看檔案最後方是不是已經加入:

;***** Added by go-pear
include_path=".;C:AppServphp5pear"
;*****

有的話,在寫程式時就可以不必在 require 時打入函式庫的絕對位址,直譯器會自動幫找到對應的位置。

Tags:PHP, 程式設計

CakePHP 中文教學手冊

Posted on 2007 年 5 月 4 日2021 年 3 月 12 日 By 日落 在〈CakePHP 中文教學手冊〉中有 2 則留言

CakePHP 是有點類似 Ruby on Rail 的套件,有很多已經寫好的函式庫可以使用,要快速開發一個系統,用 CakePHP 會非常有幫助!

這是我找到的一個中文手冊,寫的簡單明瞭,適合第一次接觸 CakePHP 的人閱讀。

http://www.ezluk.org/Posts/chapter/0

Tags:PHP, 程式設計

不安全的投票系統

Posted on 2007 年 4 月 26 日2021 年 3 月 12 日 By 日落 在〈不安全的投票系統〉中尚無留言

今天碰巧遇到一個不安全的投票系統,被我抓到幾個漏洞惡搞,順便做一下筆記免得自己以後也犯了這個錯誤。

下圖是一個幼稚園的「親子臉」比賽,總投票人數已經超過 70 萬人,第一名還有 50 萬票,如果這是真的,我看他以後可以準備去選總統了。

錯誤一:沒有鎖 IP
嚴謹的網路投票系統,至少會對已投票的 IP 進行封鎖,雖然 ADSL 用戶斷線重新連線後可以取得新的 IP,但是可以減少做票的可能性。這個投票系統是使用 cookies 當作以投票的依據,但是 cookies 可以刪除,甚至我可以讓瀏覽器不儲存 cookies,這樣不是很容易做票嗎?

錯誤二:後端沒有做驗證
其實在網頁上面已經用 JavaScript 寫好一人只能選二票的規則,但是我可以把網頁另存新檔以後在改寫,把 JavaScript 全部修掉讓表單資料直接送出,很容易做到。

因為前端做了檢查後端就直接處理資料,實在是很粗心大意。因為如此,我可以用 JMeter 直接把資料用 POST 的方式送出去讓他處理,另外我發現更好玩的事情:他用無限迴圈處理資料直到結束才跳出迴圈,所以我可以一次送出超過投票選項數量的資料,明明只有 23 個選項,我一次送出 500 個結果,他照樣新增進資料庫裡一點都不懷疑。

大家應該知道 JMeter 是什麼東西,用了以後的結果就是:他的伺服器性能每秒能處理 250 query 左右,還算不錯。 :P

Tags:程式設計, 資訊安全

用 Java 寫 C 語言的 system pause

Posted on 2007 年 3 月 31 日2021 年 3 月 12 日 By 日落 在〈用 Java 寫 C 語言的 system pause〉中有 6 則留言

C 語言中 stdlib.h 函式庫中有提供一個 system() 函式讓使用者可以直接對作業系統下指令,但是 Java 裡面似乎沒有這類的函式,所以執行文字介面的 Java 程式並沒辦法使用 system(“pause”) 讓程式暫停。

C 語言中除了用上面的方式暫停,也可以使用 getc() 來等待輸入,所以 Java 可以利用這點來達到暫停的效果。

下面這段程式是以 System.in.read() 函式來等待輸入。

public class wait{

public static void main(String[] args){
System.out.print("Press enter to exit....");
try{
System.in.read();
}catch(Exception e){};
}
}

你也可以使用 Scanner 來接收輸入。

import java.util.Scanner;

public class wait{
public static void main(String[] args){
int a,b;
Scanner input = new Scanner(System.in);
System.out.print("Press enter to exit....");
input.hasNextLine();
}
}

這樣程式要按下 Enter 鍵才會結束關閉。但是這個寫法有個缺點,就是如果按其他的按鍵沒有作用,也就是只能按 Enter 鍵才會結束,其他的則會顯示在螢幕上面直到 Enter 鍵被按下。

Tags:程式設計

在 Java 中讓不同的按鍵有不同的動作

Posted on 2007 年 3 月 8 日2021 年 3 月 12 日 By 日落 在〈在 Java 中讓不同的按鍵有不同的動作〉中尚無留言

通常一個視窗中會有多個不同的按鈕,點下按鈕後,按鈕會分別有不同的動作。

假設我們寫了一個 JTextArea 讓使用者輸入資料,當按下「Add Line」按鈕時會自動換行,按下「Exit」按鈕時會結束程式。

程式碼:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class panel0 {

JFrame frame = new JFrame();
JPanel panel = new JPanel();
JButton b1 = new JButton("Exit");
JButton b2 = new JButton("Add Line");
JTextArea text = new JTextArea(5,10);
JPanel panelControl = new JPanel();



public static void main(String[] arg){
panel0 gui = new panel0();
gui.go();
}

public void go(){

panel.setBackground(Color.gray);
panel.setLayout(new BoxLayout(panel,BoxLayout.Y_AXIS));

panelControl.setBackground(Color.gray);
panelControl.setLayout(new BoxLayout(panelControl,BoxLayout.X_AXIS) );

text.setLineWrap(true);
JScrollPane scroller = new JScrollPane(text);
scroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

b1.addActionListener(this);
b2.addActionListener(this);

text.setText("Test string....n");
panel.add(scroller);
panelControl.add(b2);
panelControl.add(b1);

frame.getContentPane().add(BorderLayout.CENTER,panel);
frame.getContentPane().add(BorderLayout.SOUTH,panelControl);

frame.setSize(300,300);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public void actionPerformed(ActionEvent e){
if( e.getSource() == b1 )
System.exit(0);
else
text.append("new linen");
}

}

因為 JButton 所呼叫的 ActionListener 都會呼叫 actionPerfomed(),所以只好在此函式內判斷到底是哪個按鈕呼叫的,在依照不同的來源執行不同的動作。

public void actionPerformed(ActionEvent e){
if( e.getSource() == b1 )
System.exit(0);
else
text.append("new linen");
}

但是這樣寫一點會使的整個程式架構混亂,尤其是按鈕需要值型的動作很複雜時,以後要維護程式碼會變的很麻煩,因此要換一個方式來做。

Java 中有個東西叫做 inner class,也就是 class 中的 class。 Inner class 可以存取 outer class 中的變數和函式,但是要注意的是 inner class 是當 outer class 被建立時才會跟著一起被建立,不會單獨存在。

這時要為每個 JButton 建議一個 inner class:

class buttonListenerEXIT implements ActionListener{
public void actionPerformed(ActionEvent e){
System.exit(0);
}
}

class buttonListenerNewLine implements ActionListener {
public void actionPerformed(ActionEvent e){
text.append("new linen");
}
}

建立好 inner class 之後,要讓 JButton 的 ActionListener 會去呼叫寫好的函式:

b1.addActionListener(new buttonListenerEXIT());
b2.addActionListener(new buttonListenerNewLine());

改好之後,整個程式會變成這樣:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class panel0 {

JFrame frame = new JFrame();
JPanel panel = new JPanel();
JButton b1 = new JButton("Exit");
JButton b2 = new JButton("Add Line");
JTextArea text = new JTextArea(5,10);
JPanel panelControl = new JPanel();



public static void main(String[] arg){
panel0 gui = new panel0();
gui.go();
}

public void go(){

panel.setBackground(Color.gray);
panel.setLayout(new BoxLayout(panel,BoxLayout.Y_AXIS));

panelControl.setBackground(Color.gray);
panelControl.setLayout(new BoxLayout(panelControl,BoxLayout.X_AXIS) );

text.setLineWrap(true);
JScrollPane scroller = new JScrollPane(text);
scroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

b1.addActionListener(new buttonListenerEXIT());
b2.addActionListener(new buttonListenerNewLine());

text.setText("Test string....n");
panel.add(scroller);
panelControl.add(b2);
panelControl.add(b1);

frame.getContentPane().add(BorderLayout.CENTER,panel);
frame.getContentPane().add(BorderLayout.SOUTH,panelControl);

frame.setSize(300,300);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

class buttonListenerEXIT implements ActionListener{
public void actionPerformed(ActionEvent e){
System.exit(0);
}
}

class buttonListenerNewLine implements ActionListener {
public void actionPerformed(ActionEvent e){
text.append("new linen");
}
}
}

Tags:Java, 程式設計

文章分頁

上一頁 1 ... 12 13 14 15 下一頁

其他

關於我  (About me)

小額贊助

  文章 RSS Feed

  留言 RSS Feed

Apache AWS Bash C/C++ Docker FreeBSD GCP Git Google Java JavaScript Laravel Linux Microsoft MSSQL MySQL Nginx PHP PHPUnit PostgreSQL Python Qt Ubuntu Unix Vim Web Windows WordPress XD 作業系統 分享 好站推薦 專題 攝影 新奇搞笑 新聞 旅遊 生活雜記 程式設計 網路架站 網頁設計 資訊學習 資訊安全 遊戲 音樂


創用 CC 授權條款
本著作係採用創用 CC 姓名標示-相同方式分享 4.0 國際 授權條款授權.