根据PHP手册,为了使代码更具可移植性,他们建议使用以下内容来转义数据:
if (!get_magic_quotes_gpc()) {
$lastname = addslashes($_POST['lastname']);
} else {
$lastname = $_POST['lastname'];
}
Run Code Online (Sandbox Code Playgroud)
我还将进行其他验证检查,但上述严格来说,在逃避数据方面有多安全?我还看到在PHP 6中将不推荐使用魔术引号.这将如何影响上述代码?我宁愿不依赖于像mysql_real_escape_string()这样的特定于数据库的转义函数.
我完全清楚PHP中魔术行情的异常,它是如何邪恶的,我像害虫一样避免它们,但它们是什么magic_quotes_runtime?来自php.ini:
运行时生成的数据的魔术引号,例如来自SQL的数据,来自exec()等的数据.
我应该检查是否打开并关闭:
set_magic_quotes_runtime(false);
Run Code Online (Sandbox Code Playgroud)
它经常默认开启吗?我知道它在5.3.0中被弃用并在6.0.0中被删除但是由于我的脚本支持5.1.0+,我想知道如何在"遗留"PHP中处理它(如果它是相关的).
编辑:为了清楚,我想退出('关闭魔术引号'); 当Magic引号为ON时.我不是在依赖他们!
我正在编写一组PHP脚本,这些脚本将在一些不同的设置中运行,其中一些与魔术引号共享托管(恐怖).如果没有控制PHP或Apache配置的能力,我可以在脚本中做任何事情来在运行时禁用PHP引号吗?
如果代码没有假设魔术引号打开会更好,这样我就可以在不同的主机上使用相同的脚本,这些主机可能有也可能没有魔术引号.
如您所知,当Magic Quotes为ON时,单引号会在值和键中转义.大多数在运行时删除Magic Quotes的解决方案只能取消值,而不是键.我正在寻找一种能够解决关键和价值观的解决方案......
我在PHP.net上发现了这段代码:
$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);
Run Code Online (Sandbox Code Playgroud)
但是我不喜欢"&"引用和数组,因为我在过去遇到了像这样的 bug ...
有没有一种"更好"的方式在运行时使用魔术引号(键和值)而不是上面的方法?
我对这个话题有点困惑,所以我决定向你们询问一下:)
从php.net开始,我应该使用 mysql_real_escape_string()并关闭魔术引号,因为它已被弃用.
所以我关闭了,我使用mysql_real_escape_string(),但这样就足够了吗?:
$value = "It's Time!";
$escaped_value = mysql_real_escape_string($value);
mysql_query("INSERT INTO table (column, column2) VALUES ('{$escaped_value}', "0")");
Run Code Online (Sandbox Code Playgroud)
当我检查数据库中的数据时它看起来与$ value中的数据相同"It's Time"而不是"It\'s Time",这是正常的,这不应该在引号之前添加斜杠吗?
我正在使用PHP向MySQL数据库提交表单.
我通过该mysql_real_escape_string($content)函数发送表单数据.
当条目出现在我的数据库中(在phpMyAdmin中检查)时,我的所有双引号和单引号都被转义.
我很确定这是一个PHP配置问题?
所以:
$content = 'Hi, my name is Jascha and my "favorite" thing to do is sleep';
mysql_real_escape_string($content);
$query = 'INSERT INTO DB...'
Run Code Online (Sandbox Code Playgroud)
在我的数据库中出现:
嗨,我的名字是Jascha,我最喜欢的事情就是睡觉
我该告诉谁该怎么办?(我无法访问php.ini).
我在php.ini中禁用了magic_quotes.
但我仍然在表单中获得转义字符串.
注意:我在Wordpress的主题中运行它.
我从来没有在之前打开魔术引号的环境中编程.现在我正在开展一个项目.这就是我一直在设置用户接受的数据情况:
$first_name = $_POST['first_name']
if(!get_magic_quotes_gpc()) {
$first_name = mysql_real_escape_string($first_name);
}
Run Code Online (Sandbox Code Playgroud)
通过这种过滤,当启用魔术引号时,我仍然可以打开SQL注入攻击吗?
我真的只关心任何会破坏我的查询的SQL注入......其他区域的其他白名单,htmlspecialchar()-ing等.
看一些类似的SO问题似乎建议改为检查魔术引号,如果它打开则在数据上运行'stripslashes',然后总是运行转义函数.我有点担心这样做,因为网站中的所有现有代码都假定它已经开启.
谢谢!
我的服务器管理员最近升级到PHP 5.3,我得到一个奇怪的"错误"(或功能,因为PHP人员有它).mysql_real_escape_string出于明显的安全原因,我已经掌握了大部分字符串表单数据,但现在看来这种转义已经由PHP完成了.
<?php
echo $_GET["escaped"];
?>
<form method="get">
<input type="text" name="escaped" />
</form>
Run Code Online (Sandbox Code Playgroud)
此输出,如果我的情况下进入escape 'this test',escape \'this test\'.如果我使用POST而不是相同的话GET.
是直接绑定到5.3升级还是我的管理员可以在php.ini文件中触发一些自动切换?
另外,我应该保持原样(如果它确实是一个正确捕获所有get和post变量的良好的失败证明机制),或者我应该禁用它(如果这甚至可能!)并返回mysql_real_escape_string?我的胆量告诉我方法2是最好的,但方法1有点自动化.:)
编辑:实际上,我需要禁用它.有时我会收集表单数据并将其重新发送到客户端表单以防出现错误(即缺少字段),因此我不希望他/她出现突然出现的斜线.
我被分配到我公司的一个遗留Web应用程序,经过一两天的探索,我发现了一个类似于以下内容的SQL注入向量:
mysql_query("SELECT * FROM foo WHERE bar='" . $_GET['baz'] . "'");
Run Code Online (Sandbox Code Playgroud)
我试图对此执行SQL注入测试,但由于PHP的magic_quotes_gpc模块已打开,它失败了.
我知道magic_quotes_gpc是脏的,但我们有数百-如果不是数千-类似于上面的一个行的代码.我们根本无法magic_quotes_gpc关闭,因为这会使像这样的代码大开.
我想知道上面的代码是如何"可利用"的,以及我们是否应该立即修复它,或者包括修复它与我们的其他重构任务的任务.