gpt4 book ai didi

php - 单引号是否在 PHP 中自动转义?那么需要清洗什么呢?

转载 作者:可可西里 更新时间:2023-10-31 23:57:34 24 4
gpt4 key购买 nike

我正在阅读有关网络安全的文章,其中一个明显的主题是 SQL injections .我正在尝试设置一个基本的 PHP 页面,我可以在其中执行 SQL 注入(inject)(它是本地服务器)。但是,我的代码(或服务器)似乎自动转义了单引号。这是一个新标准还是在我的服务器上激活了一个我不知道的设置?是否需要再清理输入?

这是我的服务器端代码示例:

$foo = $_POST['foo'];
$sql = "SELECT * FROM bar WHERE foo='" . $foo . "'";

connectoTo("database");
query($sql);

其中 connectTo() 连接到数据库服务器并选择数据库,而 query() 是执行查询时使用的常用过程。从来没有打扫过。但是,当我发送

$_POST['foo'] = "' OR 1=1 #" 

PHP 页面将其接收为

$_POST['foo'] = "\' OR 1=1 #"

那么 foo 已经转义了吗?这与 $_GET 相同。

有什么想法吗?我们是否不再需要清理用户输入?

最佳答案

PHP 中有一个失效的“特性”,它会自动转义名为 Magic Quotes 的 POST/GET 数据。 .这个想法是为了防止发生常见类型的 SQL 注入(inject)。

在现实中,您会得到困惑的数据,而且 SQL 注入(inject)仍然很有可能,具体取决于实现方式。 PHP 的开发人员很快意识到这一点并弃用了该功能,并劝阻其使用。

在正确的 PHP 安装中,绝对应该禁用它!如果您无权访问 PHP.ini 来设置 magic_quotes_gpc off,那么您可以将它放在代码的顶部:

if (get_magic_quotes_gpc()) {
$process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
while (list($key, $val) = each($process)) {
foreach ($val as $k => $v) {
unset($process[$key][$k]);
if (is_array($v)) {
$process[$key][stripslashes($k)] = $v;
$process[] = &$process[$key][stripslashes($k)];
} else {
$process[$key][stripslashes($k)] = stripslashes($v);
}
}
}
unset($process);
}

取自:http://www.php.net/manual/en/security.magicquotes.disabling.php

现在,谈谈您的 SQL 注入(inject)问题。你看,要担心的不仅仅是引号。您没有指定您使用的是哪个数据库,但这并不重要。避免注入(inject)问题的最佳方法是使用准备好的/参数化的查询。

准备好的查询是使用参数发送到服务器的查询,其值稍后发送。

INSERT INTO someTable (field1, field2) VALUES (:field1, :field2);

注意 :field1:field2,因为它们是参数。当我执行此语句时,这些将被替换为正确的值。由于服务器正在执行此操作,因此无需转义(和/或它发生在您的后台,具体取决于您使用的数据库层)。

在 PHP 中实现这一点的最简单方法是利用 PDO。如何使用 PDO 对于这个盒子来说太长了,所以我会指向一个教程的方向:

http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/

关于php - 单引号是否在 PHP 中自动转义?那么需要清洗什么呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6358273/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com