"?" Là gì? biểu tượng trong URL được sử dụng cho trong php?


10

Tôi mới sử dụng PHP. Trong con đường học tập ngôn ngữ PHP, tôi nhận thấy rằng, một số trang web sẽ loại URL:

www.website.com/profile.php?user=roa3 & ...

Câu hỏi của tôi:

  1. "?" Là gì? biểu tượng được sử dụng cho?

  2. Nếu tôi phát triển trang web php, tôi có nên sử dụng nó trong URL của mình không? Ví dụ: sau khi người dùng (roa3) đăng nhập thành công, tôi sẽ chuyển hướng đến "www.website.com/profile.php?user=roa3" thay vì "www.website.com/profile.php"

  3. Những lợi thế và bất lợi của việc sử dụng nó là gì?

21

câu hỏi tốt, một thời gian ngắn,

  1. "?" là viết tắt của bắt đầu truy vấn chuỗi chứa dữ liệu được chuyển đến máy chủ. trong trường hợp này là bạn đang chuyển người dùng = roa3 đến trang profile.php. Bạn có thể lấy dữ liệu bằng cách sử dụng $ _GET ['người dùng'] trong vòng profile.php. querystring là một trong những phương thức để gửi dữ liệu đến máy chủ từ tác nhân máy khách. Một cái khác đặt dữ liệu trong cơ thể HTTP và POST lên máy chủ, bạn không thấy dữ liệu HTTP POST trực tiếp từ trình duyệt.

  2. chuỗi truy vấn có thể được chỉnh sửa bởi người dùng và hiển thị công khai. Nếu www.website.com/profile.php?user=roa3 được dự định công khai thì đó là tiền phạt, nếu không bạn có thể muốn sử dụng phiên để nhận bối cảnh của người dùng hiện tại.

  3. nó là một cách linh hoạt để truyền dữ liệu cho máy chủ, nhưng nó có thể nhìn thấy và có thể chỉnh sửa cho người sử dụng, đối với một số dữ liệu nhạy cảm, ít nhất là sản xuất một số loại băm trước khi gắn nó vào chuỗi truy vấn , điều này ngăn không cho người dùng chỉnh sửa hoặc hiểu được ý nghĩa của nó . Tuy nhiên, điều này không ngăn chặn một hacker tốt để làm điều gì đó sai về trang web của bạn. Các trình duyệt khác nhau hỗ trợ độ dài tối đa khác nhau của URL, URL dài được tạo bởi các tham số chuỗi truy vấn đó. Nếu bạn muốn gửi lượng lớn dữ liệu, hãy đặt dữ liệu trong phần thân HTTP và POST lên máy chủ.


0

Từ quan điểm của máy chủ, phải không? chỉ là một nhân vật khác. PHP cung cấp phương pháp dễ dàng cho các phần của URL sau khi? nhân vật, ví dụ: cho "/profile.php?user=roa3", PHP sẽ đặt $ _GET ['user'] = 'roa3'.

Lý do? hữu ích trong URL là trình duyệt có thể tạo URL động bằng cách sử dụng biểu mẫu - trong trường hợp trên, tôi hy vọng rằng URL được tạo bởi biểu mẫu HTTP có trường "người dùng", trong đó người dùng đã nhập "roa3".

  0

Điều này là sai. Các "?" không phải là "chỉ một nhân vật khác" đối với máy chủ. Máy chủ chia tách URL trên "?" (nếu có một). Phần trước là tệp được yêu cầu và phần sau là "chuỗi truy vấn", được trình bày với CGI làm biến môi trường QUERY_STRING. 22 feb. 092009-02-22 07:14:31

+1

Tôi có lẽ đã nói rằng các máy chủ * nói chung * không được dự kiến ​​sẽ xử lý nó đặc biệt. Trong trường hợp của PHP (và hầu hết các khung công tác web khác), một số xử lý được cung cấp, khi tôi tiếp tục thảo luận. Câu hỏi không chỉ rõ CGI ở đâu. 22 feb. 092009-02-22 07:46:21

