2017-08-23 134 views
-1

阻止其他网站发送数据到我的网站在PHP中的最佳方法是什么?如何防止其他网站发送数据到我的网站在PHP

我把它搜索了一遍,发现我需要使用哈希。但是有不同的哈希,哪一个可以使用?比方说,我挑sha1

现在,我究竟能避免其他网站后的数据发送到我的网站sha1

我有点糊涂了,可有人告诉我一个小演示代码。

这是代码,我想,但它并非无懈可击..

Index.php page:

$password = sha1("toby123"); 

<form method="post" action="insert.php" /> 
<input type="text" name="username"/> 
<input type="password" name="password"/> 
<input type="hidden" name="hiddenpass" value=" ".$password." "/> 
</form> 

插入到数据库中的PHP页面:

$hiddenpass = "toby123" 

if ( $_POST["hiddenpass"] == "sha1($hiddenpass)" ) 

{ 
// INSERT THE DATA 
} 

但这里的问题是,表格中的代码将对每个人都是可见的。如果有人破解它会怎么样?

我的意思是,通过使用命中&试验方法???

我的方法是否100%安全?

编辑:

这是在寻找答案的一个后,我的新代码,但如果条件永远是假的。

index.php页面

<?php 
// Start the session 
session_start(); 


    $token = bin2hex(random_bytes(32)); 

    if (!isset($_SESSION['token'])) { 
     $_SESSION['token'] = $token; 
    } 

?> 

Insert.php页:

session_start(); 

echo $_SESSION['token']; 
echo '<br/>'; 
echo $_POST['token']; 

if ( (isset($_SESSION['token'])) && ($_POST['token'] == $_SESSION['token'])) 

{ 

// Insert Data 

} 
else 
echo "<br/>Something went wrong"; 


unset($_SESSION['token']); 

输出:

055442be59701631db6ed88dc341027ebf2238507bb9a72f1caefd6d3b126a4b

055442be59701631db6ed88dc341027ebf2238507bb9a72f1caefd6d3b126a4b

出了错

+5

您不能阻止他们以这种方式发送POST数据(到PHP运行时请求已发送),但您应该查找的术语是CSRF令牌,它们丢弃一个令牌。 –

+0

@JonStirling此评论应该是一个答案 – Philipp

+0

不确定。这不是一个答案,更多的是“你应该去研究这个术语”,这不是严格的答案。 –

回答

1

您应该通过添加使用CSRF令牌来保护您的表单。 CSRF令牌应该始终是随机的。 CSRF代表(跨站请求Frogery)


这里是一个很好的和安全的方法:

<?php 

function random_token() 
{ 

    $token = bin2hex(random_bytes(32)); 

    return $token; 
} 


function gentoken() 
{ 
    if (!isset($_SESSION['token'])) { 
     $_SESSION['token'] = random_token(); 
    } 
} 


function checktoken($token) 
{ 
    if (isset($_SESSION['token']) && $token === $_SESSION['token']) { 
     deletetoken(); 
     return true; 
    } 
    return false; // default 
} 


function deletetoken() 
{ 
    unset($_SESSION['token']); 
} 

?> 

而这里应该是你的形式

<form method="post" action="insert.php"/> 
<input type="text" name="username"/> 
<input type="password" name="password"/> 
<input type = "hidden" name="token" value="' . $_SESSION['token'] . '"> 
<input type = "submit" name="submit" value="Insert"/> 
</form> 

当页面开始时,写下:

gentoken(); 

**And to check for the token do this** 



if (isset($_POST['submit'])) { 

    $token = $_POST['token']; 
    if (checktoken($token)) { 

    } else { 
     echo "Something wrong happened"; //When the token is changed or doesn't match! 
    } 

} 

注:

random_bytes()生成安全密码学字节,并且不需要被散列!

我希望这有助于。祝你好运!

+0

我从来没有在PHP中使用函数。但是我认为这段代码可能没有功能,对吧?那么为什么使用函数?为什么复杂的代码。 – Toby

+1

@Toby我通常创建一个名为functions.php的文件,其中使用了多于一页的代码,并且每当我需要使用它时,我只是将函数文件包含在另一页中,而不是一遍又一遍地写每次! –

+0

嗨idk为什么,但这个条件'if(isset($ _ SESSION ['token'])&& $ token === $ _SESSION ['token']){'总是false ... – Toby

0

答案很简单,你不能。如果一个页面可以在公共互联网上查看,那么数据可以发布给它。

实施合理的数据卫生和验证以保护应用程序的完整性由您决定。首先,不要在表单中放置散列密码,即使隐藏字段也是如此!存储哈希密码并散列客户端发送的任何值。这样,您可以比较密码哈希值而不暴露它们。

-1

而不是使用“toby123”使用很多cmplex和长随机生成的字符串。 为了更安全,您可以使用两个哈希值。

session_start(); 
// if there is data submitted 
if(isset($_POST['submit'])){ 
$password1 = $_SESSION['password1']; 
$password2 = $_SESSION['password2']; 
//check these passwords 
if($_POST['password1']==$password1 && $_POST['password2']==$password2){ 
// code to pe processed 

}else{ 
echo '<h1>FORBIDDEN</h1>'; 
} 
}else{ 
$rand1 = md5(uniqid().mt_rand()); 
$rand1 = md5(uniqid().mt_rand().uniqid()); 
$password1 = sha1($rand1); 
$password2 = sha1($rand2); 
$_SESSION['password1'] = $password1; 
$_SESSION['password2'] = $password2; 
} 
+0

不安全:mt_rand不再安全,它甚至不会生成安全密码字节,并且能够通过强力破解和预测! –

+0

另外,md5不是散列的好方法! –

相关问题