PHP/SQL数据库查询的良好做法和安全
-
05-07-2019 - |
题
所以我是个稍有经验丰富的php developer和已经干什么该死的事情'自2007年;然而,我仍然相对较n00bish当谈到保护我的应用。我真的不知道我知道的一切,我可以和应该。
我已经拿起了 确保PHP网应用程序 我读我的方式,通过其试验的事情了。我有一些问题大使小组,涉及到数据库查询(主要是在mysql):
当创建的应用程序,把数据的数据库是mysql_real_escape_string和一般检查(is_numeric等)上输入的数据不够?那么其他类型的攻击不同sql注射。
可能有人解释存储程序和准备好的发言一点的更多信息,比-你让他们打电话给他们。我想知道他们是如何工作的,什么样的验证在幕后。
我工作中的一个。php4定环境和php5不是一个选项。有任何其他人已经在这之前的位置,你做了什么来保护您的应用程序,同时所有的酷小孩都在使用那甜美的新)的预口?
什么是一些一般性的良好做法的人已经发现是有利的,重点放在创建一个基础设施的承受能力升级和可能的迁移(如移动。php4到php5).
注:有一个搜索周围找不到任何与此类似,打php-mysql安全。
解决方案
我建议:
- 沟)的预赞成 公设辩护人 (mysql驾驶员)
- 使用公设辩护人paremeterized准备好的发言
然后你可以做些什么,如:
$pdo_obj = new PDO( 'mysql:server=localhost; dbname=mydatabase',
$dbusername, $dbpassword );
$sql = 'SELECT column FROM table WHERE condition=:condition';
$params = array( ':condition' => 1 );
$statement = $pdo_obj->prepare( $sql,
array( PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY ) );
$statement->execute( $params );
$result = $statement->fetchAll( PDO::FETCH_ASSOC );
赞成:
- 没有更多的手逃离,因为公设辩护人都是为你!
- 这是相对容易地交换数据库的后台突然。
缺点:
- 我想不出任何。
其他提示
哈维尔的答案有异链接,是一个良好的开端。
有一些更多的事情可以做得更多:
关于SQL注射攻击,你可以写一个功能,将删除共同SQL发言输入等"下降"或"删除*在哪里",是这样的:
*$sqlarray=array("拉"、"或1=1","联盟选择","SELECT*from","选择host","create table","用户"、"用户");*
然后写的功能,将检查你的输入对这一阵列。确保任何的东西内部$sqlarray不会是共同的输入从你的用户。(不要忘记使用strtolower在这的,谢谢卢).
我不知道,如果缓存works with PHP4但是你可以把一些垃圾邮件的保护与缓存通过只允许一定的远程IP访问process.php X页量的时间在Y的时间段。
权限是重要的。如果你只需要插入权限(所说,为了处理),然后你应该登录入数据库的订购过程中的页面的用户,只有刀和可能的选择权限。这意味着,即使一个SQL注得到通过,他们只能执行插入/选择的查询,而不是删除或重组。
把重要的php处理的文件目录中的,例如/包括。然后禁止所有IPs访问,包括目录。
把盐渍MD5与用户的代理+remoteip+你的盐在的用户会议,并使它的验证在每一页上载正确的MD5是在他们的cookie。
禁止某些标题(http://www.owasp.org/index.php/Testing_for_HTTP_Methods_and_XST).不允许把(如果你不需要文件上载)/追踪/连/删除标题。
我通常不使用PHP,因此我无法提供专门针对您的要求的建议,但我建议您查看OWASP页面,特别是前10个漏洞报告: http://www.owasp.org/index.php/Top_10_2007
在该页面中,针对每个漏洞,您将获得可以避免不同平台(.Net,Java,PHP等)中的问题的列表。
关于准备好的语句,它们的工作原理是让数据库引擎知道在特定查询期间有多少参数和类型,使用这些信息引擎可以理解哪些字符是实际参数的一部分而不应该是什么被解析为SQL,就像'(撇号)作为数据的一部分而不是'作为字符串分隔符。抱歉,我无法提供针对PHP的更多信息,但希望这会有所帮助。
AFAIK,PHP / mySQL通常没有参数化查询。
使用 sprintf()
和 mysql_real_escape_string()
应该可以很好地工作。如果您为 sprintf()
使用适当的格式字符串(例如,对于整数使用“%d”),那么您应该非常安全。
我可能错了,但不应该使用 mysql_real_escape_string
关于用户提供的数据?
除非它们是数字,在这种情况下,你应该确保它们实际上是数字,而不是使用例如 ctype_digit
或 is_numeric
或 sprintf
(使用%d
或%u
强制输入数字。)
另外,为你的php脚本提供一个只能选择SELECT,INSERT,UPDATE和DELETE的serarate mysql用户可能是一个好主意......
来自php.net的示例
示例#3 A“最佳实践”查询
在每个变量周围使用mysql_real_escape_string()可以防止SQL注入。该示例演示了“最佳实践”。查询数据库的方法,独立于Magic Quotes设置。
现在可以正确执行查询,并且SQL注入攻击无效。
<?php if (isset(
我可能错了,但不应该使用
mysql_real_escape_string
关于用户提供的数据?除非它们是数字,在这种情况下,你应该确保它们实际上是数字,而不是使用例如
ctype_digit
或is_numeric
或sprintf
(使用%d
或%u
强制输入数字。)另外,为你的php脚本提供一个只能选择SELECT,INSERT,UPDATE和DELETE的serarate mysql用户可能是一个好主意......
来自php.net的示例
POST['product_name']) && isset(示例#3 A“最佳实践”查询
在每个变量周围使用mysql_real_escape_string()可以防止SQL注入。该示例演示了“最佳实践”。查询数据库的方法,独立于Magic Quotes设置。
现在可以正确执行查询,并且SQL注入攻击无效。
<*>我可能错了,但不应该使用
mysql_real_escape_string
关于用户提供的数据?除非它们是数字,在这种情况下,你应该确保它们实际上是数字,而不是使用例如
ctype_digit
或is_numeric
或sprintf
(使用%d
或%u
强制输入数字。)另外,为你的php脚本提供一个只能选择SELECT,INSERT,UPDATE和DELETE的serarate mysql用户可能是一个好主意......
来自php.net的示例
POST['product_description']) && isset(示例#3 A“最佳实践”查询
在每个变量周围使用mysql_real_escape_string()可以防止SQL注入。该示例演示了“最佳实践”。查询数据库的方法,独立于Magic Quotes设置。
现在可以正确执行查询,并且SQL注入攻击无效。
<*>我可能错了,但不应该使用
mysql_real_escape_string
关于用户提供的数据?除非它们是数字,在这种情况下,你应该确保它们实际上是数字,而不是使用例如
ctype_digit
或is_numeric
或sprintf
(使用%d
或%u
强制输入数字。)另外,为你的php脚本提供一个只能选择SELECT,INSERT,UPDATE和DELETE的serarate mysql用户可能是一个好主意......
来自php.net的示例
POST['user_id'])) { // Connect $link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password'); if(!is_resource($link)) { echo "Failed to connect to the server\n"; // ... log the error properly } else { // Reverse magic_quotes_gpc/magic_quotes_sybase effects on those vars if ON. if(get_magic_quotes_gpc()) { $product_name = stripslashes(示例#3 A“最佳实践”查询
在每个变量周围使用mysql_real_escape_string()可以防止SQL注入。该示例演示了“最佳实践”。查询数据库的方法,独立于Magic Quotes设置。
现在可以正确执行查询,并且SQL注入攻击无效。
<*>我可能错了,但不应该使用
mysql_real_escape_string
关于用户提供的数据?除非它们是数字,在这种情况下,你应该确保它们实际上是数字,而不是使用例如
ctype_digit
或is_numeric
或sprintf
(使用%d
或%u
强制输入数字。)另外,为你的php脚本提供一个只能选择SELECT,INSERT,UPDATE和DELETE的serarate mysql用户可能是一个好主意......
来自php.net的示例
POST['product_name']); $product_description = stripslashes(示例#3 A“最佳实践”查询
在每个变量周围使用mysql_real_escape_string()可以防止SQL注入。该示例演示了“最佳实践”。查询数据库的方法,独立于Magic Quotes设置。
现在可以正确执行查询,并且SQL注入攻击无效。
<*>我可能错了,但不应该使用
mysql_real_escape_string
关于用户提供的数据?除非它们是数字,在这种情况下,你应该确保它们实际上是数字,而不是使用例如
ctype_digit
或is_numeric
或sprintf
(使用%d
或%u
强制输入数字。)另外,为你的php脚本提供一个只能选择SELECT,INSERT,UPDATE和DELETE的serarate mysql用户可能是一个好主意......
来自php.net的示例
POST['product_description']); } else { $product_name =示例#3 A“最佳实践”查询
在每个变量周围使用mysql_real_escape_string()可以防止SQL注入。该示例演示了“最佳实践”。查询数据库的方法,独立于Magic Quotes设置。
现在可以正确执行查询,并且SQL注入攻击无效。
<*>我可能错了,但不应该使用
mysql_real_escape_string
关于用户提供的数据?除非它们是数字,在这种情况下,你应该确保它们实际上是数字,而不是使用例如
ctype_digit
或is_numeric
或sprintf
(使用%d
或%u
强制输入数字。)另外,为你的php脚本提供一个只能选择SELECT,INSERT,UPDATE和DELETE的serarate mysql用户可能是一个好主意......
来自php.net的示例
POST['product_name']; $product_description =示例#3 A“最佳实践”查询
在每个变量周围使用mysql_real_escape_string()可以防止SQL注入。该示例演示了“最佳实践”。查询数据库的方法,独立于Magic Quotes设置。
现在可以正确执行查询,并且SQL注入攻击无效。
<*>我可能错了,但不应该使用
mysql_real_escape_string
关于用户提供的数据?除非它们是数字,在这种情况下,你应该确保它们实际上是数字,而不是使用例如
ctype_digit
或is_numeric
或sprintf
(使用%d
或%u
强制输入数字。)另外,为你的php脚本提供一个只能选择SELECT,INSERT,UPDATE和DELETE的serarate mysql用户可能是一个好主意......
来自php.net的示例
POST['product_description']; } // Make a safe query $query = sprintf("INSERT INTO products (`name`, `description`, `user_id`) VALUES ('%s', '%s', %d)", mysql_real_escape_string($product_name, $link), mysql_real_escape_string($product_description, $link),示例#3 A“最佳实践”查询
在每个变量周围使用mysql_real_escape_string()可以防止SQL注入。该示例演示了“最佳实践”。查询数据库的方法,独立于Magic Quotes设置。
现在可以正确执行查询,并且SQL注入攻击无效。
<*>我可能错了,但不应该使用
mysql_real_escape_string
关于用户提供的数据?除非它们是数字,在这种情况下,你应该确保它们实际上是数字,而不是使用例如
ctype_digit
或is_numeric
或sprintf
(使用%d
或%u
强制输入数字。)另外,为你的php脚本提供一个只能选择SELECT,INSERT,UPDATE和DELETE的serarate mysql用户可能是一个好主意......
来自php.net的示例
POST['user_id']); mysql_query($query, $link); if (mysql_affected_rows($link) > 0) { echo "Product inserted\n"; } } } else { echo "Fill the form properly\n"; }示例#3 A“最佳实践”查询
在每个变量周围使用mysql_real_escape_string()可以防止SQL注入。该示例演示了“最佳实践”。查询数据库的方法,独立于Magic Quotes设置。
现在可以正确执行查询,并且SQL注入攻击无效。
<*>
对任何涉及写入数据库的活动使用存储过程,并对所有选择使用绑定参数。