GVKun编程网logo

库保护Java / jsp的SQL / javascript注入(javaweb防止sql注入)

13

这篇文章主要围绕库保护Java/jsp的SQL/javascript注入和javaweb防止sql注入展开,旨在为您提供一份详细的参考资料。我们将全面介绍库保护Java/jsp的SQL/javascr

这篇文章主要围绕库保护Java / jsp的SQL / javascript注入javaweb防止sql注入展开,旨在为您提供一份详细的参考资料。我们将全面介绍库保护Java / jsp的SQL / javascript注入的优缺点,解答javaweb防止sql注入的相关问题,同时也会为您带来ASP.NET MVC 3如何将Javascript注入主布局、Chrome扩展程序JavaScript注入、JavaEE_JavaScript__前台(Jsp页面) + 后台数据处理(Servlet),与javaScript的过程的处理、JavaScript DOM 编程艺术(第2版)读书笔记(JavaScript的最佳实践)_javascript技巧的实用方法。

本文目录一览:

库保护Java / jsp的SQL / javascript注入(javaweb防止sql注入)

库保护Java / jsp的SQL / javascript注入(javaweb防止sql注入)

任何人都知道一个好的库,我可以在插入字符串之前在其中运行字符串,这样可以去除sql / javascript代码?在jsp页面中运行。

理想情况下,lib将是:

  • 自由
  • 轻巧的
  • 易于使用

预先感谢SO社区,他们将很乐意答复:)

答案1

小编典典

Apache Commons lang StringEscapeUtils将为您提供一些帮助。它逃脱,不剥离。

http://commons.apache.org/lang/api/org/apache/commons/lang/StringEscapeUtils.html

编辑:转义可以避免注入攻击,因为它可以确保用户输入的数据不会作为代码执行,而是始终作为数据呈现给用户。

ASP.NET MVC 3如何将Javascript注入主布局

ASP.NET MVC 3如何将Javascript注入主布局

我正在尝试从MVC 3新的剃刀视图引擎.我遇到的问题是我有特定于页面的 Javascript.我通常在标签关闭之前拥有所有的Javascript代码.我想在我关闭主布局上的body标签之前放置一个部分.有些事情的影响:

<script type="text/javascript">
   @RenderSection("JavaScript")
</script>

但VS2010以绿色突出显示它.所以哪个页面使用这个主布局都可以在这里注入Javascript.你们会怎么做?我想这样做的原因是因为我可以在这里添加来自主布局的JavaScript,其他我将不得不在@RenderSection下面定义一个单独的脚本标记.

当我执行以下操作时,VS会给我一个警告(我不喜欢警告):

Validation (HTML 4.01): Element 'link' cannot be nested within element 'link'.

这是我上面警告的代码:

@section HeadSection
{
    <link href="http://yui.yahooapis.com/2.8.2r1/build/button/assets/skins/sam/button.css" rel="stylesheet" type="text/css">
    <link href="http://yui.yahooapis.com/2.8.2r1/build/datatable/assets/skins/sam/datatable.css" rel="stylesheet" type="text/css">
}

我怎样才能得到这些警告?

解决方法

我会在_layout页面中使用@RenderSection(“head”,false).然后你可以在页面的头部注入任何你想要的东西(包括脚本)……并且使用false,你可以在所有的视图页面上选择它.

Chrome扩展程序JavaScript注入

Chrome扩展程序JavaScript注入

这里有几个问题。

内容脚本在DOMContentLoaded(by default)之后运行,但这绝不能保证页面之后不会动态运行其脚本。许多现代网页在基于requestAnimationFrame和setTimeout的回调构建UI或响应网络请求而获取新鲜数据时都这样做。

getElementsByClassName返回实时集合:

  • console.log(aGrid[0])证明脚本运行时为空
  • 然后您的脚本完成
  • 然后运行页面脚本并动态添加元素
  • 然后您在devtools控制台中扩展了集合
  • 然后devtools查找元素并找到它们at that exact moment

解决方案。

可能的解决方案是使用MutationObserver等待元素:

let aGrid = document.getElementsByClassName('fc-time-grid-event');
if (aGrid[0]) {
  onGridAdded();
} else {
  new MutationObserver((mutations,observer) => {
    if (aGrid[0]) {
      observer.disconnect();
      onGridAdded();
    }
  }).observe(document,{childList: true,subtree: true});
}

function onGridAdded() {
  console.log([...aGrid]);
  // use aGrid here
}

更多示例:link。

JavaEE_JavaScript__前台(Jsp页面) + 后台数据处理(Servlet),与javaScript的过程的处理

