没有 SQL 注入问题的代码
Code which is free from problems of SQL Injection
我的网站上有一个评论框
<td id="commentsBox" class="xec" size="200"></td>
我使用 Java 脚本读取评论框并创建一个 XML 字符串。
<ROWS><COMMENTS>My comments</COMMENTS></ROWS>
XML 字符串通过 java 传递给存储过程。 (为了问题的目的,我简化了 SQL 代码和 XML 字符串)
CREATE PROCEDURE [DB].[TEST$ExecuteXML] @doc VARCHAR(max)
,@P_Result VARCHAR(max) OUTPUT
AS
BEGIN
DECLARE @idoc INT;
EXEC sp_xml_preparedocument @idoc OUTPUT
,@doc;
INSERT INTO MyTable (
COMMENTS
,UPDATE_DATE
)
SELECT COMMENTS
,getDate()
FROM OPENXML(@idoc, '/ROWS', 1) WITH (
COMMENTS VARCHAR(200) 'COMMENTS'
);
SET @p_result = 1;
END
我看过处理 SQL 注入的网站,例如 https://technet.microsoft.com/en-us/library/ms161953(v=sql.105).aspx
是否可以在文本框中输入对数据库有破坏性的内容?
更新
作为对@Linky 的回应,我在此处添加了(部分)Java 代码——尽管我不知道这会带来什么问题,因为我的问题的前提是 SQL 服务器程序可以接受 XML.
中的任何内容
XMLObject br = new XMLObject(xmlString);
String result = br.update();
public class XMLObject {
public static final int RESULT_FAILED = 0;
public static final int RESULT_SUCCESS = 1;
protected DBConnection dbConn = null;
protected String theXML=null;
public XMLObject(String theXML) {
this.theXML=theXML;
}
public String update() {
String result;
ArrayList<DBField> fields = new ArrayList<>();
fields.add(new DBField(DBField.STRING, theXML, false));
result = DMLUtils.executeString("ExecuteXML", fields);
return result;
}
}
避免 SQL 注入攻击的最佳方法是将内容绑定到特定的列。如果该数据曾经显示给用户,直接将用户评论输入数据库会使您容易受到跨站点脚本攻击。我建议你把这个问题带到 Security Stack Exchange.
注入来自允许 SQL 数据成为或被视为 SQL 命令。在您的示例中,您清楚地描述了数据和命令,据我所知,OPENXML
和 sp_xml_preparedocumen
都不能 单独使用 导致注入。
因此,以我的专业观点,这似乎是安全的注射。
我的网站上有一个评论框
<td id="commentsBox" class="xec" size="200"></td>
我使用 Java 脚本读取评论框并创建一个 XML 字符串。
<ROWS><COMMENTS>My comments</COMMENTS></ROWS>
XML 字符串通过 java 传递给存储过程。 (为了问题的目的,我简化了 SQL 代码和 XML 字符串)
CREATE PROCEDURE [DB].[TEST$ExecuteXML] @doc VARCHAR(max)
,@P_Result VARCHAR(max) OUTPUT
AS
BEGIN
DECLARE @idoc INT;
EXEC sp_xml_preparedocument @idoc OUTPUT
,@doc;
INSERT INTO MyTable (
COMMENTS
,UPDATE_DATE
)
SELECT COMMENTS
,getDate()
FROM OPENXML(@idoc, '/ROWS', 1) WITH (
COMMENTS VARCHAR(200) 'COMMENTS'
);
SET @p_result = 1;
END
我看过处理 SQL 注入的网站,例如 https://technet.microsoft.com/en-us/library/ms161953(v=sql.105).aspx
是否可以在文本框中输入对数据库有破坏性的内容?
更新
作为对@Linky 的回应,我在此处添加了(部分)Java 代码——尽管我不知道这会带来什么问题,因为我的问题的前提是 SQL 服务器程序可以接受 XML.
中的任何内容XMLObject br = new XMLObject(xmlString);
String result = br.update();
public class XMLObject {
public static final int RESULT_FAILED = 0;
public static final int RESULT_SUCCESS = 1;
protected DBConnection dbConn = null;
protected String theXML=null;
public XMLObject(String theXML) {
this.theXML=theXML;
}
public String update() {
String result;
ArrayList<DBField> fields = new ArrayList<>();
fields.add(new DBField(DBField.STRING, theXML, false));
result = DMLUtils.executeString("ExecuteXML", fields);
return result;
}
}
避免 SQL 注入攻击的最佳方法是将内容绑定到特定的列。如果该数据曾经显示给用户,直接将用户评论输入数据库会使您容易受到跨站点脚本攻击。我建议你把这个问题带到 Security Stack Exchange.
注入来自允许 SQL 数据成为或被视为 SQL 命令。在您的示例中,您清楚地描述了数据和命令,据我所知,OPENXML
和 sp_xml_preparedocumen
都不能 单独使用 导致注入。
因此,以我的专业观点,这似乎是安全的注射。