找回密码
 立即注册
搜索

[开发] 客户端浏览器是否禁用javascript脚本

[复制链接]
智慧谋略 发表于 2023-11-23 04:55:20 | 显示全部楼层 |阅读模式
一般来说,客户端浏览器是不会禁用javascript脚本的,因为很多网页都依赖javascript脚本,没有它网页就不能正常运行,会出现诸如网页不能完全显示,网页显示变乱等问题;因此一般情况下不需要检查客户端浏览器是否禁用javascript脚本,但如果用javascript脚本来保护文章内容,也就是用javascript代码禁止用户复制,一旦禁用了javacritp脚本也就能复制了。
用javascript脚本保护文章内容仅是一种轻量级的保护,因为用户仍然能轻而易举的获取文章内容,不说用软件工具抓取了,直接查看网页源码也能获取到文章内容;或许有人会说,禁止查看网页源码,其实这根本禁止不了,禁止了右键菜单中和浏览器菜单中的“查看网页源码”,还可以通过 Ctrl + U 查看。尽管如此,这个方法仍然能对文章起一定的保护作用,因为普通用户并不知道这些。
判断方法通常有多种,一方法是:当客户端打开网页时,用javascript把一个值赋给一个隐藏的input(也可以把值保存到Cookies中),然后在服务器端获取这个值,根据设置值是否成功来判断;另一种方法是:当客户端打开网页时,用ajax把一个值传给服务器,根据服务器是否能成功获取该值来判断。还有一种方法是用 noscript。

方法一:javascript把一个值赋给一个隐藏的input实例:html代码:
<input type="hidden" id="hidId" name="hidId" value="0" />
  <asp:Button ID="btn" runat="server" Text=" 提交 " />

javascript代码:
<script type="text/javascript">
  function CheckJavascriptOn() {
    var obj = document.getElementById("hidId");
    obj.value = "1";
  }
  CheckJavascriptOn();
  </script>

后台代码(C#):
protected void btn_Click(object sender, EventArgs e)
  {
    if(Request.Form["hidId"] == "1")
    Response.Write("客户端浏览器没有禁用javascript脚本");
  }
这种方法需要用户提交表单,服务器端才能获取到客户端设置的值。以上代码在客户端用javascript把隐藏的input(hidId)的值设置为1,如果在服务器端获取到hidId的值为1,则客户端没有禁用javascript;如果获取到hidId的值为0,客户端禁用了javascript脚本。

方法二:javascript把一个值保存到cookiesjavascript代码:
function CheckJavascriptOn() {
    setCookies("JsIsOn", "1", 3);
  }
function setCookies(cookieName, val, expireHours) {
    var str = cookieName + "=" + escape(val);
     if (expireHours > 0) {
      var date = new Date();
      date.setTime(date.getTime + expireHours * 3600 * 1000);
      str = str + "; expire=" + date.toGMTString();
    }
    document.cookie = str;
  }
  CheckJavascriptOn();

后台代码(C#):
if (Request.Cookies["JsIsOn"] != null && Request.Cookies["JsIsOn"].Value == "1")
    Response.Write("客户端浏览器没有禁用javascript脚本");
把 Javascript 的设置值保存到 Cookies 中,不需要用户提交表单,可以放到任意一个页;不过,如果用户禁用了 Cookies,这个方法就不行了,但禁用 Cookie 的用户不多。

方法三:把 Javascript 设置的值通过 ajax 传给服务器网页加载完成后,立即用 ajax 把一个值传给服务器,如果能正常传值,说明客户端浏览没有禁用 javascript。这种方法有一个缺点,当不怀好意的用户故意把网址复制到浏览器地址栏访问判断是否禁用 javascript 的页,容易造成错误的判断。
javascript代码:
var xmlhttp;
  function createXmlHttpObj() {
    try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); }
    catch (e) {
      try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }
      catch (e) {
        try { xmlhttp = new XMLHttpRequest(); }
        catch (e) { }
      }
    }
  }
  function JsIsOnCheck() {
    createXmlHttpObj();
    xmlhttp.open("get", "/test/JsIsOn.aspx?v=1", true);
    xmlhttp.onreadystatechange = function () {
      if (xmlhttp.readyState == 4 && xmlhttp.status == 200 && xmlhttp.responseText != "") {
        var resVal = xmlhttp.responseText;
      }
    };
    xmlhttp.setRequestHeader("If-Modified-Since", "0");
    xmlhttp.send(null);
  }
  JsIsOnCheck();

服务器端判断文件(JsIsOn.aspx)代码:
protected void Page_Load(object sender, EventArgs e)
  {
    string param = Request.QueryString["v"];
    if (!string.IsNullOrEmpty(param))
    {
      if (param == "1")
      {
        //客户端浏览器没有禁用javascript脚本
        Response.Clear();
        Response.Write(param);
        Response.Flush();
        Response.End();
      }
    }
  }

方法四:用 noscript当客户端禁用 javascript 时,<noscript></noscript>会显示,只要在其中放能一个自动访问服务器的链接,在服务器端就可以判断客户端是否禁用 javascript。把以下代码放到网页的 <head></head> 之间:
<noscript><meta http-equiv="refresh" content="0; url=IsDisable.aspx" /></noscript>
如果客户端禁用 javascript,打开网页时立即访问 IsDisable.aspx;如果客户端没有禁用 javascript,打开网页时不会访问 IsDisable.aspx。

 楼主| 智慧谋略 发表于 2023-11-23 04:55:35 | 显示全部楼层
