Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
旧的凌乱的PHP代码和MySQL注入_Php_Mysql_Sql Injection - Fatal编程技术网

旧的凌乱的PHP代码和MySQL注入

旧的凌乱的PHP代码和MySQL注入,php,mysql,sql-injection,Php,Mysql,Sql Injection,我的一个老项目让我有点头疼。我想把我曾经管理过的网站的旧版本重新上线。问题是,它是在1998+时用PHP编写的,当时我对安全问题知之甚少甚至一无所知(15岁时开始学习脚本编写)。当我现在检查代码时,我可以看到几乎没有可能造成的伤害,因为大多数代码都做了基本的事情,而不会对易受攻击的资产进行太多的篡改。除了一个例外,MySQL查询。我有成千上万的选择、插入和更新,它们对任何MySQL注入尝试都是开放的。这个项目很大,有很多文件和代码。即使我搜索并检查mysql\u查询的每一次出现,我仍然可能遗漏一

我的一个老项目让我有点头疼。我想把我曾经管理过的网站的旧版本重新上线。问题是,它是在1998+时用PHP编写的,当时我对安全问题知之甚少甚至一无所知(15岁时开始学习脚本编写)。当我现在检查代码时,我可以看到几乎没有可能造成的伤害,因为大多数代码都做了基本的事情,而不会对易受攻击的资产进行太多的篡改。除了一个例外,MySQL查询。我有成千上万的选择、插入和更新,它们对任何MySQL注入尝试都是开放的。这个项目很大,有很多文件和代码。即使我搜索并检查mysql\u查询的每一次出现,我仍然可能遗漏一些东西。也有很多混乱。像这样的事情到处都是:

        function Mess($ID) {
    $result = mysql_query("select * from table where `id` LIKE '$ID'"); 
}

我在想,是否会有一种简单的方法来处理这个问题,而不用花很多时间来检查每一个MySQL查询。更不用说创建所有的PDO结构并尝试将其与这个怪物结合起来。我只是在业余时间这样做,以表彰许多人多年前致力于为这个项目创建内容的工作。所以我在考虑某种“通用”解决方案。我正在考虑php前置文件,但是我可以在那里插入什么来不破坏传入变量呢?我可以杀死所有GET、POST、COOKIE变量,但这会阻止网站正确提供内容。我可以为数据库用户禁用除SELECT之外的所有访问权限(我不需要更多权限,因为此项目不需要更新),然后抑制错误消息,但这仍然会使其打开以供注入,只是无法修改数据库。是否有人知道我不知道的事情,会“否决”这个问题?我不介意是否有人能够篡改变量来查看特定数据库的单元内容。那个数据库里并没有什么是私有的(我删除了密码、电子邮件等)。但是,我很在意存储在该主机上的其他数据的安全性和完整性。

SQL注入没有一刀切的解决方案。如果有的话,他们会将其构建到每种编程语言和框架中,然后SQL注入就不再是问题了。他们用神奇的引语尝试了这一点,但没有成功,而且该功能现在已被弃用

有关保护方法的更多详细信息,请参见我的演示文稿

如果你想尊重这个老项目,我建议你做一些截图,然后把它们作为静态图片发布


比尔,根据你的演讲,你有讲座吗

您可以在此处以网络研讨会的形式查看(免费但需要注册):

我也在旧金山MySQL MeUpUp中给出:


要降低风险,请使用一个编辑器(例如netbeans或notpad++),该编辑器可以一次对所有文件执行基于正则表达式的搜索和替换,并在上运行搜索

(mysql_[a-z]+\("[^$"]+)(\$[a-z][a-zA-Z0-9]*)
并将其替换为

$1" . mysql_real_escape\($2\) . "

这应该可以避免您的所有查询。在尝试之前做一个备份!!!;-)

在顶部包含一个
sanitize\u everything.php
文件,该文件将遍历所有可能使用的$\u GET、$\u POST、$\u COOKIE或任何内容,并相应地进行清理。您需要在那里列出所有变量,如果它们是
isset
,则需要逐一清理它们。如果您只保留
SELECT
访问权限,则只会显示该查询中的更多信息,而不会对数据库进行任何篡改。这一切都取决于您希望在项目和数据库中的数据上花费的时间,但是为了快速获得结果,您可以禁用所有功能,除了
SELECT
@Sharky,没有神奇的清理功能可以获取一组随机值并“保护”它们。安全性随上下文而来,因此不能过度概括(例如,脚本如何知道
$\u GET['someKey']
必须强制转换为
整数
?@CatalinDeaconescu,这并不是SELECT的唯一风险——任何人都可以在只有SELECT权限的情况下使用万亿行连接使服务器崩溃。@swordoffpain,因为“您需要在其中列出所有变量并逐一清理”我已经一个接一个地说明了这是一项手工工作。我从来没有说过有一个神奇的按钮。在我的应用程序中,我将我的输入列为白名单,并对每个输入进行适当的消毒。可能来自输入的任何其他内容都不会被使用。例如,如果
$\u POST['id']
是一个数字,我将其转换为整数。当然,在某个地方有一个便签,上面列出了所有变量以及它们的用途。有趣的演示文稿比尔。我必须说,我从中学到了一些新东西。感谢链接。尽管如此,由于网站的大小,发布静态图像是不可能的。这是很多内容好几年的演讲!它帮助我理解了问题(和解决方案)甚至更多。@user3663552,如果你需要该应用程序在web上运行,那么你必须开始检查和修复所有不安全的SQL查询。当你完成时,你将有大量的练习为SQL注入编写所有各种修复程序,你再也不能容忍编写不安全的代码了。对我来说,这听起来是一个胜利!检查完my选项我通过过滤掉所有特殊字符和某些mysql语句来解决(如果一些用户输入的错误查询没有放在引号中)在所有可能的用户输入之外。为了以防万一,还缩小了仅选择的权限。这将削弱大多数网站,但就我而言,似乎99%的内容都可以正常工作。当然,学习如何使用适当的标准进行编码总是一件好事。但我们大多数人都是从创建新手代码开始的我说的是我的幼儿园。+再次感谢你的链接。