Ở 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.

261 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.

  19. Wonderful website you have here but I was wondering if you knew of any forums that cover the same topics discussed here?
    I’d really love to be a part of community where I can get advice from other knowledgeable people that share the same interest.
    If you have any suggestions, please let me know. Many thanks!

  20. Right at the present it sounds like BlogEngine is the finest blogging platform available right straight away. (from what I ave read) Is that what you are by on your blog?

  21. It is not acceptable just to think up with an important point these days. You have to put serious work in to exciting the idea properly and making certain all of the plan is understood.

  22. Por lo general, entre más joven sea el hombre, más propenso será a la recuperación de su capacidad de erección total después de la cirugía. Guarde a temperatura ambiente lejos de la humedad y calor.

  23. This is very interesting, You are a very skilled blogger.
    I have joined your rss feed and look forward to seeking more of your wonderful post.
    Also, I’ve shared your web site in my social networks!

  24. Wow, amazing blog layout! How long have you been blogging for? you made blogging look easy. The overall look of your website is magnificent, let alone the content!. Thanks For Your article about sex.

  25. The Birch of the Shadow I believe there may well be considered a number of duplicates, but an exceedingly helpful list! I have tweeted this. Several thanks for sharing!

  26. Undeniably believe that which you said. Your favorite justification appeared to be on the
    net the easiest thing to be aware of. I say to you, I certainly get annoyed while people
    consider worries that they just don’t know about. You managed to hit the nail upon the top and
    also defined out the whole thing without having side effect , people can take a signal.
    Will probably be back to get more. Thanks

  27. Wow, superb blog layout! How lengthy have you been blogging for? you make blogging look straightforward. The all round look of one as webpage is excellent, let alone the content material!

  28. You are my breathing in, I own few web logs and occasionally run out from brand . Analyzing humor is like dissecting a frog. Few people are interested and the frog dies of it. by E. B. White.

  29. Thank you for another excellent post. Where else could anybody get that kind of information in such a perfect way of writing? I ave a presentation next week, and I am on the look for such info.

  30. Wow! This blog looks exactly like my old one! It as on a completely different subject but it has pretty much the same layout and design. Outstanding choice of colors!

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

  32. Interesting website, i read it but i still have a few questions. shoot me an email and we will talk more becasue i may have an interesting idea for you.

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

Please enter your comment!
Please enter your name here