详细内容见程序注释.
[php]
/**
* 功能: 模拟新浪微博登陆
* 用途: 模拟用户登陆, 以便进行后续操作, 比如自动化的控制自己的新浪app刷新某些数据
* 注意事项:
* 1. 需要安装nodejs
* 2. 需要下载新浪的加密js文件, 请到新浪登陆页查看网络请求自己下载最新版本(我当时用的: http://js.t.sinajs.cn/t35/miniblog/static/js/sso.js?version=e482ef2bbdaa8bc2)
* 3. 对新浪加密js文件进行修改, 以便让nodejs可以运行它
* 1) 在文件前面增加下面内容
var window = {
location : {
hash : '',
host : 'weibo.com',
hostname : 'weibo.com',
href : 'http://weibo.com/',
pathname : '/',
port : '',
protocol : 'http:',
search : ''
},
navigator : {
appCodeName : 'Mozilla',
appName : 'Netscape',
appVersion : '5.0 (Macintosh)',
buildID : '20120713134347',
cookieEnabled : true,
doNotTrack : 'unspecified',
language : 'en-US'
}
};
var location = window.location;
var navigator = window.navigator;
* 2) 在文件后面增加下面内容
var argv = process.argv.splice(2);
var pubkey = argv[0],
servertime = argv[1],
nonce = argv[2],
password = argv[3];
var RSAKey = new sinaSSOEncoder.RSAKey();
RSAKey.setPublic(pubkey, '10001');
password = RSAKey.encrypt([servertime, nonce].join("\t") + "\n" + password);
console.log(password);
process.exit();
* 4. 修改encode_password函数中的nodejs程序路径和修改后的新浪js文件路径
* 5. 修改用户名密码
* author: selfimpr
* blog: http://blog.csdn.net/lgg201
* mail: lgg860911@yahoo.com.cn
*/
define('REQUEST_METHOD_GET', 'GET');
define('REQUEST_METHOD_POST', 'POST');
define('REQUEST_METHOD_HEAD', 'HEAD');
define('COOKIE_FILE', '/tmp/sina.login.cookie');
function curl_switch_method($curl, $method) {
switch ( $method) {
case REQUEST_METHOD_POST:
curl_setopt($curl, CURLOPT_POST, TRUE);
break;
case REQUEST_METHOD_HEAD:
curl_setopt($curl, CURLOPT_NOBODY, TRUE);
break;
case REQUEST_METHOD_GET:
default:
curl_setopt($curl, CURLOPT_HTTPGET, TRUE);
break;
}
}
function curl_set_headers($curl, $headers) {
if ( emptyempty($headers) ) return ;
if ( is_string($headers) )
$headers = explode("\r\n", $headers);
#类型修复
foreach ( $headers as &$header )
if ( is_array($header) )
$header = sprintf('%s: %s', $header[0], $header[1]);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
}
function curl_set_datas($curl, $datas) {
if ( emptyempty($datas) ) return ;
curl_setopt($curl, CURLOPT_POSTFIELDS, $datas);
}
function curl_request($url, $method = REQUEST_METHOD_GET, $datas = NULL, $headers = NULL) {
static $curl;
if ( !$curl )
$curl = curl_init();
curl_switch_method($curl, $method);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($curl, CURLOPT_AUTOREFERER, TRUE);
curl_setopt($curl, CURLOPT_COOKIEJAR, COOKIE_FILE);
curl_setopt($curl, CURLOPT_COOKIESESSION, TRUE);
if ( $datas )
curl_set_datas($curl, $datas);
if ( $headers)
curl_set_headers($curl, $headers);
$response = curl_exec($curl);
if ( $errno = curl_errno($curl) ) {
error_log(sprintf("%10d\t%s\n", $errno, curl_error($curl)), 3, 'php://stderr');
return FALSE;
}
return $response;
}
function get_js_timestamp() {
return time() * 1000 + rand(0, 999);
}
function http_build_query_no_encode($datas) {
$r = array();
foreach ( $datas as $k => $v )
$r[] = $k . '=' . $v;
return implode('&', $r);
}
function makeUrl($url, $info, $encode = TRUE) {
if ( !is_array($info) || emptyempty($info) ) return $url;
$components = parse_url($url);
if ( array_key_exists('query', $components) )
$query = parse_str($components['query']);
else
$query = array();
if ( is_string($info) ) $info = parse_str($info);
$query = array_merge($query, $info);
$query = $encode
? http_build_query($query)
: http_build_query_no_encode($query);
$components['scheme'] = array_key_exists('scheme', $components)
? $components['scheme'] . '://'
: '';
$components['user'] = array_key_exists('user', $components)
? $components['user'] . ':' . $components[HTTP_URL_PASS] . '@'
: '';
$components['host'] = array_key_exists('host', $components)
? $components['host']
: '';
$components['port'] = array_key_exists('port', $components)
? ':' . $components['port']
: '';
$components['path'] = array_key_exists('path', $components)
? '/' . ltrim($components['path'], '/')
: '';
$components['query'] = $query
? '?' . $query
: '';
$components['fragment'] = array_key_exists('fragment', $components)
? '#' . $components['fragment']
: '';
return sprintf('%s%s%s%s%s%s%s', $components['scheme'], $components['user'], $components['host'],
$components['port'], $components['path'],
$components['query'], $components['fragment']);
}
function encode_username($username) {
return base64_encode(urlencode($username));
}
function encode_password($pub_key, $password, $servertime, $nonce) {
#这里是要用nodejs执行新浪的js文件
$response = `/usr/local/node.js-0.8.8/bin/node sina.js "$pub_key" "$servertime" "$nonce" "$password"`;
return substr($response, 0, strlen($response) - 1);
}
function main_page() {
return curl_request('weibo.com');
}
function prepare_login_info() {
$time = get_js_timestamp();
$url = makeUrl('http://login.sina.com.cn/sso/prelogin.php', array(
'entry' => 'sso',
'callback' => 'sinaSSOController.preloginCallBack',
'su' => encode_username('undefined'),
'rsakt' => 'mod',
'client' => 'ssologin.js(v1.4.2)',
'_' => $time,
), FALSE);
$response = curl_request($url);
$length = strlen($response);
$left = 0;
$right = $length - 1;
while ( $left
if ( $response[$left] == '{' ) break;
else $left ++;
while ( $right > 0 )
if ( $response[$right] == '}' ) break;
else $right --;
$response = substr($response, $left, $right - $left + 1);
return array_merge(json_decode($response, TRUE), array(
'preloginTime' => max(get_js_timestamp() - $time, 100),
));
}
function login($info, $username, $password) {
$feedbackurl = makeUrl('http://weibo.com/ajaxlogin.php', array(
'framelogin' => 1,
'callback' => 'parent.sinaSSOController.feedBackUrlCallBack',
));
$datas = array(
'encoding' => 'UTF-8',
'entry' => 'weibo',
'from' => '',
'gateway' => 1,
'nonce' => $info['nonce'],
'prelt' => $info['preloginTime'],
'pwencode' => 'rsa2',
'returntype' => 'META',
'rsakv' => $info['rsakv'],
'savestate' => 7,
'servertime' => $info['servertime'],
'service' => 'miniblog',
'sp' => encode_password($info['pubkey'], $password, $info['servertime'], $info['nonce']),
'ssosimplelogin' => 1,
'su' => encode_username($username),
'url' => $feedbackurl,
'useticket' => 1,
'vsnf' => 1,
);
$url = makeUrl('http://login.sina.com.cn/sso/login.php', array(
'client' => 'ssologin.js(v1.4.2)',
), FALSE);
$response = curl_request($url, REQUEST_METHOD_POST, $datas);
$sign = 'location.replace(\'';
$response = substr($response, strpos($response, $sign) + strlen($sign));
$location = substr($response, 0, strpos($response, '\''));
$response = curl_request($location);
$length = strlen($response);
$left = 0;
$right = $length - 1;
while ( $left
if ( $response[$left] == '{' ) break;
else $left ++;
while ( $right > 0 )
if ( $response[$right] == '}' ) break;
else $right --;
$response = substr($response, $left, $right - $left + 1);
return json_decode($response, true);
}
$info = prepare_login_info();
$info = login($info, '用户名', '密码');
echo curl_request('http://weibo.com/u/' . $info['userinfo']['uniqueid'] . $info['userinfo']['userdomain']);

phpsessionstrackuserdataacrossmultiplepagerequestsususingauniqueIdStoredInAcookie.here'showtomanagetheMeftically : 1) STARTASESSIONSTART_START () andSTAREDATAIN $ _SESSION.2) RegenerATERATESSESSIDIDAFTERLOGINWITHSESSION_RATERATERATES (True) TopreventSES

PHP에서 세션 데이터를 통한 반복은 다음 단계를 통해 달성 할 수 있습니다. 1. Session_start ()를 사용하여 세션을 시작하십시오. 2. $ _session 배열의 모든 키 값 쌍을 통해 Foreach 루프를 통과합니다. 3. 복잡한 데이터 구조를 처리 할 때 is_array () 또는 is_object () 함수를 사용하고 print_r ()를 사용하여 자세한 정보를 출력하십시오. 4. Traversal을 최적화 할 때 페이징을 사용하여 한 번에 많은 양의 데이터를 처리하지 않도록 할 수 있습니다. 이를 통해 실제 프로젝트에서 PHP 세션 데이터를보다 효율적으로 관리하고 사용하는 데 도움이됩니다.

이 세션은 서버 측 상태 관리 메커니즘을 통해 사용자 인증을 인식합니다. 1) 세션 생성 및 고유 ID의 세션 생성, 2) ID는 쿠키를 통해 전달됩니다. 3) ID를 통해 서버 저장 및 세션 데이터에 액세스합니다. 4) 사용자 인증 및 상태 관리가 실현되어 응용 프로그램 보안 및 사용자 경험이 향상됩니다.

