2012-01-11 28 views
5

Tôi có vấn đề không phức tạp ...... dường như phức tạp hơn mức cần thiết.Lỗi bị cấm khi gửi biểu mẫu PHP đơn giản

Tôi có một biểu mẫu đơn giản được sử dụng để thêm nội dung vào trang web. Một số lĩnh vực cần phải có html nhập vào chúng. Tuy nhiên, khi bạn nhập một số phần tử html vào các phần khác nhau của biểu mẫu, nó quyết định rằng nó ghét bạn và ném một lỗi 403 bị cấm. Đây là mẫu bên dưới:

<?php 
    $data = f("SELECT * FROM table WHERE id = '{$_GET['id']}'"); 
?> 
<form action="<?=$_SERVER['PHP_SELF']?>?id=<?=$_GET['id']?>&action=edit" method="post"> 
    <table cellspacing="0" cellpadding="2" border="0"> 
     <tr> 
      <td><b>Title:</b></td> 
      <td><input type="text" name="title" style="width: 300px;" value="<?=$data['title']?>" /></td> 
     </tr> 
     <tr> 
      <td><b>URL:</b></td> 
      <td><input type="text" name="url" style="width: 300px;" value="<?=$data['url']?>" /></td> 
     </tr> 
     <tr> 
      <td><b>Sub-Category:</b></td> 
      <td> 
       <select name="subCategoryId"> 
        <option value=""></option> 
        <option value="1">A</option> 
        <option value="2">B</option> 

       </select> 
      </td> 
     </tr> 
     <tr> 
      <td><b>Short Description:</b></td> 
      <td><textarea name="shortDescription" rows="6" cols="60"><?=$data['shortDescription']?></textarea></td> 
     </tr> 
     <tr> 
      <td><b>Template:</b></td> 
      <td><textarea name="template" rows="6" cols="60"><?=$data['template']?></textarea></td> 
     </tr> 
     <tr> 
      <td><b>Ads:</b></td> 
      <td><textarea name="ads" rows="6" cols="60"><?=$data['ads']?></textarea></td> 
     </tr> 
     <tr> 
      <td><b>Keywords:</b></td> 
      <td><textarea name="keywords" rows="6" cols="60"><?=$data['keywords']?></textarea></td> 
     </tr> 
     <tr> 
      <td><b>Questions:</b></td> 
      <td><textarea name="questions" rows="6" cols="60"><?=$data['questions']?></textarea></td> 
     </tr> 
     <tr> 
      <td><b>Salary:</b></td> 
      <td><textarea name="salary" rows="6" cols="60"><?=$data['salary']?></textarea></td> 
     </tr> 
     <tr> 
      <td><b>Jobs:</b></td> 
      <td><textarea name="jobs" rows="6" cols="60"><?=$data['jobs']?></textarea></td> 
     </tr> 
     <tr> 
      <td><b>Meta Description:</b></td> 
      <td><input type="text" name="metaDescription" style="width: 300px;" value="<?=$data['metaDescription']?>" /></td> 
     </tr> 
     <tr> 
      <td><b>Meta Keywords:</b></td> 
      <td><input type="text" name="metaKeywords" style="width: 300px;" value="<?=$data['metaKeywords']?>" /></td> 
     </tr> 
     <tr> 
      <td>&nbsp;</td> 
      <td><input type="submit" name="submit" value="Edit Job" /></td> 
     </tr> 
    </table> 
</form> 

Tôi có các biểu mẫu khác theo cùng mẫu này mà không gặp bất kỳ sự cố nào. Để tiếp tục làm cho điều này thậm chí còn khó hiểu hơn, nó sẽ chỉ ném lỗi này khi bất kỳ 2 phần tử html nào được cung cấp trong vùng văn bản (nó xử lý một phần tử html tốt). Các khu vực văn bản là quảng cáo, từ khóa, tiền lương và công việc. Các khu vực văn bản khác sẽ chỉ tốt, nhưng 4 sẽ không. Nếu tôi có thể làm cho điều này một chút bối rối, nếu tôi đơn giản nhập vào văn bản trong các lĩnh vực và lưu nó, nó chạy mà không có một vấn đề.

Để xử lý dữ liệu bài đăng, tôi chỉ sử dụng mysql_real_escape_string() để xử lý dữ liệu, tôi không làm một strip_tags() khi tôi cần html trong đó.

Đây có phải là lỗi apache lạ có thể được sửa bằng .htaccess không? Có một mô-đun trong PHP đang xung đột với điều này?

------- EDIT ĐÂY LÀ ĐÁP --------

Ben đưa ra một câu trả lời tuyệt vời mà có lẽ là vấn đề và tôi không thể sửa chữa nó vì thiếu các đặc quyền . Vì vậy, tôi tạo ra một sự kiện onsubmit từ một ý tưởng mà Gerben đã cho tôi và viết javascript sau đây.

