2010-07-07 31 views
5

Tôi hiện đang làm việc trên một khung công tác MVC Style cho một công ty và vì lý do bảo mật tôi cần đảm bảo rằng bộ điều khiển/phương thức được truyền qua Chuỗi truy vấn là ký tự hợp lệ cho RFC (mà tôi không thể tìm thấy).Xác nhận tên lớp/phương thức bằng regex

tôi cần để có thể xác nhận/khử trùng tên lớp theo những gì được cho phép bởi các thông dịch viên PHP

Ví dụ:

class SomEFunk__YClAssName extends Controller 
{ 

} 

Tôi cần một số loại regex mà sẽ xác nhận SomEFunk__YClAssName và khử trùng nó nếu cần thiết! Đây cũng là nguyên tắc tương tự như phương pháp.

Có một số điều cần xem xét như

  • numerics lúc bắt đầu
  • Chỉ gạch dưới cho phép
  • Một số PHP đặc biệt Chars được phép.

Mọi thông tin về biểu thức này hoặc có thể sẽ thực sự hữu ích.

Dưới đây là một số của Bộ luật Router của tôi để bạn có thể nhìn thấy nơi tôi cần phải thực hiện nó:

private function prepareQueryString() 
    { 
     if(strlen($this->query_string) == 0) 
     { 
      return; 
     } 
     //Remove [ending|starting|multiple] slashes 
     $this->query_string = preg_replace('/^\/+|\/+$|\/(?=\/)/', '', $this->query_string); 
     foreach(explode('/',$this->query_string) as $Key => $Value) 
     { 
      if($Key == 0) 
      { 
       $Controller = $this->AssignController($Value); 
      } 
      if($Key == 1) 
      { 
       $this->AssignMethod($Value); 
      }else 
      { 
       $this->AssignParam($Value); 
      } 
     } 

     //Build RouterVar stdClass 
    } 

    public function AssignController(String $Controller) 
    { 
     if(!empty($Controller)) 
     { 
      //Sanitize 
     } 
    } 

    public function AssignMethod(String $Method) 
    { 
     if(!empty($Method)) 
     { 
      //Sanitize 
     } 
    } 

    public function AssignParam(String $Param) 
    { 
     $this->params[] = $Param; 
    } 

Bạn sẽ thấy những bình luận "Làm vệ sinh", nơi kiểm tra là cần thiết.

Trả lời

17

Tôi tin rằng regex bạn đang tìm kiếm là:

<?php 
preg_match('/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$/', $input); 
?> 

Theo: http://php.net/manual/en/language.oop5.basic.php

+0

Cảm ơn bạn về ví dụ mã và liên kết tài liệu. Tôi đã đánh dấu đây là câu trả lời. – Xunnamius

+2

** Chú ý **: Tôi nghĩ có một lỗ hổng trong 'preg_match' của bạn, vì không có dấu phân cách bắt đầu/kết thúc nào được đưa ra. Mã của bạn với '$ input =" Chắc chắn không phải là một tên lớp hợp lệ! "' Sẽ trả về 1. Nếu bạn thay đổi nó thành 'preg_match ('/^[a-zA-Z_ \ x7f- \ xff] [a-zA-Z0- 9_ \ x7f- \ xff] * $/', $ đầu vào); 'nó trả về 0. –

+0

Cuộc gọi tốt trên dấu phân cách bắt đầu/kết thúc. – nate

6

Bạn nên sử dụng cụm từ thông dụng rất chung chung, sau đó kiểm tra xem lớp có tồn tại với một cuộc gọi đơn giản tới class_exists() hay không.

này sẽ phù hợp bất kỳ tên lớp PHP có giá trị, trong đó có những người thực sự kỳ lạ như ___ hoặc _3, cả hai đều là tên lớp hợp lệ:

/^[a-z_]\w+$/i 

Cá nhân tôi hạn chế hơn quy ước đặt tên của PHP cho các lớp học. Tôi yêu cầu các bộ điều khiển của tôi được viết hoa, và sau cố định với _controller để các lớp không điều khiển lạ không được gọi thông qua các URL lạ. Tôi muốn sử dụng một cái gì đó như thế này:

class Products_controller extends Controller { } 

// elsewhere, after parsing the controller name from the URI: 

if (preg_match('/^[A-Z]\w+_controller$/', $controller_name) 
&& class_exists($controller_name)) { 
    $controller = new $controller_name(); 
} 

Ngoài ra, chuyển tên bộ điều khiển qua chuỗi truy vấn sẽ tạo ra URL không thân thiện với công cụ tìm kiếm và URL không thân thiện với công cụ tìm kiếm. Xem xét xây dựng tên điều khiển và phương pháp vào URL:

/products/index # controller=products, action=index 
/users/show/3 # controller=users, action=show, user id=3 
+0

tôi đưa ra làm điều này '^(? = _ * [Az] +) [A-z0-9 _] + $ 'nhưng vẫn có các ký tự được cho phép ví dụ' class € 1 {} 'và' class $$ _ {} ' – RobertPitt

+0

Nếu bạn thực sự muốn gọi bất kỳ lớp học có tên tùy ý, sau đó nghĩa đen tất cả các bạn quan tâm là héo lớp tồn tại. Bỏ qua biểu thức chính quy hoàn toàn, nó không thêm bất cứ thứ gì bảo mật, và chỉ cần kiểm tra 'class_exists()'. – meagar

Các vấn đề liên quan