【问题标题】:SQL Injection prevention: Maximum measures [closed]SQL注入预防:最大措施[关闭]
【发布时间】:2011-07-20 08:31:45
【问题描述】:

我想知道除了使用参数化查询和验证数据之外,是否还有其他针对 SQL 注入的措施。 谢谢!

【问题讨论】:

标签: sql-injection parameterized


【解决方案1】:

除了您可能在客户端执行的任何操作之外,还要确保您在服务器端验证数据。

此外,如果您使用的是网络,请确保您正在验证所有数据,即 QueryString 和 Cookie 值以及表单字段。

我知道这是 Google 上的第一个热门,但我确实不时阅读这篇文章并对其进行真正的评价(再次与网络有关): http://www.securiteam.com/securityreviews/5DP0N1P76E.html

【讨论】:

  • 但这不是验证问题吗?我想知道是否有更多的验证和准备好的陈述。感谢您的评论,我会阅读链接(乍一看似乎不错)
【解决方案2】:

我总是通过自定义消毒服务器端运行我的用户输入文本,这样我就可以删除所有讨厌的东西,以防它通过。 (& " = ' 等)

除了我调用的存储过程之外,我的代码中没有任何 SQL 语句,因此即使他们确实发现了漏洞,他们也必须在接触表之前找出我的存储过程。

在存储过程参数中,您可以限制文本大小,例如 VARCHAR(10),因此如果您通常期望字符串“123456”和“12345' AND UNION SELECT * FROM MEMBERS INNER JOIN MEMBER_ADDRESS ON ID”就可以通过,存储过程不会喜欢它。

最后一点,尝试捕获所有返回的异常,并尝试优雅地处理它们。有时您会看到网站显示类似“无法连接到数据库,'USER_ID' 在 mydatabase.member 中不存在”的信息。让某人嗅探一下您的数据库架构将开始进行漏洞利用。

【讨论】:

  • 谢谢。我可以问你一个问题?我知道我可以谷歌,但只是让别人解释会更好。如果没有单个 SQL 语句,你如何做到这一点?你如何制作存储过程?谢谢!
  • 当然可以,虽然这取决于您拥有的 sql 数据库。如果像大多数人一样,您使用的是 linux 服务器,那么默认情况下您将拥有 MySQL (5.X.X) - 这是我个人的偏好。存储过程基本上就是它所说的,存储在数据库中的过程(如方法)。您可以使用这样的方式创建 SP(在 DB 中直接执行 SQL): CREATE PROCEDURE my_db.get_my_user (in _id INT(10)) BEGIN SELECT * from test where My_ID = _id; END 然后在您选择的语言中通过执行以下 SQL 语句来调用该过程: sql = "call get_my_user($value)";
  • 不是调用call get_my_user($value) 是一个常规的SQL 查询,因此遭受同样的漏洞?
  • 取决于存储过程是否将用户输入连接成一个SQL查询然后运行它,你应该使用准备好的语句来最小化注入的风险。
  • 也...@Col。弹片 我建议你下次对你的问题进行研究,然后再随心所欲地投票。
【解决方案3】:

有了上面所有好的答案,我所做的是创建一个脚本来扫描所有表并为表名和列创建白名单,然后我使用它来验证任何应该是表/列名的用户输入,因为它们没有t 进入参数查询。其他任何东西都通过 PDO Bind 参数化!

【讨论】:

    猜你喜欢
    • 2019-01-04
    • 2021-05-01
    • 2015-01-12
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 2012-05-22
    • 1970-01-01
    相关资源
    最近更新 更多