function awesome() { 
     elements = document.forms[0].elements; 
     for(var i = 0; i < elements.length; i++) { 
      switch(elements[i].name) { 
       case "ads": 
       case "shortDescription": 
       case "template": 
       case "questions": 
       case "salary": 
       case "jobs": 
        str = elements[i].value; 
        elements[i].value = str.replace(/</g,"#@!"); 
        break; 
      } 
     } 
     return true;  
    } 

Sau đó, khi nhận được, tôi đã tạo str_replace để thay thế # @! quay trở lại < và ít nhất là làm công việc.

Tôi đang ở trên ngựa .... hyaa!

Cảm ơn sự giúp đỡ của bạn. :)

+1

Bạn cũng có thể đăng mã có trách nhiệm xử lý việc gửi không? Đây có thể là một sự chuyển hướng hoặc lỗi xử lý lỗi được tạo ra bởi php xác thực. –

+1

Url có khác nhau khi gửi biểu mẫu, như được cho là url của trang biểu mẫu không? – Gerben

+0

@BenD Thực sự không có bất kỳ mã nào chịu trách nhiệm xử lý việc gửi. Đó là một tuyên bố foreach đơn giản để chạy qua các $ _POST vars và ném một mysql_real_escape_string vào chúng. Không có xác thực javascript nào. Bạn chỉ cần nhấn gửi, nó tải cùng một trang, nó chỉ rơi vào một tuyên bố chuyển đổi mà nên hạ cánh nó trong khu vực để cập nhật thông tin. Nó hoạt động cho tất cả mọi thứ khác (cùng tuyên bố foreach) trên các phần khác của trang web, chỉ cần không ở đây khi nhiều yếu tố html có liên quan. – n0nag0n

Trả lời

7

Vì bạn có thể đăng bài và việc xử lý hậu quả của bạn dường như cực kỳ đơn giản và không thể ném 403 lỗi hoặc chuyển hướng đến các thư mục bị cấm, tôi sẽ nguy hiểm khi bạn đoán đang chạy tường lửa cấp apache. Hãy xem các tập tin cấu hình apache của bạn và kiểm tra xem bạn có đang chạy mod_security hoặc bất kỳ mô-đun tường lửa nào khác được tải hay không. Có một số cách mod_security có thể được cấu hình, bao gồm quét dữ liệu POST cho nội dung html và phản ứng tương ứng. Nếu nó được cấu hình để ngăn chặn tiêm html, điều này có thể là vấn đề của bạn (xem chi tiết cấu hình ở đây: http://www.modsecurity.org/projects/modsecurity/apache/feature_content_injection.html).

Để kiểm tra điều này, hãy thử thêm một tập tin htaccess vào gốc web của bạn (giả sử bạn được phép ghi đè cài đặt apache với htaccess) và thiết lập:

SecFilterEngine Off 

Khởi động lại apache và sau đó xem nếu nó vẫn xảy ra.

Nếu đây là máy chủ chia sẻ hoặc bạn không có khả năng sửa đổi cài đặt apache, bạn có thể thử giải pháp bằng cách sử dụng javascript base64 encodes tất cả dữ liệu trước khi gửi (onsubmit) và sau đó base64_decode ($ _ POST [ ] trong tập lệnh php xử lý nó.

+1

Tôi nghĩ rằng tôi không thể ghi đè lên tính năng đó. Tôi đã làm phpinfo(); và tôi không thấy bất kỳ điều gì về tường lửa hoặc mod_security. Tôi đã thử nhập mã vào một tập tin htaccess và nó đã cho tôi một Internal Server Error 500. Đó là một tài khoản khách hàng và họ đang sử dụng fastwebhost.com mà .... chặn IP của bạn nếu bạn thở sai. – n0nag0n

+0

Cảm ơn sự giúp đỡ của bạn. Tôi đã tìm ra nó với bạn và sự giúp đỡ của Gerben. – n0nag0n

+0

Đó cũng là một ý tưởng tuyệt vời. Của tôi là hơn ...... người mới và ..... yeah chỉ mới làm quen. :) – n0nag0n

1

Chỉ có cùng một loại vấn đề khi gửi cho thấy lỗi 403 nhưng đối với tôi, nó đơn giản vì biểu mẫu quá lớn kích hoạt quy tắc trên mod_security.

Cũng đáng tăng php.ini post_max_size và kích thước kiểm tra sử dụng: $_SERVER['CONTENT_LENGTH']

0

Có thể được abit muộn, nhưng tôi phải đối mặt với một vấn đề tương tự hôm nay trong khi cố gắng để gửi một hình thức thông qua POST. Nó sẽ không cho phép tôi gửi một văn bản với một liên kết và sẽ ném một lỗi bị từ chối 403 cấm bị từ chối. Vô hiệu hóa modsecurity (tôi đã làm điều này từ bảng điều khiển) giải quyết nó!

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