ฟังก์ชั่นที่ใช้สำหรับป้องกัน SQL injuction เบื้องต้น

มีหลายๆเทคนิค และหลายๆ วิธีที่ใช้สำหรับการป้องกันปัญหา SQL injuction หรือการส่งคำสั่งพิเศษเพื่อไปประมวลผมรวมกับคิวรี่ของภาษา SQL โดยเทคนิคโดยทั่วไปที่นิยมใช้คือ

1. ฟังก์ชั่น mysql_real_escape_string() เป็นฟังก์ชั่นสำหรับการเปลี่ยนอักขระพิเศษที่ส่งเข้ามาให้กลายเป็น string ที่ไม่สามารถประผลได้เช่น ถูกส่งคำสั่ง ‘or’ 1=1 เข้ามา ฟังก์ชันจะแปลงให้กลายเป็น \’or\’ 1=1 แทน เป็นต้น

2. trim() หรือ str_replace() ใช้สำหรับการตัดช่องว่างหรือแทนที่ช่องว่างด้วยค่าอื่นๆ เช่น หากส่งคำสั่ง or 1=1 เข้ามา ช่องว่างจะถูกตัดออกทำให้คำสั่งไม่สามารถประมวลผลร่วมกับคำสั่ง SQL ได้

3. เทคนิคการแปลงให้ค่าให้เป็นข้อมูลชนิดใดชนิดหนึ่ง เช่น หากมีการส่งค่า id มาจากตัวแปร $_GET[‘id’] เพื่อเรียกเรคเคอร์ที่มีค่า id เท่ากับ id ที่ส่งมา โดยทั่วไป id ต้องเป็นข้อมูลประเภทตัวเลข หรือ Integer เท่านั้น ดังนั้นก่อนนำค่าที่ได้จาก id ไปทำงานร่วมกับคำสั่ง SQL ควรแปลงค่าที่ถูกส่งมาทั้งหมดให้กลายเป็นตัวเลขโดยอาจใช้

  • ฟังก์ชัน intval (return ค่า integer ของตัวแปรออกมา)
  • ใช้ sprintf(“%d %s”)
  • หรือตรวจสอบค่าในตัวแปรที่รับมานั้นเป็นตัวเลขหรือด้วยฟังก์ชัน is_numuric() เป็นต้น

4. ใช้ฟังก์ชัน bind_param ร่วมกับการทำงานของคำสั่ง SQL ตัวอย่าง php.net

<?php
$mysqli = new mysqli(‘localhost’, ‘my_user’, ‘my_password’, ‘world’);

/* check connection */
if (mysqli_connect_errno()) {
printf(“Connect failed: %s\n”, mysqli_connect_error());
exit();
}

$stmt = $mysqli->prepare(“INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)”);
$stmt->bind_param(‘sssd’, $code, $language, $official, $percent);

$code = ‘DEU’;
$language = ‘Bavarian’;
$official = “F”;
$percent = 11.2;

/* execute prepared statement */
$stmt->execute();

printf(“%d Row inserted.\n”, $stmt->affected_rows);

/* close statement and connection */
$stmt->close();