+1

Nó có thể không đặc biệt với máy chủ, nhưng nó là một phần của tiêu chuẩn HTTP chứ không phải là php. 22 feb. 092009-02-22 08:34:06

  0

Cứng đầu bám vào súng của tôi ở đây :-) Chỉ có một sự khác biệt hiệu quả? trong RFC21616, S13.9: "bộ đệm không được xử lý câu trả lời cho [truy vấn URI] như mới trừ khi máy chủ cung cấp thời gian hết hạn rõ ràng." Điều đó hầu như không có liên quan. 22 feb. 092009-02-22 09:20:46

+1

Được rồi, bốn downvotes cho một câu trả lời cơ bản đúng (với một caveat nhỏ) chắc chắn là quá mức và đánh dấu nó tấn công là hoàn toàn ... tốt, gây khó chịu! 22 feb. 092009-02-22 10:59:14


0
  1. "?"được sử dụng để tách URL và các tham số. Ví dụ: nó giống như http://www.url.com/resourcepath?a=b&c=d. Trong trường hợp này a = b giống như request_parameter = request_value.

  2. Ya, Không nên sử dụng nhiều tham số vì tổng số kích thước url bị giới hạn và nó giống như yêu cầu GET, trong đó tất cả các tham số được hiển thị trên url và người dùng có thể sửa đổi nó. Trong ví dụ của bạn, hãy nói điều gì sẽ xảy ra nếu người dùng sửa đổi url thành "user = techmaddy".

  3. Ưu điểm là nó có thể được sử dụng cho loại yêu cầu GET. Nhược điểm là bảo mật thấp, giới hạn về kích thước.


4

1) Nếu người dùng đăng nhập vào trang web của bạn, bạn sẽ sử dụng Sessions để lưu trữ có tên thay vì đi qua nó trong url ví dụ profile.php?username=roa3

2) Sử dụng một biểu tượng ? trong các url thường được xem là xấu cho Search Engine Optimization. Ngoài ra, các url trông hơi xấu xí. Sử dụng mod_rewrite bạn có thể thực hiện tương tự như profile.php?user=roa3 hoặc products.php?id=123&category=toys với: site.com/profile/roa3 hoặc products/toys/123.

Sử dụng khung CodeIgniter sẽ cung cấp cho bạn URL thân thiện theo mặc định và loại bỏ nhu cầu cho ? giây trong url của bạn. Xem this page để biết ví dụ.

3) Biểu tượng ? cũng được sử dụng bên trong mã của trang php. Ví dụ, một if else khối như:

if ($x==1) 
    $y=2; 
else 
    $y=3; 

cũng có thể được viết như sau: "?"

$y=($x==1) ? 2 : 3; 

3

Các biểu thị rằng một số biến GET phải tuân theo. Ví dụ của bạn sử dụng một biến được gọi là "người dùng" và gán một biến được gọi là "roa3".

Ưu điểm của việc sử dụng các biến GET:

  • chúng có thể được đánh dấu như là một phần của URL

Nhược

  • họ là công khai .. Bất cứ ai cũng có thể đánh chặn và xem thông tin này . Các yêu cầu url này thậm chí được lưu trữ bởi các máy chủ trong suốt hành trình. Vì vậy, bất cứ ai có thể mạo danh người dùng roa3 của bạn chỉ bằng cách gõ thông tin vào bằng tay ... họ cũng có thể thay đổi roa3 cho một người dùng khác nhau và mạo danh họ ..

Bạn cũng có thể sử dụng một biểu tượng "&" để tách nhiều biến ví dụ: www.website.com/profile.php?user=roa3&fav_colour=blue

