nox-it / yii2-nox-curl
此包已被弃用且不再维护。未建议任何替代包。
Yii2 NYX cUrl
2.0.0
2020-05-02 01:03 UTC
Requires
- php: >=7.4.0
- nox-it/yii2-nox: ~2.0.0
- nox-it/yii2-nox-helpers: ~2.0.0
- php-curl-class/php-curl-class: ~8.8.0
README
NOX cUrl 是 PHP cURL 扩展的对象封装,它使发送 HTTP 请求和与 Web API 集成变得简单。此构建针对 Yii 框架版本 2,目前不会向主库(PHP cURL 类)添加任何功能,但添加了 \nox\request\helpers\CurlHelper
,它扩展了 Yii2 Base URL Helper 并实现了验证和管理 URL 的方法。
此扩展使用 Zach Borboa 的 PHP Curl Class 7.*。有关 PHP Curl Class 的更多详细信息,请参阅 php-curl-class/php-curl-class 或 www.phpcurlclass.com。
要求
PHP 5.4+。
安装
安装此扩展的首选方式是通过 composer。
运行
php composer.phar require --prefer-dist nox-it/yii2-nox-curl "*"
或将其添加到 composer.json
文件的 require 部分。
"nox-it/yii2-nox-curl": "*"
to the require section of your composer.json
file.
用法
基本示例
$request = new \nox\request\Curl(); $request->get('https://www.example.com/');
GET 示例
$request = new \nox\request\Curl(); $request->get('https://www.example.com/search', ['q' => 'keyword']);
POST 示例
$request = new \nox\request\Curl(); $request->post('https://www.example.com/login/', ['username' => 'myusername', 'password' => 'mypassword']);
带有错误处理的基本身份验证示例
$request = new \nox\request\Curl(); $request->setBasicAuthentication('username', 'password'); $request->setUserAgent('MyUserAgent/0.0.1 (+https://www.example.com/bot.html)'); $request->setReferrer('https://www.example.com/url?url=https%3A%2F%2Fwww.example.com%2F'); $request->setHeader('X-Requested-With', 'XMLHttpRequest'); $request->setCookie('key', 'value'); $request->get('https://www.example.com/'); if ($request->error) { echo "Error: {$request->errorCode}: {$request->errorMessage}"; } else { echo "Response: \n"; var_dump($request->response); } var_dump($request->requestHeaders); var_dump($request->responseHeaders);
setOpt 方法示例
$request = new \nox\request\Curl(); $request->setOpt(CURLOPT_FOLLOWLOCATION, true); $request->get('https://shortn.example.com/bHbVsP');
PUT 示例
$request = new \nox\request\Curl(); $request->put('https://api.example.com/user/', ['first_name' => 'Zach', 'last_name' => 'Borboa']);
PATCH 示例
$request = new \nox\request\Curl(); $request->patch('https://api.example.com/profile/', ['image' => '@path/to/file.jpg']);
$request = new \nox\request\Curl(); $request->patch('https://api.example.com/profile/', ['image' => new CURLFile('path/to/file.jpg')]);
DELETE 示例
$request = new \nox\request\Curl(); $request->delete('https://api.example.com/user/', ['id' => '1234']);
使用 GZIP 压缩下载示例
// Enable gzip compression and download a file. $request = new \nox\request\Curl(); $request->setOpt(CURLOPT_ENCODING , 'gzip'); $request->download('https://www.example.com/image.png', '/tmp/myimage.png');
// Case-insensitive access to headers. $request = new \nox\request\Curl(); $request->download('https://www.example.com/image.png', '/tmp/myimage.png'); echo $request->responseHeaders['Content-Type'] . "\n"; // image/png echo $request->responseHeaders['CoNTeNT-TyPE'] . "\n"; // image/png
$request->close();
\nox\request\Curl 可用方法
Curl::__construct($base_url = null) Curl::__destruct() Curl::__get($name) Curl::beforeSend($callback) Curl::buildPostData($data) Curl::call() Curl::close() Curl::complete($callback) Curl::delete($url, $query_parameters = array(), $data = array()) Curl::download($url, $mixed_filename) Curl::error($callback) Curl::exec($ch = null) Curl::get($url, $data = array()) Curl::getCookie($key) Curl::getInfo($opt) Curl::getOpt($option) Curl::getResponseCookie($key) Curl::head($url, $data = array()) Curl::headerCallback($ch, $header) Curl::options($url, $data = array()) Curl::patch($url, $data = array()) Curl::post($url, $data = array(), $follow_303_with_post = false) Curl::progress($callback) Curl::put($url, $data = array()) Curl::removeHeader($key) Curl::search($url, $data = array()) Curl::setBasicAuthentication($username, $password = '') Curl::setConnectTimeout($seconds) Curl::setCookie($key, $value) Curl::setCookieFile($cookie_file) Curl::setCookieJar($cookie_jar) Curl::setCookieString($string) Curl::setDefaultDecoder($decoder = 'json') Curl::setDefaultJsonDecoder() Curl::setDefaultTimeout() Curl::setDefaultUserAgent() Curl::setDefaultXmlDecoder() Curl::setDigestAuthentication($username, $password = '') Curl::setHeader($key, $value) Curl::setHeaders($headers) Curl::setJsonDecoder($function) Curl::setMaxFilesize($bytes) Curl::setOpt($option, $value) Curl::setOpts($options) Curl::setPort($port) Curl::setReferer($referer) Curl::setReferrer($referrer) Curl::setTimeout($seconds) Curl::setUrl($url, $data = array()) Curl::setUserAgent($user_agent) Curl::setXmlDecoder($function) Curl::success($callback) Curl::unsetHeader($key) Curl::verbose($on = true, $output = STDERR) Curl::array_flatten_multidim($array, $prefix = false) Curl::is_array_assoc($array) Curl::is_array_multidim($array)
\nox\request\MultiCurl 可用方法
MultiCurl::__construct($base_url = null) MultiCurl::__destruct() MultiCurl::addCurl(Curl $curl) MultiCurl::addDelete($url, $query_parameters = array(), $data = array()) MultiCurl::addDownload($url, $mixed_filename) MultiCurl::addGet($url, $data = array()) MultiCurl::addHead($url, $data = array()) MultiCurl::addOptions($url, $data = array()) MultiCurl::addPatch($url, $data = array()) MultiCurl::addPost($url, $data = array(), $follow_303_with_post = false) MultiCurl::addPut($url, $data = array()) MultiCurl::addSearch($url, $data = array()) MultiCurl::beforeSend($callback) MultiCurl::close() MultiCurl::complete($callback) MultiCurl::error($callback) MultiCurl::getOpt($option) MultiCurl::removeHeader($key) MultiCurl::setBasicAuthentication($username, $password = '') MultiCurl::setConcurrency($concurrency) MultiCurl::setConnectTimeout($seconds) MultiCurl::setCookie($key, $value) MultiCurl::setCookieFile($cookie_file) MultiCurl::setCookieJar($cookie_jar) MultiCurl::setCookieString($string) MultiCurl::setDigestAuthentication($username, $password = '') MultiCurl::setHeader($key, $value) MultiCurl::setHeaders($headers) MultiCurl::setJsonDecoder($function) MultiCurl::setOpt($option, $value) MultiCurl::setOpts($options) MultiCurl::setPort($port) MultiCurl::setReferer($referer) MultiCurl::setReferrer($referrer) MultiCurl::setTimeout($seconds) MultiCurl::setUrl($url) MultiCurl::setUserAgent($user_agent) MultiCurl::setXmlDecoder($function) MultiCurl::start() MultiCurl::success($callback) MultiCurl::unsetHeader($key) MultiCurl::verbose($on = true, $output = STDERR)
您可以在 https://github.com/php-curl-class/php-curl-class/tree/master/examples 找到更多示例。
安全注意事项
URL 可能指向系统文件
- 不要盲目接受用户提供的 URL,因为它们可能指向系统文件。Curl 支持许多协议,包括
FILE
。以下将显示file:///etc/passwd
的内容。
# Attacker. $ curl https://www.example.com/display_webpage.php?url=file%3A%2F%2F%2Fetc%2Fpasswd
// display_webpage.php $url = $_GET['url']; // DANGER! $request = new \nox\request\Curl(); $request->get($url); echo $request->response;
更安全的方法
$url = $_GET['url']; if (!\nox\request\helpers\CurlHelper::isValidUrl($url)) { die('Unsafe url detected.'); }
URL 可能指向内部 URL
- URL可能指向内部URL,包括防火墙后面的URL(例如:http://192.168.0.1/ 或 ftp://192.168.0.1/)。使用白名单允许某些URL而不是黑名单。
请求数据可能引用系统文件
- 以@字符为前缀的请求数据可能有特殊解释,并从系统文件中读取。
# Attacker. $ curl https://www.example.com/upload_photo.php --data "photo=@/etc/passwd"
// upload_photo.php $request = new \nox\request\Curl(); $request->post('http://www.anotherwebsite.com/', ['photo' => $_POST['photo']]); // DANGER!
启用重定向功能的不安全响应
- 启用重定向功能的请求可能返回来自意外来源的响应。下载 https://www.example.com/image.png 可能会重定向并下载 https://www.evil.com/virus.exe
$request = new \nox\request\Curl(); $request->setOpt(CURLOPT_FOLLOWLOCATION, true); // DANGER! $request->download('https://www.example.com/image.png', 'my_image.png');
保持SSL保护功能启用。
- 不要禁用SSL保护功能。
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); // DANGER! curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // DANGER!
基于以下文档: https://github.com/php-curl-class/php-curl-class/tree/master/SECURITY.md。
许可证
yii2-nox-curl 在BSD 3-Clause许可证下发布。有关详细信息,请参阅附带文件 LICENSE.md
。
要获取有关 PHP Curl类 许可证的更多信息,请参阅 php-curl-class/php-curl-class。