【问题标题】:PHP MySQL $_GET Hack prevention [duplicate]PHP MySQL $_GET 黑客预防[重复]
【发布时间】:2012-01-30 19:23:05
【问题描述】:

可能重复:
Best way to stop SQL Injection in PHP

如果我要使用 $_GET 函数从 URL 中检索变量,我怎样才能使它防黑客?现在我只有 addSlashes,我还应该添加什么?

$variable1 = addslashes($_GET['variable1']);
//www.xxxxx.com/GetTest.php?variable1=xxxx

【问题讨论】:

  • 为了将来参考,这是我在 get 函数中保护数值的函数(删除 floatval(); 非数值 get 值的函数):addslashes(mysql_real_escape_string(strip_tags(floatval())));

标签: php mysql security get urlvariables


【解决方案1】:

这完全取决于你打算用它做什么:

在不知道您将如何处理您的数据的情况下,不可能说出什么可以保证数据的安全。

【讨论】:

  • 假设我按照下面的人所说的方式使用它(我目前没有特定用途,我只是想学习,所以当我决定将来使用 get 时,我将安全地使用它...无论如何,假设:mysql_query("SELECT userid FROM user WHERE password='".$_GET["variable1"]."';");
  • 通常不应从 GET-Variables 读取的密码。请改用 POST 表单 (HTML) 中的密码字段。并且密码应该始终是 md5()-secured。 (对于密码,您只需要mysql_real_escape_string();,因为您不会将其打印出来。
  • 好的,太好了!现在如何查看用户的个人资料页面,它不是密码,只是一个数字......比如 54038。我正在检索并显示该用户号码在名为“userID”的字段中的所有表条目。注射在那里可能有害,我该如何预防?
  • @Albert Renshaw 你必须知道你的数据,如果一个字段应该是一个整数,你最好将它转换为一个整数:(int) $_GET['...']。
  • @Albert Renshaw strip_tags($string)
【解决方案2】:

原始读取 $_GET 变量并不危险,

危险通常在于 SQL 注入,

例如:

$_GET["variable1"] = "' OR 1=1 --";

使用查询:

mysql_query("SELECT userid FROM user WHERE password='".$_GET["variable1"]."';");

为了防止这种情况:

$safe_input = mysql_real_escape_string($GET["variable1"]);
mysql_query("SELECT userid FROM user WHERE password='".$safe_input."';");

【讨论】:

  • -1。 mysql_real_escape_string() 并不总是阻止注射。这可能会给 OP 一个想法,即如果他只是逃避输入,他将永远不必担心 SQL 注入。
  • mysql_real_escape_string 不错!另外,还有哪些其他常见的预防方式 Kristian Antonsen?
  • @AlbertRenshaw mysql_real_escape_string() 只转义刻度、引号等。假设没有,它根本没有帮助。一个例子是使用LIMIT 10, $page 进行分页。如果$page 包含1; DROP TABLE tbl --,则转义将无济于事。始终验证您的输入并确保您具有正确的值(例如 is_numeric 和 intval)。
  • “' OR 1=1 --”背后的直觉是什么?我以前在黑客预防文章中看到过这个声明(或类似的声明)。它通过逻辑犯了错误,对吗?该实习生是否显示包含敏感信息的错误消息?
  • @AlbertRenshaw 不,它不会出错,它只是返回 true。考虑一个糟糕的登录系统,SELECT username FROM tbl WHERE username='$user' AND password='$pass'。如果 $pass 是' OR 1=1 --,则查询将是SELECT username FROM tbl WHERE username='$user' AND password='' OR 1=1 --',因此返回用户名并引导应用程序相信输入了正确的密码。
【解决方案3】:

在使用用户输入(任何 HTTP 请求都算作用户输入)时,您面临的两个最大风险是:

您应该熟悉风险和防御措施。每种威胁的防御措施都是不同的。使用 addlashes() 并不是一个完整的防御措施。

OWASP Top Ten project 是了解更多有关安全 Web 编程的重要资源。

我做了一个关于SQL Injection Myths and Fallacies 的演示,希望对你有所帮助。

【讨论】:

  • 我注意到在另一个用户的评论中他们说“XSS 注入”是否代表跨站点脚本注入?
  • 是的,XSS 是 Cross Site Scripting 的流行缩写。
【解决方案4】:

ANY 输入的首要规则,不仅是 $_GET,即使是 $_POST、$_FILES 以及您从磁盘或流中读取的任何内容,您都应该始终 VALIDATE。

现在要更详细地回答您的问题,您在这个世界上有几个 HACK。让我给你看一些:

XSS 注入

如果您接受来自 URL 的数据(例如来自 $_GET 的数据)并输出此数据而不去除可能的标签,您可能会使您的网站容易受到 XSS 注入或代码注入的影响。例如:

http://myhoturl.com/?search=<script>window.location.href="http://thisisahack.com/"</script>

这会向您的网站输出一个 hack,并且人们会被重定向到另一个页面。此页面可能是网络钓鱼企图窃取凭据

SQL 注入

可以将 SQL 注入您的应用程序。例如:

http://myhoturl.com/?search=%'; UPDATE users SET password=MD5('hello'); SELECT * FROM users WHERE username LIKE '%

会让你的 SQL 看起来像这样:

SELECT * FROM articles WHERE title LIKE '%%'; UPDATE users SET password=MD5('hello'); SELECT * FROM users WHERE username LIKE '%%';

因此,您会将所有用户的密码更新为 Hello,然后返回不匹配的内容。

这只是对您可以使用 SQL 注入执行的操作的简要概述。为了保护自己,请使用 mysql_real_escape_string 或 PDO 或任何好的 DB 抽象层。

代码注入

很多人喜欢在磁盘上的某个位置包含数据并允许上传文件。例如:

//File igotuploaded.txt
<?php echo 'helloworld'; ?>

并且 url 允许您按名称包含文件。 ?show=myhotfile.txt

//In this file we include myhotfile.txt
include($_GET['show']);

此人将其更改为 ?show=../uploads/igotuploaded.txt,您将运行 echo 'Hello world';

那很危险。

经验法则...永远不要相信用户输入,始终验证、防止、验证、修复、验证并再次纠正...

祝你好运

【讨论】:

  • 那么我怎样才能让我的 php 脚本忽略通过 $_get 检索到的 SQL 查询呢?也感谢所有示例!
  • mysql_real_escape_string 或者如果您使用 PDO 或良好的 DB 层,它通常会为您完成...
  • 什么是“PDO” 它代表什么以及如何使用它?我已经看到这个出现了很多!再次感谢迄今为止的所有帮助!
  • php.net/manual/fr/book.pdo.php - PHP 数据对象
  • 是的,XSS 是跨站脚本
猜你喜欢
  • 1970-01-01
  • 2014-08-05
  • 2013-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-04
  • 2014-07-04
  • 1970-01-01
相关资源
最近更新 更多