tùy chọn khác:

  • POST biến

    • Bạn có thể gửi các biến của mình thông qua các biến POST.Các biến này được chuyển vào tiêu đề của yêu cầu chứ không phải url của yêu cầu. chúng không rõ ràng ngay lập tức, và không được lưu trữ bởi các máy chủ cùng với hành trình, nhưng chúng vẫn có thể được đọc. trừ khi bạn thiết lập một conection HTTPS.
    • biến trong biểu mẫu có thể được gửi bằng phương thức POST hoặc GET .. Bạn chỉ định điều này trong "phương thức" của biểu mẫu. <form action="index.php" method='post'/>
  • biến PHIÊN

    • biến Session được lưu trữ trên máy chủ. Id phiên được chuyển cho người dùng và id phiên này được chuyển trở lại máy chủ mỗi lần người dùng thực hiện một yêu cầu khác. Id phiên này có thể được sử dụng để nhận các biến phiên được lưu trữ. Vì vậy, bạn có thể lưu trữ màu sắc yêu thích của người dùng, tên của họ, và địa chỉ ip vv .. nhưng bạn có thể lưu trữ nó trên máy chủ teh thay vì máy tính gia đình của người dùng.
      Id phiên có thể được mạo danh, vì vậy bạn nên kiểm tra IP của người dùng và để bọc chúng trong một conection an toàn. ví dụ: https.
    • biến phiên không thể được thay đổi bởi người đã chặn yêu cầu.
  • COOKIE biến:
    Tương tự như các biến phiên, ngoại trừ việc chúng được lưu trữ trên máy tính của người dùng, không phải là máy chủ. Chúng được lưu trữ trên một miền, và khi chúng đi đến miền đó, chúng sẽ gửi lại các biến trong tiêu đề của yêu cầu tới máy chủ .. điều này có nghĩa là người dùng có thể thay đổi và hack các biến, hoặc một người khác có thể.

