Mengubah Suai Parameter Permintaan dengan Penapis Servlet
Masalah:
Kerentanan keselamatan (XSS) wujud dalam aplikasi web sedia ada yang dihoskan pada Tomcat 4.1. Disebabkan oleh pengehadan dalam mengubah suai kod sumber, penapis servlet sedang dipertimbangkan untuk membersihkan parameter sensitif sebelum menghantarnya ke halaman yang terdedah. Walau bagaimanapun, antara muka ServletRequest tidak mempunyai kaedah setParameter untuk mengubah nilai parameter.
Penyelesaian:
Pilihan 1: Subkelas HttpServletRequestWrapper
Walaupun HttpServletRequest tidak mempunyai kaedah yang diingini, kelas HttpServletRequestWrapper membenarkan pembungkusan satu permintaan dengan permintaan yang lain. Dengan mensubkelaskan kelas ini dan mengatasi kaedah getParameter, anda boleh mengembalikan nilai parameter yang telah dibersihkan. Permintaan yang diubah suai ini kemudiannya boleh diturunkan kepada rantaian penapis dan bukannya permintaan asal.
Coretan Kod:
<code class="java">import javax.servlet.*; import javax.servlet.http.*; public class XssFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // Create a wrapped request with sanitized parameter HttpServletRequest wrappedRequest = new HttpServletRequestWrapper((HttpServletRequest) request) { @Override public String getParameter(String parameterName) { String originalValue = super.getParameter(parameterName); return sanitize(originalValue); } }; chain.doFilter(wrappedRequest, response); } ... }</code>
Pilihan 2: Gunakan Atribut Permintaan
Pendekatan yang lebih halus melibatkan pengubahsuaian servlet atau JSP yang terdedah untuk mengharapkan atribut permintaan dan bukannya parameter. Penapis memeriksa parameter, membuat pengubahsuaian yang diperlukan dan menetapkan nilai yang telah disanitasi sebagai atribut menggunakan request.setAttribute().
Coretan Kod untuk JSP:
<code class="jsp"><jsp:useBean id="myBean" ...> <jsp:setProperty name="myBean" property="sanitizedParam" value="${requestScope['sanitizedParam']}" /></code>
Coretan Kod untuk Servlet:
<code class="java">import javax.servlet.*; import javax.servlet.http.*; public class MyServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // Retrieve the sanitized parameter from the attribute String sanitizedParam = (String) request.getAttribute("sanitizedParam"); } }</code>
Nota:
Atas ialah kandungan terperinci Bagaimana untuk Mengubah Suai Parameter Permintaan dalam Penapis Servlet untuk Peningkatan Keselamatan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!