特殊字符缺失

时间:2012-03-21 20:44:12

标签: php jquery

我在html表中有一个摄像头名称列表。如果您愿意,可以点击编辑按钮编辑摄像机名称。

这会打开一个表单(加上许多其他选项),相机名称现在可以编辑。

var edit = function(t, to, cameratype, cameraname, ...)
{
   var mydiv = js("#editform");

   if (mydiv.find("form").length) {
      mydiv.show();
   } else {
    // fields
    var $myform = js("<form id='EditCameraForm' name='' method='post' action='" + to + "'></form>");
    var $myfieldset = js("<fieldset><legend>Edit camera settings</legend></fieldset>");
    var $myinput = js("<input type='hidden' name='camera_type' value='" + cameratype + "' />");
    var $mylabel = js("<label for='CameraName'>Camera name:&nbsp;</label>");
    var $myinput2 = js("<input id='CameraName' name='camera_name' size='25' value='" + cameraname + "'  />");

    $myform.append($myinput, $mylabel, $myinput2, ...);
}

我的问题是传递了cameraname。我允许特殊字符。因此,您可以调用相机Joe's camera

当我点击编辑按钮时,相机名称显示为Joe

这与我在首次创建相机名称时在php中的验证功能有关...我相信:

function check_input($data)
{
            $data = trim($data);
            $data = stripslashes($data);
            $data = mb_convert_encoding($data, 'UTF-8', 'UTF-8');
            $data = htmlentities($data, ENT_QUOTES, 'UTF-8');

            return $data;
 }

cameraname通过按钮点击传递:

<button id="editbutton" onClick='edit(this, "<?php echo htmlentities($_SERVER['REQUEST_URI']); ?>", "<?php echo $result_cameras[$i]["camera_type"]; ?>", "<?php echo $result_cameras[$i]["camera_name"]; ?>", ...)'>Edit</button>

如果您查看此页面来源,则会显示:Joe&#039;s camera。所以我想也许我必须使用decodeURIComponent(cameraname)在JS代码中对此进行解码,但这不起作用。谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

我发现这段代码有些问题,但是让我们从你的check_input()函数开始,因为你认为它是可疑的。

如果你知道魔法引号已经开启,那么你应该stripslashes()。你正在从UTF-8到UTF-8进行mb_convert_encoding()吗?这有什么理由吗? htmlentities()有效,但我认为您需要htmlspecialchars()

function check_input($data)
{
    $data = trim($data);
    $data = (get_magic_quotes_gpc()) ? stripslashes($data) : $data;
    $data = htmlspecialchars($data, ENT_QUOTES, 'UTF-8');

    return $data;
}

TomPepernic说:

  

不确定我理解。我正在使用check_input清理任何用户输入,例如:$ camera_name = check_input($ _ POST ['camera_name']);,然后在将数据库插入数据库之前使用mysql_real_escape_string。这是错的? - Tom Pepernic 2小时前

@TomPepernic与许多问题一样,如果不了解程序的全部范围,很难给出明确的“正确”或“错误”答案。根据经验,我可以告诉你,虽然在许多情况下通常被认为是可接受的,但它很少是最佳解决方案。

假设程序在开始时基于单一卫生设施对恶意数据“安全”的假设是一个有缺陷的模型。因为很少有可能知道每个可能的数据出口,所以您将无法使用单一方法进行消毒以使所有数据出口都有效。在程序开始时,您正在清理HTML,但就是这样。稍后在您的程序中,您必须转义SQL,因为清理无效。如果后来您决定将其存储在不是SQL的其他数据库类型中,该怎么办?您将再次必须清理该特定数据库。一种更好的方法是假设数据在每个级别都受到污染,然后在它到达出口之前进行必要的消毒。

另一个原因是因为您在程序的PHP部分中对HTML进行清理。在这个阶段,恶意数据几乎不可能损害您的PHP。因为您的PHP代码和HTML代码应该是分开的,所以您正在清理错误的语言。 HTML的清理应该出现在程序的“视图”部分(假设您使用的是MVC方法)。

我会厌烦您的最后一个原因是您在处理数据之前正在更改数据。通常,最好使用原始数据并存储原始数据。更改数据后,如果以后需要,则更难或不可能恢复数据。多年前我学到了很多困难。我开发了一个小型论坛应用程序,它使用专有的BBcode语法来添加文本格式,图像和链接。我在存储数据之前对其进行了清理和处理,确定我再也不需要原始数据了。后来我发现语法存在问题,因为它需要更改,因为它导致某些帖子显示不正确。我能够在我的代码中进行更正,这将适用于所有未来的帖子。不幸的是,所有以前受到问题影响的帖子都无法修复,因为我已将它们存储在破损的处理表单中。如果我存储了原件,我将能够重新处理它们,并且没有任何数据丢失。

答案 1 :(得分:1)

不要像你一样构建输入框,而是尝试使用更多的Jquery。

var $myinput = js('<input/>').attr('type','hidden').attr('name','camera_type').val(cameratype);

您的问题很可能是在value='" + cameratype + "'部分中创建双引号问题。