JavaEE_JavaScript__前台(Jsp页面) + 后台数据处理(Servlet),与javaScript的过程的处理

今天一直遇到一个问题,JSP利用JavaScript 函数将密码进行了清空,后台查看数据的时候,没有找到数据。


分析后的原因为:JavaScript 的代码执行的过程为提交表单之前,因为 javaScript的代码执行修改了表单数据,导致后台接收不到数据,代码如下:

<%--
version  1.0
Copyright (C), 2001-2016, yeeku.H.Lee
This program is protected by copyright laws.
Program Name:
Date: 
--%>

<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<title> 用户登录 </title>
	<meta name="website" content="http://www.crazyit.org" />
</head>
<body>
<!-- 输出出错提示 -->
<span style="color:red;font-weight:bold">
<%
if (request.getAttribute("err") != null)
{
	out.println(request.getAttribute("err") + "<br/>");
}
%>
</span>
请输入用户名和密码:
<!-- 登录表单,该表单提交到一个Servlet -->
<form id="login" method="post" action="login">
用户名:<input type="text" name="username"/><br/>
密  码:<input type="password" id="pass" name="pass"/><br/>
<input type="submit" value="登录" id="submitk"/><br/>
</form>
<script type="text/javascript">
		/* var clear = function(){
			if(document.getElementById("pass").value != null){
				//alert("清空密码");
				document.getElementById("pass").value = "";
			}
		}
		document.getElementById("submitk").onclick = clear; */
</script>
</body>
</html>

后台Servlet 代码:

