当前位置: 首页 > news >正文

代刷网站推广链接0元价格免费网站自动跳转

代刷网站推广链接0元价格,免费网站自动跳转,泰安刘明是怎么挨办的,wordpress小工具编辑器PHP 安全编程建议 简介 要提供互联网服务#xff0c;当你在开发代码的时候必须时刻保持安全意识。可能大部分 PHP 脚本都对安全问题都不在意#xff0c;这很大程度上是因为有大量的无经验程序员在使用这门语言。但是#xff0c;没有理由让你因为对你的代码的不确定性而导致不… PHP 安全编程建议 简介 要提供互联网服务当你在开发代码的时候必须时刻保持安全意识。可能大部分 PHP 脚本都对安全问题都不在意这很大程度上是因为有大量的无经验程序员在使用这门语言。但是没有理由让你因为对你的代码的不确定性而导致不一致的安全策略。当你在服务器上放任何涉及到钱的东西时就有可能会有人尝试破解它。创建一个论坛程序或者任何形式的购物车被攻击的可能性就上升到了无穷大。 背景 为了确保你的 web 内容安全这里有一些常规的安全准则 别相信表单 攻击表单很简单。通过使用一个简单的 JavaScript 技巧你可以限制你的表单只允许在评分域中填写 1 到 5 的数字。如果有人关闭了他们浏览器的 JavaScript 功能或者提交自定义的表单数据你客户端的验证就失败了。 用户主要通过表单参数和你的脚本交互因此他们是最大的安全风险。你应该学到什么呢在 PHP 脚本中总是要验证 传递给任何 PHP 脚本的数据。在本文中我们向你演示了如何分析和防范跨站脚本XSS攻击它可能会劫持用户凭据甚至更严重。你也会看到如何防止会玷污或毁坏你数据的 MySQL 注入攻击。 别相信用户 假定你网站获取的每一份数据都充满了有害的代码。清理每一部分即便你相信没有人会尝试攻击你的站点。 关闭全局变量 你可能会有的最大安全漏洞是启用了 register_globals 配置参数。幸运的是PHP 4.2 及以后版本默认关闭了这个配置。如果打开了 register_globals你可以在你的 php.ini 文件中通过改变 register_globals 变量为 Off 关闭该功能 register_globals Off 新手程序员觉得注册全局变量很方便但他们不会意识到这个设置有多么危险。一个启用了全局变量的服务器会自动为全局变量赋任何形式的参数。为了了解它如何工作以及为什么有危险让我们来看一个例子。 假设你有一个称为 process.php 的脚本它会向你的数据库插入表单数据。初始的表单像下面这样 input nameusername typetext size15 maxlength64 运行 process.php 的时候启用了注册全局变量的 PHP 会将该参数赋值到 $username 变量。这会比通过 $_POST[username] 或$_GET[username] 访问它节省击键次数。不幸的是这也会给你留下安全问题因为 PHP 会设置该变量的值为通过 GET 或 POST 的参数发送到脚本的任何值如果你没有显示地初始化该变量并且你不希望任何人去操作它这就会有一个大问题。 看下面的脚本假如 $authorized 变量的值为 true它会给用户显示通过验证的数据。正常情况下只有当用户正确通过了这个假想的 authenticated_user() 函数验证$authorized 变量的值才会被设置为真。但是如果你启用了register_globals任何人都可以发送一个 GET 参数例如 authorized1 去覆盖它 ?php // Define $authorized true only if user is authenticated if (authenticated_user()) {$authorized true; } ? 这个故事的寓意是你应该从预定义的服务器变量中获取表单数据。所有通过 post 表单传递到你 web 页面的数据都会自动保存到一个称为 $_POST 的大数组中所有的 GET 数据都保存在$_GET 大数组中。文件上传信息保存在一个称为$_FILES 的特殊数据中。另外还有一个称为$_REQUEST 的复合变量。 要从一个 POST 方法表单中访问 username 字段可以使用 $_POST[username]。如果 username 在 URL 中就使用$_GET[username]。如果你不确定值来自哪里用$_REQUEST[username]。 ?php $post_value $_POST[post_value]; $get_value $_GET[get_value]; $some_variable $_REQUEST[some_value]; ? $_REQUEST 是 $_GET、$_POST、和 $_COOKIE 数组的结合。如果你有两个或多个值有相同的参数名称注意 PHP 会使用哪个。默认的顺序是 cookie、POST、然后是 GET。 推荐安全配置选项 这里有几个会影响安全功能的 PHP 配置设置。下面是一些显然应该用于生产服务器的 register_globals 设置为 offsafe_mode 设置为 offerror_reporting 设置为 off。如果出现错误了这会向用户浏览器发送可见的错误报告信息。对于生产服务器使用错误日志代替。开发服务器如果在防火墙后面就可以启用错误日志。LCTT 译注此处据原文逻辑和常识应该是“开发服务器如果在防火墙后面就可以启用错误报告即 on。”停用这些函数system()、exec()、passthru()、shell_exec()、proc_open()、和 popen()。open_basedir 为 /tmp以便保存会话信息目录和 web 根目录以便脚本不能访问这些选定区域外的文件。expose_php 设置为 off。该功能会向 Apache 头添加包含版本号的 PHP 签名。allow_url_fopen 设置为 off。如果你能够注意你代码中访问文件的方式-也就是你验证所有输入参数这并不严格需要。allow_url_include 设置为 off。对于任何人来说实在没有明智的理由会想要访问通过 HTTP 包含的文件。 一般来说如果你发现想要使用这些功能的代码你就不应该相信它。尤其要小心会使用类似 system() 函数的代码-它几乎肯定有缺陷。 启用了这些设置后让我们来看看一些特定的攻击以及能帮助你保护你服务器的方法。 SQL 注入攻击 由于 PHP 传递到 MySQL 数据库的查询语句是用强大的 SQL 编程语言编写的就有了某些人通过在 web 查询参数中使用 MySQL 语句尝试 SQL 注入攻击的风险。通过在参数中插入有害的 SQL 代码片段攻击者会尝试进入或破坏你的服务器。 假如说你有一个最终会放入变量 $product 的表单参数你使用了类似下面的 SQL 语句 $sql select * from pinfo where product $product; 如果参数是直接从表单中获得的应该使用 PHP 自带的数据库特定转义函数类似 $sql Select * from pinfo where product mysql_real_escape_string($product) . ; 如果不这样做的话有人也许会把下面的代码段放到表单参数中 39; DROP pinfo; SELECT FOO 那么 $sql 的结果就是 select product from pinfo where product 39; DROP pinfo; SELECT FOO 由于分号是 MySQL 的语句分隔符数据库会运行下面三条语句 select * from pinfo where product 39 DROP pinfo SELECT FOO 好了你丢失了你的表。 注意实际上 PHP 和 MySQL 不会运行这种特殊语法因为 mysql_query() 函数只允许每个请求处理一个语句。但是一个子查询仍然会生效。 要防止 SQL 注入攻击做这两件事 总是验证所有参数。例如如果需要一个数字就要确保它是一个数字。总是对数据使用 mysql_real_escape_string() 函数转义数据中的任何引号和双引号。 注意要自动转义任何表单数据可以启用魔术引号Magic Quotes。 一些 MySQL 破坏可以通过限制 MySQL 用户权限避免。任何 MySQL 账户可以限制为只允许对选定的表进行特定类型的查询。例如你可以创建只能选择行的 MySQL 用户。但是这对于动态数据并不十分有用另外如果你有敏感的用户信息可能某些人能访问其中一些数据但你并不希望如此。例如一个访问账户数据的用户可能会尝试注入访问另一个人的账户号码的代码而不是为当前会话指定的号码。 防止基本的 XSS 攻击 XSS 表示跨站脚本。不像大部分攻击该漏洞发生在客户端。XSS 最常见的基本形式是在用户提交的内容中放入 JavaScript 以便偷取用户 cookie 中的数据。由于大部分站点使用 cookie 和 session 验证访客偷取的数据可用于模拟该用户-如果是一个常见的用户账户就会深受麻烦如果是管理员账户甚至是彻底的惨败。如果你不在站点中使用 cookie 和 session ID你的用户就不容易被攻击但你仍然应该明白这种攻击是如何工作的。 不像 MySQL 注入攻击XSS 攻击很难预防。Yahoo、eBay、Apple、以及 Microsoft 都曾经受 XSS 影响。尽管攻击不包含 PHP但你可以使用 PHP 来剥离用户数据以防止攻击。为了防止 XSS 攻击你应该限制和过滤用户提交给你站点的数据。正是因为这个原因大部分在线公告板都不允许在提交的数据中使用 HTML 标签而是用自定义的标签格式代替例如[b] 和[linkto]。 让我们来看一个如何防止这类攻击的简单脚本。对于更完善的解决办法可以使用 SafeHTML本文的后面部分会讨论到。 function transform_HTML($string, $length null) { // Helps prevent XSS attacks// Remove dead space.$string trim($string);// Prevent potential Unicode codec problems.$string utf8_decode($string);// HTMLize HTML-specific characters.$string htmlentities($string, ENT_NOQUOTES);$string str_replace(#, #, $string);$string str_replace(%, %, $string);$length intval($length);if ($length 0) {$string substr($string, 0, $length);}return $string; } 这个函数将 HTML 特定的字符转换为 HTML 字面字符。一个浏览器对任何通过这个脚本的 HTML 以非标记的文本呈现。例如考虑下面的 HTML 字符串 STRONGBold Text/STRONG 一般情况下HTML 会显示为Bold Text 但是通过 transform_HTML() 后它就像原始输入一样呈现。原因是处理的字符串中的标签字符串转换为 HTML 实体。transform_HTML() 的结果字符串的纯文本看起来像下面这样 STRONGBold Text/STRONG 该函数的实质是 htmlentities() 函数调用它会将 、、和 转换为 、、和。尽管这会处理大部分的普通攻击但有经验的 XSS 攻击者有另一种把戏用十六进制或 UTF-8 编码恶意脚本而不是采用普通的 ASCII 文本从而希望能绕过你的过滤器。他们可以在 URL 的 GET 变量中发送代码告诉浏览器“这是十六进制代码你能帮我运行吗” 一个十六进制例子看起来像这样 a hrefhttp://host/a.php?variable%22%3e %3c%53%43%52%49%50%54%3e%44%6f%73%6f%6d%65%74%68%69%6e%67%6d%61%6c%69%63%69%6f%75%73%3c%2f%53%43%52%49%50%54%3e 浏览器渲染这个信息的时候结果就是 a hrefhttp://host/a.php?variable SCRIPTDosomethingmalicious/SCRIPT 为了防止这种情况transform_HTML() 采用额外的步骤把 # 和 % 符号转换为它们的实体从而避免十六进制攻击并转换 UTF-8 编码的数据。 最后为了防止某些人用很长的输入超载字符串从而导致某些东西崩溃你可以添加一个可选的 $length 参数来截取你指定最大长度的字符串。 使用 SafeHTML 之前脚本的问题比较简单它不允许任何类型的用户标记。不幸的是这里有上百种方法能使 JavaScript 跳过用户的过滤器并且要从用户输入中剥离全部 HTML还没有方法可以防止这种情况。 当前没有任何一个脚本能保证无法被破解尽管有一些确实比大部分要好。有白名单和黑名单两种方法加固安全白名单比较简单而且更加有效。 一个白名单解决方案是 PixelApes 的 SafeHTML 反跨站脚本解析器。 SafeHTML 能识别有效 HTML能追踪并剥离任何危险标签。它用另一个称为 HTMLSax 的软件包进行解析。 按照下面步骤安装和使用 SafeHTML 到 http://pixel-apes.com/safehtml/?pagesafehtml 下载最新版本的 SafeHTML。把文件放到你服务器的类文件夹。该文件夹包括 SafeHTML 和 HTMLSax 功能所需的所有东西。在脚本中 include SafeHTML 类文件safehtml.php。创建一个名为 $safehtml 的新 SafeHTML 对象。用 $safehtml-parse() 方法清理你的数据。 这是一个完整的例子 ?php /* If youre storing the HTMLSax3.php in the /classes directory, alongwith the safehtml.php script, define XML_HTMLSAX3 as a null string. */ define(XML_HTMLSAX3, ); // Include the class file. require_once(classes/safehtml.php); // Define some sample bad code. $data This data would raise an alert ; // Create a safehtml object. $safehtml new safehtml(); // Parse and sanitize the data. $safe_data $safehtml-parse($data); // Display result. echo The sanitized data is . $safe_data; ? 如果你想清理脚本中的任何其它数据你不需要创建一个新的对象在你的整个脚本中只需要使用 $safehtml-parse() 方法。 什么可能会出现问题 你可能犯的最大错误是假设这个类能完全避免 XSS 攻击。SafeHTML 是一个相当复杂的脚本几乎能检查所有事情但没有什么是能保证的。你仍然需要对你的站点做参数验证。例如该类不能检查给定变量的长度以确保能适应数据库的字段。它也不检查缓冲溢出问题。 XSS 攻击者很有创造力他们使用各种各样的方法来尝试达到他们的目标。可以阅读 RSnake 的 XSS 教程http://ha.ckers.org/xss.html 看一下这里有多少种方法尝试使代码跳过过滤器。SafeHTML 项目有很好的程序员一直在尝试阻止 XSS 攻击但无法保证某些人不会想起一些奇怪和新奇的方法来跳过过滤器。 注意XSS 攻击严重影响的一个例子 http://namb.la/popular/tech.html其中显示了如何一步一步创建一个让 MySpace 服务器过载的 JavaScript XSS 蠕虫。 用单向哈希保护数据 该脚本对输入的数据进行单向转换换句话说它能对某人的密码产生哈希签名但不能解码获得原始密码。为什么你希望这样呢应用程序会存储密码。一个管理员不需要知道用户的密码事实上只有用户知道他/她自己的密码是个好主意。系统也仅有系统应该能识别一个正确的密码这是 Unix 多年来的密码安全模型。单向密码安全按照下面的方式工作 当一个用户或管理员创建或更改一个账户密码时系统对密码进行哈希并保存结果。主机系统会丢弃明文密码。当用户通过任何方式登录到系统时再次对输入的密码进行哈希。主机系统丢弃输入的明文密码。当前新哈希的密码和之前保存的哈希相比较。如果哈希的密码相匹配系统就会授予访问权限。 主机系统完成这些并不需要知道原始密码事实上原始密码完全无所谓。一个副作用是如果某人侵入系统并盗取了密码数据库入侵者会获得很多哈希后的密码但无法把它们反向转换为原始密码。当然给足够时间、计算能力以及弱用户密码一个攻击者还是有可能采用字典攻击找出密码。因此别轻易让人碰你的密码数据库如果确实有人这样做了让每个用户更改他们的密码。 加密 Vs 哈希 技术上来来说哈希过程并不是加密。哈希和加密是不同的这有两个理由 不像加密哈希数据不能被解密。 是有可能但非常罕见两个不同的字符串会产生相同的哈希。并不能保证哈希是唯一的因此别像数据库中的唯一键那样使用哈希。 function hash_ish($string) {return md5($string); } 上面的 md5() 函数基于 RSA 数据安全公司的消息摘要算法即 MD5返回一个由 32 个字符组成的十六进制串。然后你可以将那个 32 位字符串插入到数据库中和另一个 md5 字符串相比较或者直接用这 32 个字符。 破解脚本 几乎不可能解密 MD5 数据。或者说很难。但是你仍然需要好的密码因为用一整个字典生成哈希数据库仍然很简单。有一些在线 MD5 字典当你输入 06d80eb0c50b49a509b49f2424e8c805 后会得到结果 “dog”。因此尽管技术上 MD5 不能被解密这里仍然有漏洞如果某人获得了你的密码数据库你可以肯定他们肯定会使用 MD5 字典破译。因此当你创建基于密码的系统的时候尤其要注意密码长度最小 6 个字符8 个或许会更好和包括字母和数字。并确保这个密码不在字典中。 用 Mcrypt 加密数据 如果你不需要以可阅读形式查看密码采用 MD5 就足够了。不幸的是这里并不总是有可选项如果你提供以加密形式存储某人的信用卡信息你可能需要在后面的某个地方进行解密。 最早的一个解决方案是 Mcrypt 模块这是一个用于允许 PHP 高速加密的插件。Mcrypt 库提供了超过 30 种用于加密的计算方法并且提供口令确保只有你或者你的用户可以解密数据。 让我们来看看使用方法。下面的脚本包含了使用 Mcrypt 加密和解密数据的函数 ?php $data Stuff you want encrypted; $key Secret passphrase used to encrypt your data; $cipher MCRYPT_SERPENT_256; $mode MCRYPT_MODE_CBC; function encrypt($data, $key, $cipher, $mode) { // Encrypt data return (string)base64_encode(mcrypt_encrypt($cipher,substr(md5($key),0,mcrypt_get_key_size($cipher, $mode)),$data,$mode,substr(md5($key),0,mcrypt_get_block_size($cipher, $mode)))); } function decrypt($data, $key, $cipher, $mode) { // Decrypt datareturn (string)mcrypt_decrypt($cipher,substr(md5($key),0,mcrypt_get_key_size($cipher, $mode)),base64_decode($data),$mode,substr(md5($key),0,mcrypt_get_block_size($cipher, $mode))); } ? mcrypt() 函数需要几个信息 需要加密的数据用于加密和解锁数据的口令也称为键。用于加密数据的计算方法也就是用于加密数据的算法。该脚本使用了 MCRYPT_SERPENT_256但你可以从很多算法中选择包括MCRYPT_TWOFISH192、MCRYPT_RC2、MCRYPT_DES、和MCRYPT_LOKI97。加密数据的模式。这里有几个你可以使用的模式包括电子密码本Electronic Codebook 和加密反馈Cipher Feedback。该脚本使用MCRYPT_MODE_CBC 密码块链接。一个 初始化向量-也称为 IV 或者种子用于为加密算法设置种子的额外二进制位。也就是使算法更难于破解的额外信息。键和 IV 字符串的长度这可能随着加密和块而不同。使用 mcrypt_get_key_size() 和 mcrypt_get_block_size() 函数获取合适的长度然后用 substr() 函数将键的值截取为合适的长度。如果键的长度比要求的短别担心Mcrypt 会用 0 填充。 如果有人窃取了你的数据和短语他们只能一个个尝试加密算法直到找到正确的那一个。因此在使用它之前我们通过对键使用 md5() 函数增加安全就算他们获取了数据和短语入侵者也不能获得想要的东西。 入侵者同时需要函数数据和口令如果真是如此他们可能获得了对你服务器的完整访问你只能大清洗了。 这里还有一个数据存储格式的小问题。Mcrypt 以难懂的二进制形式返回加密后的数据这使得当你将其存储到 MySQL 字段的时候可能出现可怕错误。因此我们使用base64encode() 和base64decode() 函数转换为和 SQL 兼容的字母格式和可检索行。 破解脚本 除了实验多种加密方法你还可以在脚本中添加一些便利。例如不用每次都提供键和模式而是在包含的文件中声明为全局常量。 生成随机密码 随机但难以猜测字符串在用户安全中很重要。例如如果某人丢失了密码并且你使用 MD5 哈希你不可能也不希望查找回来。而是应该生成一个安全的随机密码并发送给用户。为了访问你站点的服务另外一个用于生成随机数字的应用程序会创建有效链接。下面是创建密码的一个函数 ?phpfunction make_password($num_chars) {if ((is_numeric($num_chars)) ($num_chars 0) (! is_null($num_chars))) {$password ;$accepted_chars abcdefghijklmnopqrstuvwxyz1234567890;// Seed the generator if necessary.srand(((int)((double)microtime()*1000003)) );for ($i0; $i$num_chars; $i) {$random_number rand(0, (strlen($accepted_chars) -1));$password . $accepted_chars[$random_number] ;}return $password;} } ? 使用脚本 make_password() 函数返回一个字符串因此你需要做的就是提供字符串的长度作为参数 ?php $fifteen_character_password make_password(15); ? 函数按照下面步骤工作 函数确保 $num_chars 是非零的正整数。函数初始化 $accepted_chars 变量为密码可能包含的字符列表。该脚本使用所有小写字母和数字 0 到 9但你可以使用你喜欢的任何字符集合。LCTT 译注有时候为了便于肉眼识别你可以将其中的 0 和 O1 和 l 之类的都去掉。随机数生成器需要一个种子从而获得一系列类随机值PHP 4.2 及之后版本中并不需要会自动播种。函数循环 $num_chars 次每次迭代生成密码中的一个字符。对于每个新字符脚本查看 $accepted_chars 的长度选择 0 和长度之间的一个数字然后添加 $accepted_chars 中该数字为索引值的字符到 $password。循环结束后函数返回 $password。
http://www.zqtcl.cn/news/376270/

