【问题标题】:Link click verification & PHP in Javascript functions?Javascript函数中的链接点击验证和PHP?
【发布时间】:2023-03-11 06:46:02
【问题描述】:

在任何人遇到安全问题之前,请不要打扰。

假设我有一个index.php

在这个页面上有很多指向“home.php”的链接,但是它们都有不同的数据存储在href 属性中。例如:

链接 1:'home.php?data=1&country=uk'

链接 2:'home.php?data=95&country=us'

用户只需输入www.website.com/home.php?data=*&country=* 并根据自己的喜好在 URL 中填写数据即可。

我在想的是,如果我有一个在单击其中一个链接时运行的函数,它会在到达目的地之前为 URL 添加一个值。例如:

原文链接:www.website.com/home.php?data=1&country=uk 点击链接:www.website.com/home.php?data=1&country=uk&verify=a8c9gj113

我无法解决的是如何在单击链接时更改 HTML 中的 href 数据,然后再实际前往目的地。

我的代码在下面(HTML 处于从数据库中提取数据的 while 循环中)

<a href='home.php?data=". $results['id'] ."&country=". $results['country'] .' onclick='return verify();'>

功能:

function verify()
{
document.getElementById("verify").href=""; 
return true;
}

所以对于函数中的 HREF 值,我将放置原始 URL (home.php?data=". $results['id'] ."&amp;country=". $results['country'] .) 加上一个额外的值。我该怎么做?

在 PHP 回显中,当您从变量等中添加值时,您只需用引号结束回显,然后添加点,如下所示:

echo "I am the". $whatami ."person in the world";

JavaScript 有类似的东西吗?当我将该 PHP URL 粘贴到 .href="" 的 JavaScript 函数中时,它会失败,因为我要关闭引号。

我希望人们明白我在说什么。

如果有更好的方法,请告诉我。

【问题讨论】:

  • 退房:stackoverflow.com/questions/4145531/… 也许你可以从那里得到想法
  • 如果您担心用户会更改输入,那么只提供他们允许更改的输入(并在下一页加载/计算其余部分) .例如,home.php?country=uk 然后在 home.php 中,按国家代码从数据库中加载数据。
  • 另外,这本质上是一个安全问题; 提及安全性的唯一方法是根本不回答。换句话说,是什么阻止我启动开发者工具(截至 2016 年,直接内置于所有主流浏览器中)、更改 HREF 以及 然后 在更改后的属性上调用 verify()?没有什么能阻止这一点,这使得 JS 端验证只对最不成熟的攻击者有用。
  • Piskvor,我不知道为什么我没有想到这一点。我想我们有时都会遇到“编码员”障碍,嗯,干杯!另外,“不提及安全问题”是为了让人们不要抱怨我使用不安全的方法 lmao。

标签: javascript php html security


【解决方案1】:

我认为你正在寻找类似的东西

<a href='home.php?data=". $results['id'] ."&country=". $results['country'] .' class="ahref">
    <script>
    $(document).ready(function(){
        $(".ahref").click(function(){
            var url = $(this).attr('href');
            url = url + "mycode";
            window.location = url;

            return false;
        })
    })

    </script>

【讨论】:

    【解决方案2】:
    <script>
    function verify(url)
    {
        url = url + "something";
        window.location = url;
        return false;
    }
    </script>
    
    <a onclick='return verify(this.href);' href='home.php?data=". $results['id'] ."&country=". $results['country'] .' >
    

    【讨论】:

      【解决方案3】:

      Users could easily just type in.... 暗示问题是关于防止用户访问他们不应该看到的信息,即安全性。但是您以...about security issues, don't bother 开始您的帖子。因此,远不清楚您对答案的实际期望。

      你说你想这样做when the link is clicked - 这意味着它需要在客户端用 Javascript 实现。您无法在客户端实施安全控制。

      做服务器端很容易。下面的代码使用静态盐作为哈希,但有更复杂的解决方案,例如使用会话 ID 会将重用限制在会话 ID 的生命周期内:

      /**
       * add a set of parameers to a URL with a verifiable hash
       *
       * @param $args array - associative array of name/value pairs
       * @param $base string - URL to add args to
       * @return string - the completed URL
       */
      function secure_url($args, $base)
      {
      $params='';
      $join='';
      ksort($args);
      foreach($args as $k=>$v) {
          $params.=$join . urlencode($k) . '=' . urlencode($v);
          $join='&';
      }
      $chk=md5($params . SECURE_URL_HASH_SEED);
      $params.=$join . 'chk=' . urlencode($chk);
      
      $d=parse_url($base);
      $out=$d['scheme'] ? $d['scheme'] . '://' : '';
      $out.=($d['user'] . $d['password'])
              ? $d['user'] . ':' . $d['password'] . '@' : '';
      $out.=$d['host'] . $d['path'];
      $out.='?' . ($d['query'] ? $d['query'] . '&' . $params
              : $params);
      $out.=$d['fragment'] ? '#' . $d['fragment'] : '';
      return $out;
      }
      
      /**
       * validate arguments in the current URL
       *
       * @param array $args - associative array - only keys are used
       * @return bool - true if valid
       */
      function verify_url($url=false)
      {
      if ($url) {
          $d=parse_url($url);
          parse_str($d['query'],$src);
      } else {
          $src=$_GET;
      }
      ksort($args);
      $paramlist='';
      $join='';
      foreach($args as $k=>$v) {
          $paramlist.=$join . urlencode($k) . '=' . urlencode($src[$k]);
          $join='&';
      }
      $chk=md5($paramlist . SECURE_URL_HASH_SEED);
      $paramlist.="&chk=" . urlencode($chk);
      
      return($chk===$src['chk']);
      }
      

      但是,这不是阻止用户访问他们不应该访问的信息的适当方法 - 正确的方法是在请求返回您的服务器时对其进行身份验证 - 我碰巧有这个原因上面的代码表明存在 一些 特殊情况,使用会话产生的问题多于解决的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-29
        • 2012-11-24
        • 2011-12-01
        • 2021-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多