package lee;
  • import java.io.IOException;
  • import java.sql.ResultSet;
  • import javax.servlet.RequestDispatcher;
  • import javax.servlet.ServletException;
  • import javax.servlet.http.HttpServlet;
  • import javax.servlet.http.HttpServletRequest;
  • import javax.servlet.http.HttpServletResponse;
  • import javax.servlet.http.HttpSession;
  • /**
  • * Description: <br/>
  • * 网站: <a href="http://www.crazyit.org">疯狂Java联盟</a> <br/>
  • * Copyright (C), 2001-2016, Yeeku.H.Lee <br/>
  • * This program is protected by copyright laws. <br/>
  • * Program Name: <br/>
  • * Date:
  • *
  • * @author Yeeku.H.Lee kongyeeku@163.com
  • * @version 1.0
  • */
  • // @WebServlet(name = "login", urlPatterns = { "/login" })
  • public class LoginServlet extends HttpServlet {
  • // 响应客户端请求的方法
  • public void service(HttpServletRequest request, HttpServletResponse response)
  • throws ServletException, java.io.IOException {
  • String errMsg = "";
  • // Servlet本身并不输出响应到客户端,因此必须将请求转发到视图页面
  • RequestDispatcher rd;
  • // 获取请求参数
  • String username = request.getParameter("username");
  • String pass = request.getParameter("pass");
  • System.out.println("前台传递的密码:" + pass);
  • try {
  • // Servlet本身并不执行任何的业务逻辑处理,它调用JavaBean处理用户请求
  • DbDao dd = new DbDao("com.mysql.jdbc.Driver",
  • "jdbc:mysql://localhost:3306/liuyan", "root", "123456");
  • // 查询结果集
  • ResultSet rs = dd.query("select pass from user_inf"
  • + " where name = ?", username);
  • if (rs.next()) {
  • // 用户名和密码匹配
  • System.out.println("数据库中的密码:" + rs.getString("pass"));
  • // System.out.println(username + "---ssss");
  • // System.out.println(pass + "---ssss");
  • if (rs.getString("pass").equals(pass)) {
  • // 获取session对象
  • HttpSession session = request.getSession(true);
  • // 设置session属性,跟踪用户会话状态
  • session.setAttribute("name", username);
  • // 获取转发对象
  • rd = request.getRequestDispatcher("/welcome.jsp");
  • // 转发请求
  • rd.forward(request, response);
  • } else {
  • // 用户名和密码不匹配时
  • errMsg += "您的用户名密码不符合,请重新输入";
  • }
  • } else {
  • // 用户名不存在时
  • errMsg += "您的用户名不存在,请先注册";
  • }
  • } catch (Exception e) {
  • e.printStackTrace();
  • }
  • // 如果出错,转发到重新登录
  • if (errMsg != null && !errMsg.equals("")) {
  • rd = request.getRequestDispatcher("/login.jsp");
  • request.setAttribute("err", errMsg);
  • rd.forward(request, response);
  • }
  • }
  • @Override
  • protected void doGet(HttpServletRequest req, HttpServletResponse resp)
  • throws ServletException, IOException {
  • // TODO Auto-generated method stub
  • String errMsg = "";
  • // Servlet本身并不输出响应到客户端,因此必须将请求转发到视图页面
  • RequestDispatcher rd;
  • // 获取请求参数
  • String username = req.getParameter("username");
  • String pass = req.getParameter("pass");
  • try {
  • // Servlet本身并不执行任何的业务逻辑处理,它调用JavaBean处理用户请求
  • DbDao dd = new DbDao("com.mysql.jdbc.Driver",
  • "jdbc:mysql://localhost:3306/liuyan", "root", "123456");
  • // 查询结果集
  • ResultSet rs = dd.query("select pass from user_inf"
  • + " where name = ?", username);
  • if (rs.next()) {
  • // 用户名和密码匹配
  • if (rs.getString("pass").equals(pass)) {
  • // 获取session对象
  • HttpSession session = req.getSession(true);
  • // 设置session属性,跟踪用户会话状态
  • session.setAttribute("name", username);
  • // 获取转发对象
  • rd = req.getRequestDispatcher("/welcome.jsp");
  • // 转发请求
  • rd.forward(req, resp);
  • } else {
  • // 用户名和密码不匹配时
  • errMsg += "您的用户名密码不符合,请重新输入";
  • }
  • } else {
  • // 用户名不存在时
  • errMsg += "您的用户名不存在,请先注册";
  • }
  • } catch (Exception e) {
  • e.printStackTrace();
  • }
  • // 如果出错,转发到重新登录
  • if (errMsg != null && !errMsg.equals("")) {
  • rd = req.getRequestDispatcher("/login.jsp");
  • req.setAttribute("err", errMsg);
  • rd.forward(req, resp);
  • }
  • }
  • @Override
  • protected void doPost(HttpServletRequest req, HttpServletResponse resp)
  • throws ServletException, IOException {
  • doGet(req, resp);
  • }
  • }


  • DAO代码

    1. package lee;
    2. import java.sql.*;
    3. /**
    4. * Description:
    5. * <br/>网站: <a href="http://www.crazyit.org">疯狂Java联盟</a>
    6. * <br/>Copyright (C), 2001-2016, Yeeku.H.Lee
    7. * <br/>This program is protected by copyright laws.
    8. * <br/>Program Name:
    9. * <br/>Date:
    10. * @author Yeeku.H.Lee kongyeeku@163.com
    11. * @version 1.0
    12. */
    13. public class DbDao
    14. {
    15. private Connection conn;
    16. private String driver;
    17. private String url;
    18. private String username;
    19. private String pass;
    20. public DbDao()
    21. {
    22. }
    23. public DbDao(String driver , String url
    24. , String username , String pass)
    25. {
    26. this.driver = driver;
    27. this.url = url;
    28. this.username = username;
    29. this.pass = pass;
    30. }
    31. // 下面是各个成员属性的setter和getter方法
    32. public void setDriver(String driver) {
    33. this.driver = driver;
    34. }
    35. public void setUrl(String url) {
    36. this.url = url;
    37. }
    38. public void setUsername(String username) {
    39. this.username = username;
    40. }
    41. public void setPass(String pass) {
    42. this.pass = pass;
    43. }
    44. public String getDriver() {
    45. return (this.driver);
    46. }
    47. public String getUrl() {
    48. return (this.url);
    49. }
    50. public String getUsername() {
    51. return (this.username);
    52. }
    53. public String getPass() {
    54. return (this.pass);
    55. }
    56. // 获取数据库连接
    57. public Connection getConnection() throws Exception
    58. {
    59. if (conn == null)
    60. {
    61. Class.forName(this.driver);
    62. conn = DriverManager.getConnection(url,username,
    63. this. pass);
    64. }
    65. return conn;
    66. }
    67. // 插入记录
    68. public boolean insert(String sql , Object... args)
    69. throws Exception
    70. {
    71. PreparedStatement pstmt = getConnection().prepareStatement(sql);
    72. for (int i = 0; i < args.length ; i++ )
    73. {
    74. pstmt.setObject( i + 1 , args[i]);
    75. }
    76. if (pstmt.executeUpdate() != 1)
    77. {
    78. return false;
    79. }
    80. pstmt.close();
    81. return true;
    82. }
    83. // 执行查询
    84. public ResultSet query(String sql , Object... args)
    85. throws Exception
    86. {
    87. PreparedStatement pstmt = getConnection().prepareStatement(sql);
    88. for (int i = 0; i < args.length ; i++ )
    89. {
    90. pstmt.setObject( i + 1 , args[i]);
    91. }
    92. return pstmt.executeQuery();
    93. }
    94. // 执行修改
    95. public void modify(String sql , Object... args)
    96. throws Exception
    97. {
    98. PreparedStatement pstmt = getConnection().prepareStatement(sql);
    99. for (int i = 0; i < args.length ; i++ )
    100. {
    101. pstmt.setObject( i + 1 , args[i]);
    102. }
    103. pstmt.executeUpdate();
    104. pstmt.close();
    105. }
    106. // 关闭数据库连接的方法
    107. public void closeConn()
    108. throws Exception
    109. {
    110. if (conn != null && !conn.isClosed())
    111. {
    112. conn.close();
    113. }
    114. }
    115. }




    JavaScript DOM 编程艺术(第2版)读书笔记(JavaScript的最佳实践)_javascript技巧

    JavaScript DOM 编程艺术(第2版)读书笔记(JavaScript的最佳实践)_javascript技巧

    1、防止滥用JavaScript“不管你想通过JavaScript改变哪个网页的行为,都必须三思而后行。首先要确认:为这个网页增加这种额外的行为是否确有必要?”

    个人认为,作者的这句话放在当前几乎无处不用JavaScript来增强Web页面交互体验的时代,可以理解为应该适当的使用JavaScript,而不要因为使用了实现酷炫效果的脚本导致网页加载缓慢或者兼容性极差而舍本求末,导致用户无法浏览和使用网站。

    2、平稳退化平稳退化是指当用户禁用浏览器JavaScript或浏览器不支持JavaScript(还有吗)时,应该让用户仍然可以正常的浏览网站。

    刚看到这个问题的时候,感觉这种情况几乎可以忽略不计,因此看了一些关于这个问题的讨论(知乎)以及博文《javascript不可用的问题探究》,并拿博客园首页做了实验,即在禁用JavaScript的情况下浏览网页,发现虽然无法评论博客、无法正常显示分类效果、当然广告也没了,但是主要的功能(查看博文、分页跳转等)是可以正常使用的。

    那么基本可以得出结论:在考虑平稳退化的时候,根据需要至少应该保证网站主要功能可以正常使用。对博客园来说,就是查看博客。

    3、禁用"javascript:"伪协议和内嵌事件处理函数虽然在HTML中使用这两种写法,不会带来什么严重问题,但是它会阻止平稳退化(网页行为不一致),并且使脚本的编写方式混乱,增加了代码维护的难度。

    4、性能考虑关于性能考虑的最佳实践,还是非常容易理解的。

    “尽量少访问DOM和尽量减少标记”。少访问DOM是因为查询DOM的操作会非常耗费性能。多处函数的重复DOM查询应该进行重构,提取为全局变量或者直接作为参数进行传递。减少标记可以减小DOM的规模,从而减少查找DOM树中特定元素的时间。

    “合并脚本”。合并外部脚本文件,可以减少加载页面时发送的请求次数。通过观察Chrome开发者工具Network标签,可以非常清楚的看到加载网页的请求次数和时间,下图为请求我的博客的情况,第三方的百度分享插件是最慢被加载的,当然整体加载时间还是可以接受的。不过当引用的文件过多过大,或者依赖的第三方插件请求缓慢时,整个页面就会一直处于加载状态,给人的感觉就是网页加载缓慢,体验就会变差。



    另外,“脚本在标记中的位置对页面的初次加载时间也有很大的影响”。就像bootstrap的实例中,引用的JS插件统统放在了页面的尾部,并加了说明。

    JavaScript DOM 编程艺术(第2版)读书笔记(JavaScript的最佳实践)_javascript技巧
    因为根据HTTP规范,浏览器每次从同一个域名中最多只能同时下载两个文件,而在脚本下载期间,浏览器不会下载其它任何文件,即使是来自不同域名的文件也不会下载,所有其它的资源都要等脚本加载完毕后才会下载;而通常我们会把脚本文件放在块中,此时该块中的脚本会导致浏览器无法并行加载其它文件(如图片或其它脚本)。

    把所有 <script> 标签放在文档的末尾,</script>

    关于库保护Java / jsp的SQL / javascript注入javaweb防止sql注入的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于ASP.NET MVC 3如何将Javascript注入主布局、Chrome扩展程序JavaScript注入、JavaEE_JavaScript__前台(Jsp页面) + 后台数据处理(Servlet),与javaScript的过程的处理、JavaScript DOM 编程艺术(第2版)读书笔记(JavaScript的最佳实践)_javascript技巧等相关内容,可以在本站寻找。

    本文标签:

    上一篇如何从mysql db检索图像并将其显示在内部并用HTML标记?

    下一篇django-将列表转换回queryset(列表转json python)