/* Clean up table CountryLanguage */
$mysqli->query(“DELETE FROM CountryLanguage WHERE Language=’Bavarian'”);
printf(“%d Row deleted.\n”, $mysqli->affected_rows);

/* close connection */
$mysqli->close();
?>

ยังมีอีกหลายๆ เทคนิค หากพบเจอจะนำมาบันทึกและนำเสนอในครั้งๆ ต่อไป

Advertisements

คู่มือการใช้งาน Greenstone ฉบับประยุกต์

ตอนเรียนวิชา Library Automation ได้ลองเล่น ลองใช้งาน Greenstone เอามาทำคลังเก็บเอกสารดิจิทัล ท้ายเทอมมีการทำรายงานคู่มือการใช้งานเบื้องต้นด้วย เห็นว่าน่าจะมีประโยชน์ต่อคนที่เข้ามาอ่านในภายหลัง เนื้อหาในรายงานคร่าวมีดังนี้

การสร้าง Collection ด้วย Greenstone Digital Library
1. ความต้องการพื้นฐานของระบบ
2. การเริ่มต้นใช้งานซอฟต์แวร์สำหรับบรรณารักษ์และผู้จัดทำ Digital Collection
3. การสร้าง Collection และเพิ่มไฟล์เข้าสู่ Collection
4. การกำหนด Metadata ให้แก่ไฟล์ใน Collection
5. การกำหนดหมวดหมู่ย่อยใน Collection ด้วย Metadata
6. การ Build และแสดงตัวอย่าง Collection ที่สร้างขึ้น
7. การสร้างเมนูเพื่อจัดกลุ่มการแสดงผล Collection
8. การติดตั้ง Plug-in สำหรับการดึงสารบัญในไฟล์เอกสาร Word และ PDF
9. การเพิ่มไฟล์มัลติมีเดีย เพลงและวิดีโอ
10. การปรับแต่งการแสดงผล
11. การส่งออก Collection เพื่อการใช้งานบน CD-Rom
การติดตั้งและใช้งาน Collection (มุมมองผู้ใช้งาน)
1. การติดตั้ง Collection ลงบนคอมพิวเตอร์
2. การใช้งานเบื้องต้น
วิเคราะห์จุดเด่นและจุดด้อยของ Greenstone Digital Library

ท่านใดสนใจดาวน์โหลดได้จาก ลิงก์ด้านล่างเลยครับ

ดาวน์โหลดเอกสารรายงาน – re54lib287

จับเวลาการแสดงผลหน้าเว็บไซต์ด้วย microtime()

เริ่มจับเวลาส่วนต้นของเอกสาร

$time_start = microtime(true);

//สคริปต์ทั้งหมดทำงาน

$time_end = microtime(true);
$time = $time_end – $time_start; #เวลาเริ่มต้น – เวลาท้ายสุด

echo “เวลาที่ใช้ในการประมวลทั้งหมด $time วินาที\n”;

บทความการทำงานร่วมกับ sqllite

Creating, dropping, and altering tables in SQLite
http://zetcode.com/db/sqlite/tables/


SQlite ใช้การเปลี่ยนชื่อ คอลัมน์โดยการ สร้างตาราง TEMPORARY ใหม่ที่สร้างขึ้นมา แทรกข้อมูลเก่าลงไปในตาราง TEMPORARY ลบตารางเก่าเอา จากนั้นสร้างตารางใหม่ขึ้นมา แทรกข้อมูลจากตาราง Temp ลงตารางใหม่ และ ลบตาราง Temp ออกในลำดับสุดท้าย

BEGIN TRANSACTION;
CREATE TEMPORARY TABLE t1_backup(a,c);
INSERT INTO t1_backup SELECT a,c FROM t1;
DROP TABLE t1;
CREATE TABLE t1(a,b, c);
INSERT INTO t1 SELECT a,c FROM t1_backup;
DROP TABLE t1_backup;
COMMIT;


ตัวอย่าง PHP เชื่อมต่อกับ SQLite ผ่าน PDO

$db = new PDO(‘sqlite:database_file_name’);

สร้าง ตาราง
/*$sql = “CREATE TABLE members”.
“(id INTEGER PRIMARY KEY AUTOINCREMENT,”.
“username VARCHAR(20) NOT NULL,”.
“email VARCHAR(50),”.
“added_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP);”;

เพิ่มข้อมูล
/*$sql = “INSERT INTO members (id,username,email,added_date) VALUES (null,’username’,’email@mail.com’,'”.date(“Y-m-d H:i:s”).”‘) “;*/

คิวรี่ข้อมูล
/*$sql = “SELECT * FROM members ORDER BY added_date DESC LIMIT 0,50”;
$result = $db->query($sql);
while($row = $result->fetchObject()){
echo “[$row->id]”.$row->name.”|”.$row->email.”|”.$row->added_date.”<br/>”;
}*/

unset($db); #ปิดการเชื่อมต่อ