chu*_*tar 0 php web-services httpwebrequest
我是第一次用PHP编写Web服务并遇到了一些安全问题.
1)我计划在将数据写入数据库(或验证用户)之前使用md5()散列密码但我意识到要这样做,我必须将明文密码传输到服务器并在那里散列.
因为这个我想到md5()用javascript客户端进行,然后在服务器上重新进行,但是如果javascript被禁用,那么用户无法登录,对吧?
2)我听说过任何操作只读,你应该使用GET,但如果它修改了数据库,你应该使用POST.是不是像GET一样透明,只是不在地址栏中?
通常不建议您实现自己的散列层.我敢肯定,如果你只是为了学习目的而做一个非常小的网站,md5会很好,但是如果你要为更大的网站存储重要信息,你应该使用一个库,比如PHPass:
感谢Jacco提供的这个PHPass代码片段:
require('PasswordHash.php');
$pwdHasher = new PasswordHash(8, FALSE);
// $hash is what you would store in your database
$hash = $pwdHasher->HashPassword( $password );
// $hash would be the $hashed stored in your database for this user
$checked = $pwdHasher->CheckPassword($password, $hash);
if ($checked) {
echo 'password correct';
} else {
echo 'wrong credentials';
}
Run Code Online (Sandbox Code Playgroud)
如果你坚持自己做,你应该加密密码.见http://phpsec.org/articles/2005/password-hashing.html.
define('SALT_LENGTH', 9);
function generateHash($plainText, $salt = null)
{
if ($salt === null)
{
$salt = substr(md5(uniqid(rand(), true)), 0, SALT_LENGTH);
}
else
{
$salt = substr($salt, 0, SALT_LENGTH);
}
return $salt . sha1($salt . $plainText);
}
Run Code Online (Sandbox Code Playgroud)
GET和POST之间差异的原因是浏览器解释请求的方式.如上所述,Web爬网程序不会执行POST请求.但是想象一下,你去了你网站上的一个页面http://example.com/deleteuser.php?userid=25来删除一个讨厌的垃圾邮件发送者.然后关闭浏览器.下次你回来火狐重新打开那个页面,你不幸删除了刚刚注册的用户!
GET与POST的另一个原因是部分防止跨站点请求伪造.如果您有一个在GET请求中注销用户的页面,则有人可能会将图像标记嵌入到评论或论坛帖子中<img src="http://example.com/logout.php" />,并且浏览器将被强制执行注销操作.因此,任何查看该页面的用户都将被注销,即使他们是管理员.
编辑:顺便说一下,你应该使用sha-256或bcrypt而不是md5,它已被破解(?).
| 归档时间: |
|
| 查看次数: |
1056 次 |
| 最近记录: |