为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

HUH函数 2022-10-21 15:23:49
为了限制用户可以输入的文本区域中的字符,我在上面放了一个计数器。// 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 textareafunction CountCharacters() {    var body = tinymce.activeEditor.getBody();    var content = tinymce.trim(body.innerText || body.textContent);    return content.length;};现在我通过 ajax 将数据发送到 php 文件:// count chars inputvar 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 中的安全循环将被绕过......
查看完整描述

1 回答

?
慕沐林林

TA贡献2016条经验 获得超9个赞

不要将该计数发送到 PHP 代码。你是对的,这是微不足道的绕过。相反,在 PHP 中获取注释文本,然后检查其长度,如果超过 200 个字符,则拒绝它。

您的 JavaScript 代码只是为了提供 UI。实际检查应该在服务器端的实际数据上进行。


在评论中你说:

好吧,我曾经在 php 中检查输入,strlen但问题是:jslength每次都给我另一个值然后 php strlen。因此,当用户收到类似2 个字符的消息时,他提交数据并且 php 拒绝了它,因为strlen在 php 中比 js 多 5 个字符length

这可能有多种原因,这里有两种可能性:

  1. 行尾的差异。一些平台使用\r\n(两个字符)其他平台使用\n(一个字符)(旧的 Mac OS 使用\r,但那是几年前的事了)。您可以在计数时将它们标准化:

    var content = tinymce.trim(body.innerText || body.textContent);
    content = content.replace(/\r\n|\r|\n/g, "\n");
    return content.length;

    (然后在 PHP 端也是同样的事情。)

  2. PHP 字符串每个字符一个字节,但这不是当今世界的现实。(我不知道您是否使用了intlmbstring扩展,但如果没有,您可能想查看它们。)相比之下,JavaScript 的字符串是 UTF-16 (但它们容忍通常应该成对的孤立代理),例如,这意味着许多在 JavaScript 中算作一个字符的字符在 PHP 中算作不止一个字符。mbstring扩展程序的功能mb_strlen或类似功能可能会有所帮助。(一些“字符”甚至在 JavaScript 中需要两个或更多字符,因为它们使用代理对表示和/或因为它们使用组合标记,这些标记在 Unicode 中是每个单独的代码点。)


查看完整回答
反对 回复 2022-10-21
  • 1 回答
  • 0 关注
  • 106 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号