通过 ajax 发送到 php 的数据是否可操作?

为了限制用户可以输入的文本区域中的字符,我在上面放了一个计数器。


// this is part of tinymce 

setup: function (ed) {

    ed.on('keyup', function (e) {

    var maxchars = <?php echo $max_chars_allowed; ?>; // determined in settings

    var countchars = CountCharacters();

    var charsleft = maxchars - countchars;


和函数 CountCharacters():


// counting characters textarea

function CountCharacters() {

    var body = tinymce.activeEditor.getBody();

    var content = tinymce.trim(body.innerText || body.textContent);

    return content.length;

};


现在我通过 ajax 将数据发送到 php 文件:


// count chars input

var countchars = CountCharacters();

$.ajax({

        url: 'comment.php',

        type: 'POST',

        data: { countchars:countchars }

        ...


              

要检查comment.php 中的数据:


$countchars = $_POST['countchars']; // countchars read from ajax 

$max_chars_allowed = 200;

if( $countchars > $max_chars_allowed ) {

    echo 'Max allowed characters exceeded. Reduce characters and submit again';

    ......

这一切都很好,但我的主要问题是:这样做安全吗?也许有人可以通过浏览器检查器操作 js var countchars并将其设置为 100,而实际上他在 textarea 中键入了 300 个字符?然后提交后,ajax 将 100 个字符发送到 php 文件,而不是他在 textarea 中键入的 300 个字符,并且 php 中的安全循环将被绕过......


HUH函数
浏览 107回答 1
1回答

慕沐林林

不要将该计数发送到 PHP 代码。你是对的,这是微不足道的绕过。相反,在 PHP 中获取注释文本,然后检查其长度,如果超过 200 个字符,则拒绝它。您的 JavaScript 代码只是为了提供 UI。实际检查应该在服务器端的实际数据上进行。在评论中你说:好吧,我曾经在 php 中检查输入,strlen但问题是:jslength每次都给我另一个值然后 php&nbsp;strlen。因此,当用户收到类似2 个字符的消息时,他提交数据并且 php 拒绝了它,因为strlen在 php 中比 js 多 5 个字符length这可能有多种原因,这里有两种可能性:行尾的差异。一些平台使用\r\n(两个字符)其他平台使用\n(一个字符)(旧的 Mac OS 使用\r,但那是几年前的事了)。您可以在计数时将它们标准化:var&nbsp;content&nbsp;=&nbsp;tinymce.trim(body.innerText&nbsp;||&nbsp;body.textContent); content&nbsp;=&nbsp;content.replace(/\r\n|\r|\n/g,&nbsp;"\n"); return&nbsp;content.length;(然后在 PHP 端也是同样的事情。)PHP 字符串每个字符一个字节,但这不是当今世界的现实。(我不知道您是否使用了intl或mbstring扩展,但如果没有,您可能想查看它们。)相比之下,JavaScript 的字符串是 UTF-16 (但它们容忍通常应该成对的孤立代理),例如,这意味着许多在 JavaScript 中算作一个字符的字符在 PHP 中算作不止一个字符。mbstring扩展程序的功能mb_strlen或类似功能可能会有所帮助。(一些“字符”甚至在 JavaScript 中需要两个或更多字符,因为它们使用代理对表示和/或因为它们使用组合标记,这些标记在 Unicode 中是每个单独的代码点。)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript