我刚发现我的网站很有用。
由于它连接到数据库并具有以下功能:注册,更改密码,通知等......并且使其完全易受攻击。
为了开始安全起见,我应该在代码中查找什么?
我的意思是,我做了一些研究,无处不在,每个人都说不同的安全问题。
“使用PDO。”
“使用mysql_real_escape_string。”
“使用addslashes。”
我到底应该寻找什么?
"$_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')";
每种情况下我该怎么办? 请帮助我知道我必须去哪里和哪里。
谢谢。
答案 0 :(得分:5)
以下是制作安全php应用程序时要考虑的要点。
您可以谷歌搜索每个点以获取更多详细信息。 HOpe这有帮助
答案 1 :(得分:1)
您应该寻找的内容:从客户端/用户发送的任何数据。清理/逃避此数据。
PDO可以清理查询(使用PDO::prepare)并支持多个SQL系统。
对于MySQL,请使用MySQLi。 mysqli_real_escape_string
是在使用MySQL时用于清理数据的函数。
答案 2 :(得分:1)
您提供的所有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”或示例。 }
答案 3 :(得分:0)
我一直在使用 PDO 。
在你的情况下的一个例子:
<?php
$stmt = $dbh->prepare("insert into user (user) values (?)");
$stmt->bindParam(1, $name);
$name = 'ValueHere';
$stmt->execute();
?>