我在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: </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's camera
。所以我想也许我必须使用decodeURIComponent(cameraname)在JS代码中对此进行解码,但这不起作用。谢谢你的帮助!
答案 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 + "'
部分中创建双引号问题。