- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在阅读有关网络安全的文章,其中一个明显的主题是 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/
在线编写 yacc 代码的教程使用单引号表示分号和其他字符: ';' '+' '-' (etc) 但是在使用时: '' 在我将其更改为双引号之前,我遇到了错误: "" 相似地, '>=' '==
MySQL documentation说它应该是\'。然而,scite 和 mysql 都显示 '' 有效。我看到了,它有效。我该怎么办? 最佳答案 您引用的 MySQL 文档实际上比您提到的要多一些
MySQL documentation说它应该是\'。然而,scite 和 mysql 都显示 '' 有效。我看到了,它有效。我该怎么办? 最佳答案 您引用的 MySQL 文档实际上比您提到的要多一些
MySQL documentation说它应该是\'。然而,scite 和 mysql 都显示 '' 有效。我看到了,它有效。我该怎么办? 最佳答案 您引用的 MySQL 文档实际上比您提到的要多一些
MySQL documentation说它应该是\'。然而,scite 和 mysql 都显示 '' 有效。我看到了,它有效。我该怎么办? 最佳答案 您引用的 MySQL 文档实际上比您提到的要多一些
我一直在使用 SED (Bash shell) 转义单引号问题。 我需要做 $cfg['Servers'][$i]['password'] = ''; 进入 $cfg['Servers'][$i]['
需要将'替换为\'但这就是我得到的: >>> s = "It's nice to have an example" >>> s.replace("'", "\\'") "It\\'s nice to
我在处理连接字符串中的 ' 字符时遇到问题。 Entity Framework 抛出异常说: Format of the initialization string does not conform
我遇到了一个非常奇怪的问题,我无法设置 Content-Security-Policy 所需的单引号。我假设我运行的是旧版本的 ingress,它仅在我禁用并重新启用它 (microk8s) 后才得到
插入带有撇号的值的正确 SQL 语法是什么? Insert into Person (First, Last) Values 'Joe', 'O'Brien' 我不断收到错误,因为我认为
我有三列数据 selector label option list time you personally
我使用 Java Pattern 类将正则表达式指定为字符串。 举个例子我喜欢成为蜘蛛侠:“彼得·帕克” 应将蜘蛛侠和“Peter Parker”列为单独的标记。谢谢 try { Buffe
我正在尝试删除标记 ' (单引号)但我不知道如何。 我在做delm \'但它不起作用。我也尝试了我能想到的所有组合。 我意识到这更像是一个 Vim 脚本问题,但我在任何地方都找不到。 最佳答案 为什么
如何禁用红色突出显示的特定实例。 我尝试在单引号前输入转义符,但没有成功。我确信单引号导致了红色突出显示,因为当我删除它时,它就会消失。 代码如下: import React from 'react'
我需要输出单引号 (')。它必须是单引号而不是 ',因为这是用于向 jquery 函数提供数据的字符串的一部分。 我使用 C# 循环遍历一个对象来构建一个字符串 "var data = [['Item
我正在尝试: "l'ape"); ?> var my_javascript_object = jQuery.parseJSON(''); 我收到此错误“未捕获的语法错误:意外的标识符”。问题是
我的问题是关于传递给方法验证的“add\”反斜杠单引号,该反斜杠单代码有什么用? document.writeln('\',\'N\'))>'); 最佳答案 欢迎来到堆栈溢出。 反斜杠告诉代码这不是引
我要执行命令: xcodebuild -exportArchive -exportFormat IPA -archivePath myApp.xcarchive -exportPath myApp.i
我有一个字符串,里面有一个 ': example link text 不幸的是,这似乎不起作用。 Firebug 提示“SyntaxError:参数列表后缺少 )”,您可以看到 HTML 实体已被 '
据我所知,'mars%22%3A%22' 和 "mars%22%3A%22" 是等效的,因为没有任何内容被转义. 我创建 javscript 书签已经有一段时间了。有一次,当按原样粘贴到 Chrome
我是一名优秀的程序员,十分优秀!