Để truy cập các biến trong php bạn có thể sử dụng:

  • $x = $_GET['user'] cho một được biến
  • $x = $_POST['user]
  • $x = $_REQUEST['user'] - sự kết hợp của nhận được, bưu chính, cookie sẽ biến
  • $x = $_COOKIE['user'] - biến cookie
  • $x = $_SESSION['user'] để truy cập các biến session

(user có thể được thay thế bằng tên của biến bạn đang sử dụng)

thứ đủ đơn giản, nhưng quan trọng là phải biết những gì họ thực sự làm.

+1

Kiểm tra id phiên đối với IP không phải là tuyệt vời nếu mọi người ngồi sau một số trang trại proxy có nhiều địa chỉ IP. Ngoài ra, những người chia sẻ một proxy sẽ vẫn không được che chắn từ người khác. Ứng dụng phải xử lý điều này theo một cách khác - nếu bạn xử lý dữ liệu nhạy cảm: Sử dụng https. 22 feb. 092009-02-22 08:22:07

  0

vâng, điều đó đúng. Kiểm tra ip của chống lại các phiên sẽ cung cấp cho an ninh tăng lên, nhưng nó sẽ để lại một số lỗ lớn. Việc thiết lập phiên sau https được thiết lập luôn an toàn nhất. 22 feb. 092009-02-22 09:41:42

  0

Chỉ cần một sidenote: Nó là hợp pháp để sử dụng ';' để tách riêng GET vars. Mặc dù tôi đã không bao giờ nhìn thấy nó và do đó sẽ không khuyên bạn nên nó. 06 may. 102010-05-06 07:35:19


6

Hầu hết các câu trả lời tôi đã thấy từ trước đến giờ đều là về PHP, trong thực tế, đây không phải là ngôn ngữ cụ thể. Các câu trả lời được đưa ra từ khung nhìn của PHP và các phương thức bạn sẽ sử dụng để truy cập thông tin khác nhau từ ngôn ngữ này sang ngôn ngữ khác, nhưng định dạng trong đó dữ liệu nằm trong URL (được gọi là Chuỗi truy vấn) giống nhau (Ví dụ: page.ext? key1 = value & key2 = giá trị & ...).

Tôi không biết nền tảng kỹ thuật của bạn hoặc kiến ​​thức, vì vậy hãy tha thứ cho tôi ...

Có hai phương pháp khác nhau cho một trang web để cung cấp dữ liệu lại cho máy chủ web. Chúng được gọi là phương thức POST hoặc GET. Ngoài ra còn có một loạt những người khác, nhưng không ai trong số đó nên được sử dụng trong bất kỳ loại thiết kế web khi giao dịch với một người dùng bình thường.Phương thức POST được gửi tới máy chủ và có nghĩa là cho dữ liệu 'tải lên', trong khi phương thức GET hiển thị cho người dùng dưới dạng Chuỗi truy vấn trong URL và chỉ có nghĩa là thông tin 'nhận' theo nghĩa đen.

Không phải tất cả các trang web đều tuân theo quy tắc này, nhưng có thể có lý do tại sao. Ví dụ: một trang web có thể sử dụng POST để lưu trữ bộ nhớ cache của máy chủ proxy hoặc trình duyệt của bạn hoặc vì chúng sử dụng các ngôn ngữ byte kép và có thể gây ra sự cố khi cố gắng thực hiện GET vì chuyển đổi mã hóa.

Một số tài nguyên về hai phương pháp và khi nào thì sử dụng chúng ...

http://www.cs.tut.fi/~jkorpela/forms/methods.html http://weblogs.asp.net/mschwarz/archive/2006/12/04/post-vs-get.aspx http://en.wikipedia.org/wiki/Query_string

Bây giờ từ một vị trí đúng PHP, hiện nay có 3 mảng khác nhau mà bạn có thể sử dụng để có được thông tin một trang web đã gửi lại cho máy chủ. Bạn phải ý của bạn ...

  • $ _POST [ 'KeyName'], để lấy chỉ các thông tin từ một phương thức POST
  • $ _GET [ 'KeyName'], để lấy chỉ thông tin từ GET phương thức
  • $ _REQUEST ['keyname'], để cho phép bạn lấy POST, GET và bất kỳ thông tin COOKIE nào có thể đã được gửi. Sắp xếp một catchall, đặc biệt là trong trường hợp bạn không biết phương thức nào một trang có thể đang sử dụng để gửi dữ liệu.

Không bị cẩu thả bằng cách truy cập trực tiếp bằng phương thức $ _REQUEST. Trừ khi bạn có một trường hợp như tôi đã đề cập ở trên cho biến $ _REQUEST, sau đó không sử dụng nó. Bạn muốn thử và sử dụng phương thức 'từ chối tất cả và chỉ cho phép x, y, z' khi nói đến bảo mật. Chỉ tìm kiếm dữ liệu mà bạn biết trang web của riêng bạn sẽ gửi, chỉ tìm kiếm các kết hợp mà bạn sẽ mong đợi và làm sạch tất cả thông tin trước khi bạn sử dụng nó. Ví dụ:

  • Không bao giờ thực hiện eval() trên bất kỳ thứ gì được chuyển qua các phương pháp trên. Tôi chưa bao giờ thấy điều này được thực hiện, nhưng nó không có nghĩa là mọi người đã không cố gắng hoặc làm.
  • bao giờ sử dụng các thông tin trực tiếp với cơ sở dữ liệu mà không làm sạch chúng (nghiên cứu về các cuộc tấn công SQL injection nếu bạn không quen thuộc với họ)

này là của xa không phải là kết thúc tất cả, hãy để tất cả-PHP an ninh nhưng chúng tôi không ở đây vì điều đó. Nếu bạn muốn biết nhiều hơn dọc theo dòng, thì đó là một câu hỏi khác cho SO.

Hy vọng điều này sẽ giúp và cảm thấy tự do khi đặt bất kỳ câu hỏi nào.

+1

Bạn cũng có thể truy cập thông tin cookie với $ _COOKIE. 22 feb. 092009-02-22 11:22:23


1

? là một phần của tiêu chuẩn HTTP và không phải là một phần của PHP. Nghĩ rằng tôi nên chỉ ra rằng khi bạn chuyển sang ngôn ngữ khác và nhìn thấy nó một lần nữa bạn không nhầm lẫn nghĩ rằng có PHP liên quan.

Nếu không, có một số câu trả lời tuyệt vời ở trên.