2

在某些 php 中存在单引号/撇号问题,我正在编写以解析表情符号。

单引号是我生命中的祸根,但在这里。

首先这里是一些代码...

首先我的数组包含笑脸和笑脸的文件名。

这是一个单独的文件 (smiley-map.php)。

<?php 
$smilies = array (
array('code' => ':)', 'filename' => 'smiley.gif'),
array('code' => ':(', 'filename' => 'sad.gif'),
array('code' => ';)', 'filename' => 'wink.gif'),
array('code' => ':D', 'filename' => 'grin.gif'),
array('code' => ';D', 'filename' => 'cheesy.gif'),
array('code' => '>:-(', 'filename' => 'angry.gif'),
array('code' => ':O', 'filename' => 'shocked.gif'),
array('code' => '8)', 'filename' => 'cool.gif'),
array('code' => '???', 'filename' => 'huh.gif'),
array('code' => '::-)', 'filename' => 'rolleyes.gif'),
array('code' => ':P', 'filename' => 'tongue.gif'),
array('code' => ':-[', 'filename' => 'embarrassed.gif'),
array('code' => ':*', 'filename' => 'lipsrsealed.gif'),
array('code' => ':-/', 'filename' => 'undecided.gif'),
array('code' => ':x', 'filename' => 'kiss.gif'),
array('code' => ':\'(', 'filename' => 'cry.gif'),
array('code' => '>:-D', 'filename' => 'evil.gif'),
array('code' => '^-^', 'filename' => 'azn.gif'),
array('code' => 'O0', 'filename' => 'afro.gif'),
array('code' => 'LOL', 'filename' => '2funny.gif'),
array('code' => ':bash:', 'filename' => 'knuppel2.gif'),
array('code' => '>_<', 'filename' => 'tickedoff.gif'),
array('code' => ':?', 'filename' => 'idiot.gif'),
array('code' => ':!', 'filename' => 'uglystupid.gif'),
);
?>

然后我以这样的简单方式解析它们:

 <?php
 function parseSmilies($string)
 {
require_once("smilies/smiley-map.php");

for ($i = 0; $i < count($smilies); $i++)
{
    $filename = '<img src="smilies/' . $smilies[$i]['filename'] . '" alt="smiley" title="' . $smilies[$i]['code'] . '" />';
    $string = str_replace($smilies[$i]['code'], $filename, $string);
}
return $string;
 }
 ?>

所以它去了......包括微笑地图......现在可用的数组......搜索代码的字符串......交换图像标签的代码。

这一切在我的本地机器(XAMPP)上运行良好。但是当我上传并在我的服务器中运行它时,它错过了哭泣:'(

我想这是引起问题的单引号,尽管我已经在数组中对其进行了转义..

大概有一些 PHP 设置会影响这个?

有人可以建议吗?

非常感谢。

编辑: $string 来自 $_POST

4

2 回答 2

2

这可能与魔术行情有关。
在您的 PHP 服务器中打开Magic Quotes'时,所有超全局变量($_GET$_POST)中的 都会\'"替换为\". 自 PHP 5.3.0 起,该机制已被弃用,自 PHP 5.4.0 起已被移除。

然而,大多数网络托管服务器甚至还没有 PHP 5.3.0,而像 XAMPP 这样的私有服务器可能有更新版本的 PHP。因此,您的本地主机可能不会打开Magic Quotes ,而您的网络服务器会。

当将超全局值直接包含到查询中时, Magic Quotes使得无法执行 SQL 注入。例如:

<?php

$query = 'SELECT id FROM users WHERE name = "' . $_POST['name'] . '" AND password = "' . $_POST['password'] . "'";

?>

1" OR "1" = "1在字段中输入 a 的人password可以轻松地将查询更改为SELECT id FROM users WHERE name = "admin" AND password = "1" OR "1" = "1"在不知道密码的情况下有效地登录管理员帐户。


也就是说,我认为Magic Quotes只是人们不保护他们的输入的一种后备机制,你应该始终将其关闭。更好的做法是保护您自己的应用程序,而不是让 PHP 来做。

禁用魔术行情

这可以使用来完成,php.ini但我想您无权访问托管服务器上的该文件。以下代码段模拟禁用Magic Quotes

<?php

if( get_magic_quotes_gcp( ) )
{
    function stripslashes_deep( $val )
    {
        return is_array( $val ) ? array_map( 'stripslashes_deep', $val )
                                : stripslashes( $val );
    }
    
    $_GET     = stripslashes_deep( $_GET );
    $_POST    = stripslashes_deep( $_POST );
    $_COOKIE  = stripslashes_deep( $_COOKIE );
    $_REQUEST = stripslashes_deep( $_REQUEST );
}

?>
于 2012-05-17T13:30:11.827 回答
0

我想这是引起问题的单引号,尽管我已经在数组中对其进行了转义..

不,不是的。事实并非如此。

大概有一些 PHP 设置会影响这个?

不,没有影响它的 PHP 设置。

有人可以建议吗?

您应该在发布之前开始编写单元测试并测试您的代码。例如,您会发现您的函数只工作一次。下次调用时,替换对不再定义(require_once触发)。

在这个问题旁边,我可以想象你的实时系统上的数据与你的本地系统不同。如果您对本地系统上的相同数据执行该功能,您应该会发现它不能正常工作。

提示:

  1. 给予什么var_dump($string)
  2. strtr.
于 2012-05-17T13:07:38.527 回答