我有适用于PHP表单验证规则的规则,但我也不想要有效的但毫无意义的真实的人类垃圾邮件。当前,下面的JavaScript代码获取页面加载时间的时间戳和表单提交的时间戳。如果时差低于18秒,则会询问“您是超人吗?”在警报框中,并且不允许用户在时间到之前提交。

Q1)Date.now()受ie9 +支持。哪个替代功能可以在ie7 +中完成相同的工作? (参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/now#Browser_compatibility

Q2)此功能本身是否存在安全漏洞?我问是因为我怀疑代码是否可以从外部编辑变量document.getElementById('PageLoadTime').innerHTML = pageloaded

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>trial</title>
</head>
<body>

    <div>user page loading timestamp: <span id="PageLoadTime"></span></div>
    <div>form submission timestamp: <span id="submitTime"></span></div>
    <div>time difference: <span id="difference"></span></div>

    <script>
        var pageloaded = Date.now();
        document.getElementById('PageLoadTime').innerHTML = pageloaded;

        function GetSubmitTime(pageloaded) {
        document.getElementById('submitTime').innerHTML = Date.now();
        document.getElementById('difference').innerHTML = Math.floor((Date.now() -  pageloaded)/1000);
        if ( Math.floor((Date.now() -  pageloaded)/1000) < 18 )
            {
                if(event.preventDefault){
                            event.preventDefault();
                        }else{
                            event.returnValue = false; // for IE as dont support preventDefault;
                        }
                        alert("are you superman?");
            }
        }

    </script>

    <form method="post" action="my home page" onsubmit="GetSubmitTime(pageloaded)">
    <input type="text" id="e1" name="n1">

    <input type="submit" value="send" >
    </form>
</body>
</html>

最佳答案

Date.now()返回new Date().getTime()返回的内容,而后者基本上一直得到支持。

将元素的innerHTML设置为系统时间戳不会带来安全风险。

客户端中的任何内容都不会受到用户的篡改。任何使用您的表单的人都可以强制提交表单,而无需考虑您的时间检查。

关于javascript - Date.now()和innerHTML安全性的跨浏览器替代方案?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24933898/

10-11 22:25
查看更多