可能重复:
防止PHP 中SQL注入的最佳方法
我刚刚发现我的网站是脆弱的。
由于它连接到数据库,并且具有以下功能:注册、更改密码、通知等…以及SUPOSING,因此它完全易受攻击
我应该在代码中查找什么才能开始使其安全?
我的意思是,我做了一些研究,在任何地方,每个人都对安全有不同的看法。
"使用PDO。"
"使用mysql_real_sescape_string。"
"使用斜杠。"
我到底应该找什么
"$_POST" and "$_GET" variables??
"$_SESSION" variables?
SQL查询
$sql = "select * from user";
$sql = "update user set user="new_user_name";
$sql = "insert into user (user) values ('userid')";
在每种情况下我应该怎么做?请帮我知道我必须去什么地方。
谢谢。
以下是制作安全php应用程序需要考虑的要点。
- 使用PDO或mysqli
- 永远不要相信任何输入。考虑每个变量,即$_POST、$_GET、$_COOKIE、$_SESSION、$_SERVER,就好像它们被污染了一样。对这些变量使用适当的筛选措施
- 为了避免XSS攻击,请使用php的内置函数htmlentities,strip_tag等,同时将用户输入数据插入数据库
- 禁用PHP中的Register Globals。INI
- 在PHP中禁用"allow_url_fopen"。INI
- 不允许用户输入超过要求的数据。验证输入到允许最大字符数。同时验证的每个字段相关数据类型
- 在开发期后禁用错误报告。它可能会对黑客有用的数据库信息
- 张贴表单时使用一次性令牌。如果令牌存在并且匹配表单帖子有效,否则无效
- 使用参数化数据库查询
- 使用存储过程
你可以在谷歌上搜索每一点以了解更多细节。HOpe这有助于
您应该查找的内容:从客户端/用户发送的任何数据。对该数据进行消毒/转义。
PDO可以净化查询(使用PDO::prepare)并支持多个SQL系统。
对于MySQL,请使用MySQLi。mysqli_real_escape_string
是在使用MySQL时用于清理数据的函数。
您提供的SQL查询实际上都不易受到SQL注入的攻击。
SQL注入漏洞的发生是因为SQL输入未正确转义。
例如:
$sql = "select * from users where user_id =" . $_GET['user_id'];
考虑一下我是否通过了以下考试:
http://some_server.com/some_page.php?user_id=123%20or%201=1
执行时的查询最终为:
select * from users where user_id = 123 or 1=1
要解决此问题,请使用参数化查询:
$query = "select * from users where user_id = ?"
当您将user_id值绑定到查询时,数据访问层将正确地转义输入字符串,并执行以下操作:
select * from users where user_id = '123 or 1=1' which would not return any rows, preventing the injection
如果使用PHP和mysql扩展:
$sql = "select * from users where user_id = '" . mysql_real_escape_string($_GET['user_id']) . "'";
请记住,您需要转义进入SQL查询的所有输入:
$sql = "select id_column from some_table where id = 1";
$stmt = mysqli_query($conn, $sql);
if($stmt === false) die(mysqli_error($conn) . "'n");
while($row = mysqli_fetch_assoc($conn, $stmt) {
$sql = "update some_other_table set some_value = 'new value' where some_column = '" . mysqli_real_escape_string($conn, $row['id_column']) . "'";
....
}
这是因为从数据库中选择的值可能包含在SQL语句中执行不安全的字符,如名称"O'Hara"或示例。}
我一直在使用PDO。
在你的例子中:
<?php
$stmt = $dbh->prepare("insert into user (user) values (?)");
$stmt->bindParam(1, $name);
$name = 'ValueHere';
$stmt->execute();
?>