Ở một số website code bằng PHP thuần thường mắc phải lỗi SQL injection là do lập trình viên không biết đến lỗi này hoặc biết nhưng không tìm cách khắc phục nó. Trước đây chúng ta hay sử dụng hàm addslashes() trong PHP để khắc phục nhưng bây giờ các thư viện xử lý database cũng đã đưa ra cơ chế prepared nhằm hạn chế lỗi bảo mật này.

Nội dung chính

  • 1. Cơ chế prepared câu SQL
  • 2. Prepared câu SQL trong MySQLi
  • 3. Prepared câu SQL trong PDO
  • 4. Lời kết
  1. Cơ chế prepared câu SQL

Trước đây nếu truyền tham số vào câu truy vấn thì chúng ta hay thực hiện như ví dụ dưới đây:

1

2

3

4

$username = $_POST[‘username’];

$password = $_POST[‘password’];

 

$sql = “select * from users where username = ‘$username’ and password = ‘$password'”;

Đây là cách gán chuỗi thông thường và sẽ mắc phải lỗi SQL injection. Ta có một cách khác sẽ khắc phục được phần nào đó là sử dụng hàm addslashes().

1

2

3

4

$username = addslashes($_POST[‘username’]);

$password = addslashes($_POST[‘password’]);

 

$sql = “select * from users where username = ‘$username’ and password = ‘$password'”;

Bây giờ người ta đã không sử dụng cách trên nữa mà sử dụng chức năng có sẵn trong các thư viện MySQLi và PDO. Mỗi thư viện có cách thể hiện khác nhau nhưng chúng đều có chung một quy tắc đó là:

  • Chúng ta đưa vào một câu truy vấn với các tham số là một ẩn danh
  • Chúng ta truyền vào giá trị tương ứng cho các ẩn danh đó
  • PHP sẽ dựa vào thư tự các tham số ẩn danh và các giá trị để repared sao bảo mật nhất.
  • Cuối cùng sẽ thực thi câu truy vấn.
  • Khi bạn đã khai báo các tham số lần đầu rồi và sau đó muốn sử dụng tiếp thì không cần phải khai báo nữa. Đây cũng chính là lợi thế của cơ chế prepared trong PHP.

Để dễ hiểu hơn thì bạn nên đọc qua phần 2 và phần 3 dưới đây.

  1. Prepared câu SQL trong MySQLi

Chúng ta chỉ thực hiện Prepared trong trường hợp sử dụng MySQLi Object-oriented.

Các tham số truyền vào sở là các dấu chấm hỏi ?, đây chính là tham số ẩn danh.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

// Kết nối

$conn = new mysqli(‘localhost’, ‘root’, ‘vertrigo’, ‘FreetutsDemo’);

 

// kiểm tra kết nối

if ($conn->connect_error) {

die(“Kết nối thất bại: ” . $conn->connect_error);

}

 

// Câu SQL

$sql = “INSERT INTO News (title, content) VALUES (?, ?)”;

 

// Tạo đối tượng repared

$stmt = $conn->prepare($sql);

 

// Gán giá trị vào các tham số ẩn

$stmt->bind_param(“ss”, $title, $content);

 

// Thực thi câu truy vấn lần 1

$title = ‘Tiêu đề 1’;

$content = ‘Nội dung 1’;

$stmt->execute();

 

// Thực thi câu truy vấn lần 2

$title = ‘Tiêu đề 2’;

$content = ‘Nội dung 2’;

$stmt->execute();

 

echo “Thêm thành công!”;

 

// Giải phóng và ngắt kết nối

$stmt->close();

$conn->close();

Trong đoạn code trên có nhiều vướng mắc mà có lẽ bạn sẽ không hiểu nên mình sẽ giải thích thêm.

Thứ nhất: Câu SQL

1 $sql = “INSERT INTO News (title, content) VALUES (?, ?)”;

Trong câu SQL này thì hai dấu ? chính là hai tham số ẩn danh.

Thứ hai: Thực hiện bind data

1 $stmt->bind_param(“ss”, $title, $content);

Giá trị đầu tiên là hai chữ ss, đây chính là khai báo dữ liệu cho hai tham số ẩn danh ở trên. Ý nghĩa như sau:

  • i: interger
  • d: double
  • s: string
  • b: blob

Còn hai tham số $title và $content chính là hai tham số dạng tham chiếu nên dù chưa được khai báo nhưng vẫn không bị lỗi.

Những đoạn code còn lại quá đơn giản nên mình không giải hích thêm.

  1. Prepared câu SQL trong PDO

Với PDO thì cú pháp có hơi khác chút xíu đó là tham số ẩn không phải là dấu hỏi nữa mà là ở dạng :varname.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