tostoreauser'snameinaphpsession, startSessionstart_start (), wathsignthenameto $ _session [ 'username']. 1) useSentess_start () toinitializethesession.2) assimeuser'snameto $ _session [ 'username']

phpsession 실패 이유에는 구성 오류, 쿠키 문제 및 세션 만료가 포함됩니다. 1. 구성 오류 : 올바른 세션을 확인하고 설정합니다. 2. 쿠키 문제 : 쿠키가 올바르게 설정되어 있는지 확인하십시오. 3. 세션 만료 : 세션 시간을 연장하기 위해 세션을 조정합니다 .GC_MAXLIFETIME 값을 조정하십시오.

PHP에서 세션 문제를 디버그하는 방법 : 1. 세션이 올바르게 시작되었는지 확인하십시오. 2. 세션 ID의 전달을 확인하십시오. 3. 세션 데이터의 저장 및 읽기를 확인하십시오. 4. 서버 구성을 확인하십시오. 세션 ID 및 데이터를 출력, 세션 파일 컨텐츠보기 등을 통해 세션 관련 문제를 효과적으로 진단하고 해결할 수 있습니다.

Session_Start ()로 여러 통화를하면 경고 메시지와 가능한 데이터 덮어 쓰기가 발생합니다. 1) PHP는 세션이 시작되었다는 경고를 발행합니다. 2) 세션 데이터의 예상치 못한 덮어 쓰기를 유발할 수 있습니다. 3) Session_status ()를 사용하여 반복 통화를 피하기 위해 세션 상태를 확인하십시오.

SESSION.GC_MAXLIFETIME 및 SESSION.COOKIE_LIFETIME을 설정하여 PHP에서 세션 수명을 구성 할 수 있습니다. 1) SESSION.GC_MAXLIFETIME 서버 측 세션 데이터의 생존 시간을 제어합니다. 2) 세션 .Cookie_Lifetime 클라이언트 쿠키의 수명주기를 제어합니다. 0으로 설정하면 브라우저가 닫히면 쿠키가 만료됩니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

MinGW - Windows용 미니멀리스트 GNU
이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기

VSCode Windows 64비트 다운로드
Microsoft에서 출시한 강력한 무료 IDE 편집기

SublimeText3 Linux 새 버전
SublimeText3 Linux 최신 버전

DVWA
DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는
