链接点击验证与维护;Javascript函数中的PHP?

链接点击验证与维护;Javascript函数中的PHP?,javascript,php,html,security,Javascript,Php,Html,Security,在任何人对安全问题发表评论之前,不要麻烦 假设我有一个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中填充数据即可 我想的是,如果我有一个函数,在单击其中一个链接时运行,它

在任何人对安全问题发表评论之前,不要麻烦

假设我有一个
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循环中)

因此,对于函数中的HREF值,我将把原始URL(
home.php?data=“.$results['id']”和country=“.$results['country].
)加上一个额外的值。我该怎么做

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

echo "I am the". $whatami ."person in the world";
JavaScript有类似的功能吗?当我将PHP URL粘贴到
.href=”“
中的JavaScript函数中时,它将失败,因为我正在关闭引号

我希望人们能理解我的意思


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

我想您正在寻找类似

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

$(文档).ready(函数(){
$(“.ahref”)。单击(函数(){
var url=$(this.attr('href');
url=url+“mycode”;
window.location=url;
返回false;
})
})

我想您正在寻找类似

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

$(文档).ready(函数(){
$(“.ahref”)。单击(函数(){
var url=$(this.attr('href');
url=url+“mycode”;
window.location=url;
返回false;
})
})

用户可以很容易地键入….
意味着问题是关于阻止用户访问他们不应该看到的信息,即安全性。但是你的帖子一开始就提到了
…关于安全性问题,不用麻烦了。
。因此,还远没有弄清楚你对答案的实际期望

当点击链接时,你说你想这样做,这意味着它需要在客户端用Javascript实现。你不能在客户端实现安全控制

服务器端很容易实现。下面的代码对哈希使用静态salt,但还有更复杂的解决方案,例如,使用会话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']);
}

然而,这并不是阻止用户访问他们不应该访问的信息的适当方法-正确的方法是在请求返回到您的服务器时对其进行身份验证-我碰巧有上述代码的原因是,在一些特殊情况下,使用会话会产生更多的pr问题比它解决的要多。

用户可以轻松地键入….
意味着问题是关于阻止用户访问他们本不应该看到的信息,即安全性。但是你的帖子一开始就提到了
…关于安全性问题,不用麻烦了。
。因此,还远没有弄清楚你对答案的实际期望。

<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'] .' >
当点击链接时,你说你想这样做,这意味着它需要在客户端用Javascript实现。你不能在客户端实现安全控制

服务器端很容易实现。下面的代码对哈希使用静态salt,但还有更复杂的解决方案,例如,使用会话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']);
}
然而,这并不是阻止用户访问他们不应该访问的信息的适当方法-正确的方法是在请求返回到您的服务器时对其进行身份验证-我碰巧有上述代码的原因是,在一些特殊情况下,使用会话会产生更多的pr问题比它解决的多。


<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'] .' >
函数验证(url) { url=url+“某物”; window.location=url; 返回false; }

函数验证(url)
{
url=url+“某物”;
window.location=url;
返回false;
}

Check out:如果您担心用户会更改输入,那么您可以从中吸取教训,然后只给他们允许更改的输入(并在下一页加载/计算其余内容)例如,
home.php?country=uk
,然后在home.php中,按国家代码从数据库中加载数据。此外,这是一个本质上的安全问题;唯一不提及安全性的方法是根本不回答。换句话说,是什么阻止我提出开发工具(从2016年开始,直接构建到所有主要浏览器中),更改HREF,然后调用verify()在修改后的属性上?没有什么可以阻止这一点,这使得JS端验证只对最不成熟的攻击者有用。Piskvor,我不知道为什么我没有想到这一点。我想我们都会遇到“编码器”阻塞,呃,干杯!还有“不提安全问题”,我的意思是让人们不要因为我使用了不安全的方法而抱怨我检查:如果你担心用户会更改输入,那么只给他们允许更改的输入(并在下一页加载/计算其余内容)。例如,
home.php?country=uk
a