try {

// Kết nối

$conn = new PDO(“mysql:host=localhost;dbname=FreetutsDemo”, ‘root’, ‘vertrigo’);

// Khai baso exception

$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

 

// prepare sql and bind parameters

$stmt = $conn->prepare(“INSERT INTO News (title, content) VALUES (:title, :content)”);

$stmt->bindParam(‘:title’, $title);

$stmt->bindParam(‘:content’, $content);

 

// Thêm lần 1

$title = ‘Tiêu đề 1’;

$content = ‘Nội dung 1’;

$stmt->execute();

 

// Thêm lần 2

$title = ‘Tiêu đề 2’;

$content = ‘Nội dung 2’;

$stmt->execute();

 

echo “Thao tác thành công!”;

}

catch (PDOException $e) {

echo “Error: ” . $e->getMessage();

}

 

// Ngắt kết nối

$conn = null;

Giải thích như phần MySQLi nên nếu ban không hiểu thì hãy đọc lại phần 2 nhé.

  1. Lời kết

Như vậy là mình đã giới thiệu cách sử dụng cơ chế Prepared câu SQL trong PHP bằng hai thư viện MySQli và PDO, đây là cách chúng ta nên sư dụng để thực thi các câu truy vấn khi làm ứng dụng thực tế bởi nó tránh được lỗi SQL Injection. Bài tiếp theo chúng ta sẽ tìm hiểu cách lấy dữ liệu từ MySQL trong PHP.

57 BÌNH LUẬN

  1. I’m really enjoying the design and layout of your site.
    It’s a very easy on the eyes which makes it much more enjoyable for me to
    come here and visit more often. Did you hire out a designer to create your theme?

    Exceptional work!

  2. We stumbled over here different web address and
    thought I might check things out. I like what I see so now i am following you.
    Look forward to looking at your web page again.

  3. I like the helpful info you provide in your articles.
    I’ll bookmark your blog and check again here frequently.

    I’m quite certain I will learn a lot of new stuff right here!
    Best of luck for the next!

  4. Hey there! Someone in my Myspace group shared this
    site with us so I came to take a look. I’m definitely loving the information. I’m bookmarking and will be tweeting this to my followers!

    Exceptional blog and superb style and design.

  5. You can definitely see your skills within the article you write.
    The sector hopes for even more passionate writers
    such as you who aren’t afraid to say how they believe.
    At all times go after your heart.

  6. I like the valuable info you provide in your articles.
    I will bookmark your weblog and check again here regularly.
    I’m quite sure I will learn a lot of new stuff right here!
    Best of luck for the next!

  7. It’s perfect time to make some plans for the longer term
    and it’s time to be happy. I have read this put up and if I may I
    want to counsel you few interesting issues or suggestions.
    Maybe you could write next articles referring to this
    article. I want to learn even more things about it!

  8. Greetings from Ohio! I’m bored at work so I decided to browse your site on my iphone during lunch break.
    I enjoy the information you present here and can’t wait to take a look when I get home.
    I’m shocked at how quick your blog loaded on my mobile ..
    I’m not even using WIFI, just 3G .. Anyhow, very good site!

  9. Heya i am for the first time here. I found this board and I to find It really helpful & it helped me out a lot.
    I’m hoping to offer something again and help others such as you
    helped me.

  10. hello!,I love your writing so much! proportion we keep up a correspondence extra approximately your article on AOL?
    I need a specialist on this area to unravel my problem.

    Maybe that is you! Taking a look ahead to peer you.

  11. Thanks for ones marvelous posting! I definitely enjoyed
    reading it, you can be a great author.I will remember to bookmark
    your blog and definitely will come back sometime soon. I want
    to encourage you to definitely continue your great job, have a nice evening!

  12. Pretty great post. I just stumbled upon your blog and wished to mention that I have really
    enjoyed browsing your blog posts. After all I
    will be subscribing to your rss feed and I am hoping you write again very soon!

  13. Wow! This could be one particular of the most useful blogs We ave ever arrive across on this subject. Basically Excellent. I am also a specialist in this topic so I can understand your hard work.

  14. Your style is unique compared to other folks I have read stuff from. I appreciate you for posting when you ave got the opportunity, Guess I will just bookmark this page.

  15. I Will have to visit again when my course load lets up аАа’аАТ‚б‚Т€Т nonetheless I am taking your Rss feed so i could read your web blog offline. Thanks.

  16. Usually I don at read article on blogs, but I would like to say that this write-up very compelled me to try and do it! Your writing style has been amazed me. Thanks, very nice post.

  17. We stumbled over here coming from a different web address and thought I may as well check things out. I like what I see so i am just following you. Look forward to looking at your web page repeatedly.

  18. Hello! I know this is kinda off topic but I was wondering
    which blog platform are you using for this website?
    I’m getting fed up of WordPress because I’ve had problems with hackers and I’m looking at options for another platform.
    I would be fantastic if you could point me in the direction of a good
    platform.

THOÁT KHỎI BÌNH LUẬN

Please enter your comment!
Please enter your name here