相关文章:

  • 网站建设网页怎么排列顺序网站制作 用户登录系统
  • 音乐网站用什么语言做深圳网站排名优化公司
  • h5响应式网站建设方案南京做微网站
  • 建设班级网站首页查注册公司什么网站
  • 中小企业网站建设平台网站开发技术大学教材
  • 有四川建设人才网这个网站吗青岛外贸网站运营哪家好
  • 网站建设j介绍ppt模板注册企业公司流程及费用
  • 建网站多少费用设计公司推荐
  • 东莞市营销网站建设哪个推广网站好
  • 上海青浦房地产网站建设广西建设人才网
  • 做网站的网络公司税收优惠推广优化关键词
  • 找能做网站的怎么查看网站备案号
  • 石嘴山北京网站建设h5网站建设
  • 滨州区建设局网站中国建行官网首页
  • 网站建设服务网站网站建设销售实习
  • 网站注册都需要什么给装修公司做推广的网站
  • me域名的网站wordpress 扩展字段
  • 新开三端互通传奇网站企业推广方式有哪些
  • 怎么制作网站页面做理论的网站
  • 哪家公司做跳转网站wordpress 网页缩放
  • 小说网站建设的支柱深圳建设发展集团有限公司
  • 陕西高速公路建设网站做网站不用编程
  • wordpress网站秒开网站建设设计理念
  • html5 网站模板永久免费的仓库管理软件
  • 贵州网站seo厦门网站设计多少钱
  • 哈市哪里网站做的好合作网站seo
  • 找苏州网站建设网站维护提醒php文件
  • 哪些网站做推广效果好与市场营销有关的网站
  • 有什么网站可以做设计赚钱吗专业vi设计公司哪家强
  • 一般的网站是由什么语言做的网站建设怎么问问题