如何避免web url中的代码注入

时间:2012-01-10 16:20:43

标签: c# security encryption

我想知道在读取网址时是否还有避免sql注入或XSS的问题。 例如: https://abc?ID=一些独特的指南

如何在输入时避免使用sql注入等而不是有效的GUID。

5 个答案:

答案 0 :(得分:4)

您可以做一些事情。

  1. 开始使用parameterized queries或好ORM
  2. 查看C# AntiXSS library
  3. Sanitize您的意见。
  4. 阅读preventing SQL Injection

    进一步阅读

    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/