2016-01-19 20 views
0

在任何人对安全问题发表评论之前,请不要打扰。链接点击验证和JavaScript中的PHP函数?

比方说,我有一个index.php

在此页面上有各种指向'home.php'的链接,但它们都具有不同的数据存储在href属性中。例如:

链接1:'?home.php数据= 1个&国家=英国

链接2: '?home.php数据= 95 &国家=美国'

用户可以很容易地只是输入www.website.com/home.php?data=*&country=*并填入URL中的数据以符合他们的喜好。

我在想如果我有一个函数,当点击这些链接之一时运行,这会在到达目的地之前在URL上添加一个值。 E.g:

原文链接: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值原始网址(home.php?data=". $results['id'] ."&country=". $results['country'] .)加上额外的值。我怎样才能做到这一点?

在当你从一个变量添加值或者等你只是简单地结束与报价回声一个PHP回声,然后加点,如下图所示:

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

是否有这样的JavaScript的东西吗?当我将这个PHP URL粘贴到.href=""的JavaScript函数中时,它只会失败,因为我正在关闭引号。

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

如果有更好的方法来做到这一点,请告诉我。

+0

退房:http://stackoverflow.com/questions/4145531/how-to-create-and-use-nonces可能是你可以从那里 –

+1

如果你担心用户会改变主意拿输入,然后只给他们他们被允许*改变的输入(并加载/计算下一页中的其余部分)。例如,'home.php?country = uk',然后在home.php中,通过国家代码加载数据库中的数据。 – Piskvor

+2

另外,这本质上是一个安全问题; *不提及安全性的唯一方法是根本不回答。换句话说,是什么阻止我提出开发人员工具(截至2016年,直接构建到所有主流浏览器中),更改HREF,然后*然后*调用verify()以更改属性?没有什么能够阻止这种情况,这使得JS端验证仅对最复杂的攻击者有用。 – Piskvor

回答

2

我认为你正在寻找的东西像

<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> 
0

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']); 
} 

然而,这并不是合适的手段来阻止用户访问他们不应该的信息 - 在正确方式是验证当它返回到你的服务器请求 - 我碰巧有上面的代码躺在这里的原因是,有一些使用会话创造更多的问题比它解决的利基情况。

0
<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'] .' >