xyz后缀的网站,大数据对网站建设教育的影响,seo入门版,水果营销软文问题#xff1a; XPath 注入是指数据从一个不可信赖数据源进入程序#xff0c;用于动态构造一个 XPath 查询#xff0c;获取权限信息 的访问权并更改这些信息的一种攻击方式。 例如#xff1a;以下代码片段中#xff0c;可动态地构建并执行一个 XPath 查询#xf…问题 XPath 注入是指数据从一个不可信赖数据源进入程序用于动态构造一个 XPath 查询获取权限信息 的访问权并更改这些信息的一种攻击方式。 例如以下代码片段中可动态地构建并执行一个 XPath 查询为指定的帐户 ID 检索电子邮件地址。 String acctID request.getParameter(acctID); String query null; if(acctID ! null) { StringBuffer sb new StringBuffer(/accounts/account[acctID); sb.append(acctID); sb.append(]/email/text()); query sb.toString(); } DocumentBuilderFactory domFactory DocumentBuilderFactory.newInstance(); domFactory.setNamespaceAware(true); DocumentBuilder builder domFactory.newDocumentBuilder(); Document doc builder.parse(accounts.xml); XPathFactory factory XPathFactory.newInstance(); XPath xpath factory.newXPath(); XPathExpression expr xpath.compile(query); Object result expr.evaluate(doc, XPathConstants.NODESET); 正常情况下例如搜索属于帐号 1 的电子邮件地址此代码所执行的查询如下所示 /accounts/account[acctID1]/email/text() 如果攻击者为 acctID 输入字符串 1 or 1 1 则该查询会变成 /accounts/account[acctID1 or 1 1]/email/text() 附加条件 1 or 1 1 会使 where 从句永远评估为 true 因此该查询在逻辑上将等同于一个更为简化的 查询 //email/text() 这样就可以查询到文档中存储的所有电子邮件地址。 修复 造成 XPath 注入的根本原因在于攻击者能够改变 XPath 查询的上下文导致程序员期望解释为数据的 某个数值被解释为命令了。为了防止攻击者侵犯程序员的各种预设情况可以使用白名单的方法确保 XPath 查询中由用户控制的数值完全来自于预定的字符集合不包含任何 XPath 元字符。如果由用户控制 的数值要求它包含 XPath 元字符则使用相应的编码机制转义或删除这些元字符。 例如以下代码片段中将不可信赖的数据 acctID 转化为一个整形再用于构造 XPath 查询避免了 XPath 注入攻击。 String acctID request.getParameter(acctID); String query null; if(acctID ! null) { Integer iAcctID -1; try { iAcctID Integer.parseInt(acctID); } catch (NumberFormatException e) { throw new InvalidParameterException(); } StringBuffer sb new StringBuffer(/accounts/account[acctID); sb.append(iAcctID.toString()); sb.append(]/email/text()); query sb.toString(); } DocumentBuilderFactory domFactory DocumentBuilderFactory.newInstance(); domFactory.setNamespaceAware(true); DocumentBuilder builder domFactory.newDocumentBuilder(); Document doc builder.parse(accounts.xml); XPathFactory factory XPathFactory.newInstance(); XPath xpath factory.newXPath(); XPathExpression expr xpath.compile(query); Object result expr.evaluate(doc, XPathConstants.NODESET);