網站開放註冊的時候有一些渣渣就喜歡亂搞我們的網站。使我們站長們 都是蛋疼無比。所以就去百度找了找防止惡意註冊。一般都是加驗證碼。但是會網頁的人一般都是在你的要提交的那個頁面利用url傳參數。在寫入資料的檔案沒有寫好 就很容易被利用了! 所以我得出了2個解決方案
例子、
1.在提交的時候擷取用戶端IP 在IP第二次訪問或者第三次提交資料的時候視為惡意提交
2.使用session訪問2次或者3次 視為惡意註冊
以下是代碼:
代碼如下 |
複製代碼 |
<?php $cs = $_SESSION['cs'] = $_SESSION['cs']+1;//每訪問一次加1 $sql = "INSERT INTO ".$DB_PREFIX."user (username,password,nickname,role,photo,email,description) VALUES ('$username','$password','$user_namex','writer','','$name_mailbox','')"; if($cs < "2"){//頁面被反覆重新整理的時候 不執行代碼 if( mysql_query($sql) == 1){?> <script language="javascript" type="text/javascript"> location.href='cache.php'; </script> <?php }}else{echo "警告別惡意註冊!"; } ?> |
當然這個辦法也不是很好的。但是目前就感覺這個比較好了
例子、
比較進階的辦法RSA演算法進行加密通訊 .
avascript部分代碼(with jQuery)
代碼如下 |
複製代碼 |
$(document).ready(function(){ //十六進位公開金鑰 var rsa_n = "C34E069415AC02FC4EA5F45779B7568506713E9210789D527BB89EE462662A1D0E94285E1A764F111D553ADD7C65673161E69298A8BE2212DF8016787E2F4859CD599516880D79EE5130FC5F8B7F69476938557CD3B8A79A612F1DDACCADAA5B6953ECC4716091E7C5E9F045B28004D33548EC89ED5C6B2C64D6C3697C5B9DD3"; $("#submit").click(function(){ setMaxDigits(131); //131 => n的十六進位位元/2+3 var key = new RSAKeyPair("10001", '', rsa_n); //10001 => e的十六進位 var password = $("#password").val(); password = encryptedString(key, password); //不支援漢字 $("#password").val(password); $("#login").submit(); alert(password); //test }); }); |
PHP部分代碼
代碼如下 |
複製代碼 |
/** * 公開金鑰加密 * www.111Cn.net * @param string 明文 * @param string 認證檔案(.crt) * @return string 密文(base64編碼) */ function publickey_encodeing($sourcestr, $fileName) { $key_content = file_get_contents($fileName); $pubkeyid = openssl_get_publickey($key_content); if (openssl_public_encrypt($sourcestr, $crypttext, $pubkeyid)) { return base64_encode("".$crypttext); } } /** * 私密金鑰解密 * * @param string 密文(二進位格式且base64編碼) * @param string 密鑰檔案(.pem / .key) * @param string 密文是否來源於JS的RSA加密 * @return string 明文 */ function privatekey_decodeing($crypttext, $fileName, $fromjs = FALSE) { $key_content = file_get_contents($fileName); $prikeyid = openssl_get_privatekey($key_content); $crypttext = base64_decode($crypttext); $padding = $fromjs ? OPENSSL_NO_PADDING : OPENSSL_PKCS1_PADDING; if (openssl_private_decrypt($crypttext, $sourcestr, $prikeyid, $padding)) { return $fromjs ? rtrim(strrev($sourcestr), "/0") : "".$sourcestr; } return ; } //JS->PHP 測試 $txt_en = $_POST['password']; $txt_en = base64_encode(pack("H*", $txt_en)); $file = 'ssl/server.pem'; $txt_de = privatekey_decodeing($txt_en, $file, TRUE); var_dump($txt_de); //PHP->PHP 測試 www.111cn.net $data = "漢字:1a2b3c"; $config = Core::getInstance()->config; $file1 = 'ssl/server.crt'; $file2 = 'ssl/server.pem'; $a = publickey_encodeing($data, $file1); $b = privatekey_decodeing($a, $file2); var_dump($b); |
其中密鑰的擷取是關鍵(其他痛點已經被從代碼中解決)