为了限制用户可以键入的文本区域中的字符,我在它上面放了一个计数器。
// 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中的安全循环将被绕过。
不要将计数发送到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中各自是独立的代码点。)