2016-01-19 19 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'] .' >