我想知道在读取网址时是否还有避免sql注入或XSS的问题。 例如: https://abc?ID=一些独特的指南
如何在输入时避免使用sql注入等而不是有效的GUID。
答案 0 :(得分:4)
您可以做一些事情。
进一步阅读
SQL注入比您询问的部分更大。您希望了解进出数据库的所有数据。实施上面的建议,你应该“覆盖”。
当涉及原始问题(?id=[guid]
)的主题时,您希望确保在提交查询时使用System.Guid
数据类型。如果string
不是有效的GUID,那么您就知道存在问题并且您不应该完成请求(IE:以后甚至不会将请求发送到您的存储库,并且肯定不会将其发送到数据库)。
答案 1 :(得分:1)
简单。 始终清理输入。永远不要隐含地信任或执行从外部来源(用户,客户端机器等)收到的东西。
对于GUID,请使用System.Guid
数据类型而不是字符串。也就是说,在SQL查询中使用它的情况下,永远不要只将GUID的字符串表示连接到查询中。使用query parameters并传递一个实际的System.Guid
对象,该对象是根据收到的字符串创建的。
如果在解析字符串时无法创建实际的System.Guid
,则表示输入无效。此时,您甚至不必费心去尝试构建SQL查询或以任何方式使用数据访问层,只需向用户返回错误。
答案 2 :(得分:0)
听起来ID会是一个数字。如果它很容易 - 只需将内容转换为数字,然后使用此类型的变量。如果内容中还有其他内容,系统将只返回错误。
答案 3 :(得分:0)
你应该做的第一件事是不可能进行SQL注入。根据我的理解,这种方法不会导致SQL注入。这被称为“参数化输入”。
string commandText = "UPDATE Sales.Store SET Demographics = @demographics "
+ "WHERE CustomerID = @ID;";
SqlCommand command = new SqlCommand(commandText, connection);
command.Parameters.Add("@ID", SqlDbType.Int);
command.Parameters["@ID"].Value = customerID;
// Use AddWithValue to assign Demographics.
// SQL Server will implicitly convert strings into XML.
command.Parameters.AddWithValue("@demographics", demoXml);
第二种方法是使GUID不通过URL传递。这使得修改非常容易,因此您可能希望通过POST而不是GET传递此值。这样做不会防止SQL注入,但它会使它更加困难,并有助于确保数据完整性。
更多信息:http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.parameters.aspx
答案 4 :(得分:0)
只是不要将ID查询字符串参数中的值直接传递到数据库中。
您正在使用C#,因此您可以使用查询参数或类似实体框架的内容,这将确保为SQL Server正确格式化数据(尽管它可能无法检查它是否是有效的GUID - 除非您的基础字段或查询类型强制)
有关SQL注入攻击的更多信息,这是我几年前写的一篇文章:http://colinmackay.co.uk/blog/2005/04/23/sql-injection-attacks-and-some-tips-on-how-to-prevent-them/