php如何检测浏览器禁用了javascriptphp检测不了的 你可以给表单增加一个判断是否禁用js的隐藏域 将它的默认值设为1  然后在js代码里改变那个隐藏域的值为0 如果是禁用js的状态是改变不了值的
现在禁用JavaScript的浏览器用户应该很少,但网页编程人员还是需要考虑JS被禁用这个问题,特别是用户提交数据的时候不仅要在前台用JS检验,更要在后台用程序验证,此外,需要提醒用户开启JS以获得良好的网页浏览体验。

        在解决如何检测用户是否禁用JS的问题前,首先需要明白两点:
        1、JS是位于客户端而不是服务器端,当服务器响应完用户请求返回页面时,连带返回JS资源,这时候服务器没有控制权,对网页的处理权均在客户端了。

要检测Web浏览器中是否禁用了JavaScript,请使用<noscript>标记。HTML <noscript>标记用于处理浏览器,这些浏览器可以识别<script>标记,但不支持脚本。该标签用于显示替代文本消息。

这是一个例子


<!DOCTYPE html>
<html>
   <head>
      <title>HTML noscript Tag</title>
   </head>


   <body>
      <script>
         <!--
            document.write("您好JavaScript!")
         -->
      </script>
     
      <noscript>
         Your browser does not support JavaScript!
      </noscript>
   </body>
</html>
 楼主| 智慧谋略 发表于 2023-11-23 04:55:49 | 显示全部楼层

开启JS脚本反爬虫后,当客户端发送请求时,WAF会返回一段JavaScript代码到客户端。如果客户端是正常浏览器访问,就可以触发这段JavaScript代码再发送一次请求到WAF,即WAF完成JS验证,并将该请求转发给源站,如图1所示。

图1 JS脚本反爬虫正常检测流程

  • 如果客户端是爬虫访问,就无法触发这段JavaScript代码再发送一次请求到WAF,即WAF无法完成js验证。
  • 如果客户端爬虫伪造了WAF的认证请求,发送到WAF时,WAF将拦截该请求,js验证失败。
须知:
  • 开启JS脚本反爬虫,要求客户端浏览器具有JavaScript的解析能力,并开启了Cookie。
  • 如果客户端不满足以上要求,则只能完成①和②,此时客户端请求将不能成功获取到页面。




JS脚本检测流程如图1所示,其中,①和②称为“js挑战”,③称为“js验证”。

图1 JS脚本检测流程说明

开启JS脚本反爬虫后,当客户端发送请求时,WAF会返回一段JavaScript代码到客户端。

  • 如果客户端是正常浏览器访问,就可以触发这段JavaScript代码再发送一次请求到WAF,即WAF完成js验证,并将该请求转发给源站。
  • 如果客户端是爬虫访问,就无法触发这段JavaScript代码再发送一次请求到WAF,即WAF无法完成js验证。
  • 如果客户端爬虫伪造了WAF的认证请求,发送到WAF时,WAF将拦截该请求,js验证失败。

通过统计“js挑战”和“js验证”,就可以汇总出JS脚本反爬虫防御的请求次数。例如,图2中JS脚本反爬虫共记录了18次事件,其中,“js挑战”(WAF返回JS代码)为16次,“js验证”(WAF完成JS验证)为2次,“其他”(即爬虫伪造WAF认证请求)为0次。

图2 JS脚本反爬虫防护数据

须知:

“js挑战”和“js验证”的防护动作为仅记录,WAF不支持配置“js挑战”和“js验证”的防护动作。



约束条件
  • JS脚本反爬虫依赖浏览器的Cookie机制、JavaScript解析能力,如果客户端浏览器不支持Cookie,此功能无法使用。
  • 如果您的业务接入了CDN服务,请谨慎使用JS脚本反爬虫。

    由于CDN缓存机制的影响,JS脚本反爬虫特性将无法达到预期效果,并且有可能造成页面访问异常。





 楼主| 智慧谋略 发表于 2023-11-23 04:56:13 | 显示全部楼层
Web应用防火墙

Web应用防火墙(Web Application Firewall, WAF),通过对HTTP(S)请求进行检测,识别并阻断SQL注入、跨站脚本攻击、网页木马上传、命令/代码注入、文件包含、敏感文件访问、第三方应用漏洞攻击、CC攻击、恶意爬虫扫描、跨站请求伪造等攻击,保护Web服务安全稳定。

初识华为云WAF:灵活、精准的Web应用防护神器
[color=rgb(87, 93, 108) !important]Web应用防火墙(Web Application Firewall, WAF),通过对HTTP(S)请求进行检测,识别并阻断SQL注入、跨站脚本攻击、网页木马上传、命令/代码注入、文件包含、敏感文件访问、第三方应用漏洞攻击、CC攻击、恶意爬虫扫描、跨站请求伪造等攻击,保护Web应用安全无忧!

Web应用防火墙服务(Web Application Firewall,WAF)的介绍页入口:https://www.huaweicloud.com/product/waf.html


高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|探索掌握未知、共创美好未来

GMT+8, 2026-9-17 02:30 , Processed in 0.065265 second(s), 38 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表