提问者:小点点

通过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计数字符,例如,将其设置为100,而实际上他在文本区域中键入300个字符? 然后在提交之后,ajax向php文件发送100个字符,而不是他在textarea中键入的300个字符,php中的安全循环将被绕过。


共1个答案

匿名用户

不要将计数发送到PHP代码。 你说得对,绕开这是件小事。 相反,用PHP获取注释文本,然后检查其长度,如果长度超过200个字符就拒绝它。

JavaScript代码只是用来提供UI的。 实际的检查应该是在服务器端的实际数据上。

你在评论中说:

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

这可能有多种原因,以下是几种可能性:

>

  • 行尾的差异。 一些平台使用\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端进行同样的操作。)

    PHP字符串是每个字符一个字节,但这不是当今世界的现实。 (我不知道您使用的是intl扩展名还是mbstring扩展名,但如果没有,您可能需要研究一下它们。) 相反,JavaScript的字符串是UTF-16(但它们允许独立的代理项,这些代理项通常应该是成对的),因此,例如,这意味着在JavaScript中算作一个字符的许多字符在PHP中算作一个以上的字符。 mbstring扩展的mb_strlen函数或类似函数可能会有帮助。 (有些“字符”甚至需要JavaScript中的两个或更多字符,这可能是因为它们使用代理项对表示,或者是因为它们使用组合标记,这些标记在Unicode中各自是独立的代码点。)